On 05/15/2013 09:10 AM, Andrey Vagin wrote:
It can be done by any third party tools.
sripts/ct-cpt and script/ct_rst are executed to dump and restore CT
This patch adds scripts for CRIU.

Signed-off-by: Andrey Vagin <ava...@openvz.org>
---
  scripts/ct-cpt     | 19 ++++++++++++
  scripts/ct-rst     | 17 ++++++++++
  src/lib/hooks_ct.c | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
  3 files changed, 126 insertions(+), 1 deletion(-)
  create mode 100755 scripts/ct-cpt
  create mode 100755 scripts/ct-rst

diff --git a/scripts/ct-cpt b/scripts/ct-cpt
new file mode 100755
index 0000000..87c09dc
--- /dev/null
+++ b/scripts/ct-cpt
@@ -0,0 +1,19 @@
+#!/bin/sh
+mkdir $CT_CR_DIR &&

You'd better
1 describe what environment variables you expect here
2 check for their existence, refusing to run otherwise

+crtools dump   --file-locks            \

It's criu :)

+               --tcp-established       \
+               --evasive-devices       \
+               --link-remap            \
+               --root $CT_ROOT         \

I'd keep the old name, ie VE_ROOT, since this is what all the other scripts use all over.

+               -t $CT_PID              \
+               -D $CT_CR_DIR           \
+               -o dump.log             \
+               -vvvv
+if [ $? -ne 0 ]; then
+       [ -d $CT_CR_DIR.fail ] && rm -rf $CT_CR_DIR.fail
+       mv -f $CT_CR_DIR $CT_CR_DIR.fail
+       echo All dump files and logs were saved in $CT_CR_DIR.fail
+       exit 1
+else
+       echo Checkpointing finished successfully
+fi
diff --git a/scripts/ct-rst b/scripts/ct-rst
new file mode 100755
index 0000000..8953ec6
--- /dev/null
+++ b/scripts/ct-rst
@@ -0,0 +1,17 @@
+#!/bin/sh
+crtools restore        --file-locks            \

criu

+               --tcp-established       \
+               --evasive-devices       \
+               --link-remap            \
+               --root $CT_ROOT         \
+               --restore-detached      \
+               -D $CT_CR_DIR           \
+               -o restore.log          \
+               -vvvv                   \
+               --pidfile $CT_STATE
+if [ $? -eq 0 ]; then
+       rm -rf $CT_CR_DIR
+else
+       echo The restore log was saved in $CT_CR_DIR/restore.log
+       exit 1
+fi
diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c
index 3c82823..97c8695 100644
--- a/src/lib/hooks_ct.c
+++ b/src/lib/hooks_ct.c
@@ -17,6 +17,7 @@
  #include "logger.h"
  #include "script.h"
  #include "cgroup.h"
+#include "cpt.h"
#define NETNS_RUN_DIR "/var/run/netns" @@ -307,7 +308,10 @@ int ct_env_create(struct arg_start *arg)
                return VZ_RESOURCE_ERROR;
        }
- ret = ct_env_create_real(arg);
+       if (arg->fn)
+               ret = arg->fn(arg->h, arg->veid, arg->res, arg->wait_p, 
arg->old_wait_p, arg->err_p, arg->data);
+       else
+               ret = ct_env_create_real(arg);
snprintf(procpath, STR_SIZE, "/proc/%d/ns/net", ret);
        ret = symlink(procpath, ctpath);
@@ -597,6 +601,89 @@ static int ct_setcontext(envid_t veid)
        return 0;
  }
+static int ct_chkpnt(vps_handler *h, envid_t veid, const vps_res *res,
+               int cmd, cpt_param *param)
+{
+       const char *dumpfile = NULL;
+       char pidstr[STR_SIZE], buf[STR_SIZE];
+       int ret, fd;
+       char *arg[2];
+       char *env[4];
+
+       ret = VZ_CHKPNT_ERROR;
+
+       get_dump_file(veid, param->dumpdir, buf, sizeof(buf));
+       dumpfile = strdup(buf);
+
+       arg[0] = SCRIPTDIR "/ct-cpt";
+       arg[1] = NULL;
+
+       get_state_file(veid, res->env.statedir, pidstr, sizeof(pidstr));
+       fd = open(pidstr, O_RDONLY);
+       if (fd == -1) {
+               logger(-1, 0, "Unable to open the pid file");

second logger() argument should be errno not 0 here (and in every place where errno makes sense).

+               return VZ_CHKPNT_ERROR;
+       }
+
+       ret = read(fd, pidstr, sizeof(pidstr) - 1);
+       if (ret == -1) {
+               logger(-1, 0, "Unable to read pid");

ditto

+               return VZ_CHKPNT_ERROR;
+       }
+       pidstr[ret] = '\0';
+
+       snprintf(buf, sizeof(buf), "CT_ROOT=%s", res->fs.root);
VE_ROOT
+       env[0] = strdup(buf);
+       snprintf(buf, sizeof(buf), "CT_PID=%s", pidstr);
+       env[1] = strdup(buf);
+       snprintf(buf, sizeof(buf), "CT_CR_DIR=%s", dumpfile);
+       env[2] = strdup(buf);
+       env[3] = NULL;
+
+       if (run_script(arg[0], arg, env, 0))
+               return ret;
+
+       return 0;
+}
+
+static int ct_env_restore(vps_handler *h, envid_t veid, vps_res *res,
+                         int wait_p, int old_wait_p, int err_p, void *data)
+{
+       char *env[4];
+       char *argv[2];
+       char buf[STR_SIZE];
+       const char *dumpfile = NULL;
+       const char *statefile = NULL;
+       cpt_param *param = data;
+
+       get_dump_file(veid, param->dumpdir, buf, sizeof(buf));
+       dumpfile = strdup(buf);
+
+       get_state_file(veid, res->env.statedir, buf, sizeof(buf));
+       statefile = strdup(buf);
+
+       argv[0] = SCRIPTDIR "/ct-rst";
+       argv[1] = NULL;
+
+       snprintf(buf, sizeof(buf), "CT_ROOT=%s", res->fs.root);
+       env[0] = strdup(buf);
+       snprintf(buf, sizeof(buf), "CT_CR_DIR=%s", dumpfile);
+       env[1] = strdup(buf);
+       snprintf(buf, sizeof(buf), "CT_STATE=%s", statefile);

Bad choice for a name. We have VE_STATE for other scripts, which can be "running", "starting" etc.

+       env[2] = strdup(buf);
+       env[3] = NULL;
+       if (run_script(argv[0], argv, env, 0))
+               return VZ_RESTORE_ERROR;
+
+       return 0;
+}
+
+static int ct_restore(vps_handler *h, envid_t veid, vps_param *vps_p, int cmd,
+       cpt_param *param, skipFlags skip)
+{
+       return vps_start_custom(h, veid, vps_p, SKIP_CONFIGURE | skip, NULL, 
ct_env_restore, param);
+}
+
  int ct_do_open(vps_handler *h)
  {
        int ret;
@@ -630,6 +717,8 @@ int ct_do_open(vps_handler *h)
        h->enter = ct_enter;
        h->destroy = ct_destroy;
        h->env_create = ct_env_create;
+       h->env_chkpnt = ct_chkpnt;
+       h->env_restore = ct_restore;
        h->setlimits = ct_setlimits;
        h->setcpus = ct_setcpus;
        h->setcontext = ct_setcontext;

_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to