Guys, here is a problem I would like to discuss. For containers transparent transition we've to make monotonic clocks to consider the delta the container has been offline thus userspace applications won't notice the transition.
For this sake there is an interface via ve cgroup introduced (see [PATCH rh7] ve: Add interface for @start_timespec and @real_start_timespec adjustmen). The values must be saved somewhere and the written back on restore procedure. So I read them and write then via scripts called by CRIU. Would it be more-less convenient? Or there other options? Cyrill
>From 86723e8d967a43662056005341da06a0864be0a1 Mon Sep 17 00:00:00 2001 From: Cyrill Gorcunov <gorcu...@openvz.org> Date: Thu, 4 Feb 2016 18:09:16 +0300 Subject: [PATCH] Add ability to restore @real_start_timespec and @start_timespec These two members of VE cgroup are PCS7 specific so instead of squashing such change into CRIU (actually we've had a development series of custom cgroup values dump/restore but it hasn't been merged) we carry this setting inside ve.start_timespec and ve.real_start_timespec files in $VE_DUMP_DIR. On checkpoint time we read and save them, on restore -- write them back. https://jira.sw.ru/browse/PSBM-41406 Signed-off-by: Cyrill Gorcunov <gorcu...@openvz.org> --- lib/cr_criu.c | 4 +++- scripts/vz-cpt.in | 5 +++++ scripts/vz-rst-action.in | 2 ++ scripts/vz-rst.in | 6 ++++++ 4 files changed, 16 insertions(+), 1 deletion(-) diff --git a/lib/cr_criu.c b/lib/cr_criu.c index ed565b1..16bf036 100644 --- a/lib/cr_criu.c +++ b/lib/cr_criu.c @@ -73,7 +73,7 @@ static int do_dump(struct vzctl_env_handle *h, int cmd, char buf[PATH_MAX]; char script[PATH_MAX]; char *arg[2]; - char *env[9]; + char *env[10]; int ret, i = 0; pid_t pid; @@ -88,6 +88,8 @@ static int do_dump(struct vzctl_env_handle *h, int cmd, get_dumpfile(h, param, path, sizeof(path)); logger(2, 0, "Store dump at %s", path); + snprintf(buf, sizeof(buf), "VEID=%s", EID(h)); + env[i++] = strdup(buf); snprintf(buf, sizeof(buf), "VE_DUMP_DIR=%s", path); env[i++] = strdup(buf); snprintf(buf, sizeof(buf), "VE_ROOT=%s", h->env_param->fs->ve_root); diff --git a/scripts/vz-cpt.in b/scripts/vz-cpt.in index dba290f..a060d03 100755 --- a/scripts/vz-cpt.in +++ b/scripts/vz-cpt.in @@ -60,5 +60,10 @@ if [ $? -ne 0 ]; then exit 1 else mv $dumpdir $VE_DUMP_DIR + if [ -n "$VEID" ]; then + # Save monotonic offsets for next restore + cgget -v -r ve.real_start_timespec $VEID | tail -n1 > $VE_DUMP_DIR/ve.real_start_timespec + cgget -v -r ve.start_timespec $VEID | tail -n1 > $VE_DUMP_DIR/ve.start_timespec + fi echo Checkpointing finished successfully fi diff --git a/scripts/vz-rst-action.in b/scripts/vz-rst-action.in index 56f60a9..cc60b2b 100755 --- a/scripts/vz-rst-action.in +++ b/scripts/vz-rst-action.in @@ -68,6 +68,8 @@ case "$CRTOOLS_SCRIPT_ACTION" in ln -s /proc/$pid/ns/net $VE_NETNS_FILE if [ -n "$VEID" ]; then + cgset -r ve.real_start_timespec="$VE_REAL_START_TIMESPEC" $VEID + cgset -r ve.start_timespec="$VE_START_TIMESPEC" $VEID cgset -r ve.pseudosuper="0" $VEID cgset -r ve.state="START $pid" $VEID || exit fi diff --git a/scripts/vz-rst.in b/scripts/vz-rst.in index 78884da..1768042 100755 --- a/scripts/vz-rst.in +++ b/scripts/vz-rst.in @@ -57,6 +57,12 @@ extra_args_path="$VE_DUMP_DIR/restore-extra-args" # Setup default work directory if not explicitly specified [ -z "$VE_WORK_DIR" ] && VE_WORK_DIR="$VE_DUMP_DIR" +# Setup monotonic offsets for clock adjustments +if [ -n "$VEID" ]; then + export VE_REAL_START_TIMESPEC=`cat $VE_DUMP_DIR/ve.real_start_timespec` + export VE_START_TIMESPEC=`cat $VE_DUMP_DIR/ve.start_timespec` +fi + # Setup default log name if not explicitly specified [ -z "$VE_RESTORE_LOG_PATH" ] && VE_RESTORE_LOG_PATH="restore.log" -- 2.5.0
_______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel