[CRIU] [PATCH v3] Add docker phaul driver

Pavel Emelyanov xemul at parallels.com
Wed Oct 21 08:32:39 PDT 2015


On 10/21/2015 05:14 PM, Hui Kang wrote:
> On Wed, Oct 21, 2015 at 8:23 AM, Pavel Emelyanov <xemul at parallels.com> wrote:
>>> diff --git a/phaul/p_haul_iters.py b/phaul/p_haul_iters.py
>>> index b2c76e3..f8b97db 100644
>>> --- a/phaul/p_haul_iters.py
>>> +++ b/phaul/p_haul_iters.py
>>> @@ -62,6 +62,7 @@ class phaul_iter_worker:
>>>               self.fs.set_options(opts)
>>>               self.__force = opts["force"]
>>>               self.pre_dump = opts["pre_dump"]
>>> +             self.target_host_ip = opts["to"]
>>>
>>>       def validate_cpu(self):
>>>               logging.info("Checking CPU compatibility")
>>> @@ -110,6 +111,12 @@ class phaul_iter_worker:
>>>               self.fs.set_work_dir(self.img.work_dir())
>>>               self.fs.start_migration()
>>>
>>> +             # TODO: Do not do predump for docker right now. Add page-server
>>> +             #       to docker C/R API, then we can enable the pre-dump
>>> +             if self.htype.get_driver_name() == "docker" :
>>> +                     logging.info("Disable pre-dump for docker")
>>> +                     self.pre_dump = False
>>> +
>>
>> No if self.htype.get_driver_name() == "docker" checks should remain in
>> generic code, please.
> 
> What does the "No" point to in your reply? Do you think the above code
> is correct or not? Thanks.

There should have been an "," after "no" :) IOW I think the code is correct,
but explicit check for driver being docker should not be here.

>>
>>>               logging.info("Checking for Dirty Tracking")
>>>               if self.pre_dump == PRE_DUMP_AUTO_DETECT:
>>>                       # pre-dump auto-detection
>>> @@ -194,36 +201,41 @@ class phaul_iter_worker:
>>>
>>>               logging.info("Final dump and restore")
>>>
>>> -             self.target_host.start_iter()
>>> -             self.img.new_image_dir()
>>> +             if self.htype.get_driver_name() == "docker" :
>>> +                     # call docker dump API
>>> +                     self.htype.dump()
>>> +                     logging.info("Dump complete")
>>
>> Why do you need such rough fix? Why just setting pre_dump to false doesn't help?
> 
> Two reasons. First, this part is about the final dump. So setting
> predump=False does not have effect here. Second, docker driver calls
> the dump() which will call docker C/R API directly. This is different
> than pid or openvz.

OK. Then we should make the dump part be similar to how the restore one
looks -- we should use the caller's API for everyone, not direct CRIU
connection.

>>
>>> +             else:
>>> +                     self.target_host.start_iter()
>>> +                     self.img.new_image_dir()
>>>
>>> -             logging.info("\tIssuing dump command to service")
>>> +                     logging.info("\tIssuing dump command to service")
>>>
>>> -             req = criu_req.make_dump_req(
>>> -                     self.pid, self.htype, self.img, self.criu_connection, self.fs)
>>> -             resp = self.criu_connection.send_req(req)
>>> -             while True:
>>> -                     if resp.type != pycriu.rpc.NOTIFY:
>>> -                             raise Exception("Dump failed")
>>> -
>>> -                     if resp.notify.script == "post-dump":
>>> -                             #
>>> -                             # Dump is effectively over. Now CRIU
>>> -                             # waits for us to do whatever we want
>>> -                             # and keeps the tasks frozen.
>>> -                             #
>>> -                             break
>>> +                     req = criu_req.make_dump_req(
>>> +                             self.pid, self.htype, self.img, self.criu_connection, self.fs)
>>> +                     resp = self.criu_connection.send_req(req)
>>> +                     while True:
>>> +                             if resp.type != pycriu.rpc.NOTIFY:
>>> +                                     raise Exception("Dump failed")
>>> +
>>> +                             if resp.notify.script == "post-dump":
>>> +                                     #
>>> +                                     # Dump is effectively over. Now CRIU
>>> +                                     # waits for us to do whatever we want
>>> +                                     # and keeps the tasks frozen.
>>> +                                     #
>>> +                                     break
>>>
>>> -                     elif resp.notify.script == "network-lock":
>>> -                             self.htype.net_lock()
>>> -                     elif resp.notify.script == "network-unlock":
>>> -                             self.htype.net_unlock()
>>> +                             elif resp.notify.script == "network-lock":
>>> +                                     self.htype.net_lock()
>>> +                             elif resp.notify.script == "network-unlock":
>>> +                                     self.htype.net_unlock()
>>>
>>> -                     logging.info("\t\tNotify (%s)", resp.notify.script)
>>> -                     resp = self.criu_connection.ack_notify()
>>> +                             logging.info("\t\tNotify (%s)", resp.notify.script)
>>> +                             resp = self.criu_connection.ack_notify()
>>>
>>> -             logging.info("Dump complete")
>>> -             self.target_host.end_iter()
>>> +                     logging.info("Dump complete")
>>> +                     self.target_host.end_iter()
>>>
>>>               #
>>>               # Dump is complete -- go to target node,
>>> @@ -233,8 +245,12 @@ class phaul_iter_worker:
>>>
>>>               logging.info("Final FS and images sync")
>>>               self.fs.stop_migration()
>>> -             self.img.sync_imgs_to_target(self.target_host, self.htype,
>>> -                     self.connection.mem_sk)
>>> +
>>> +             if self.htype.get_driver_name() == "docker" :
>>> +                     self.htype.send_criu_images(self.target_host_ip)
>>
>> The fs_haul_docker.send_criu_images() does almost the same as phaul_images.send_criu_images
>> do, please, reuse the phaul_images class functionality for this.
> 
> Do you mean "sync_imgs_to_target()" in imgaes.py? If so, yes I will
> change the code to re-use sync_imgs_to_target.

Yes, please.

-- Pavel


More information about the CRIU mailing list