[CRIU] [PATCH v3] Add docker phaul driver
Hui Kang
hkang.sunysb at gmail.com
Wed Oct 21 07:14:38 PDT 2015
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.
>
>> 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.
>
>> + 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.
Thanks.
>
>> + else:
>> + self.img.sync_imgs_to_target(self.target_host, self.htype,
>> + self.connection.mem_sk)
>>
>> logging.info("Asking target host to restore")
>> self.target_host.restore_from_images()
>
> -- Pavel
>
More information about the CRIU
mailing list