OpenVZ checkpointing saves all data in one file. Currently criu is used for upstream CTs and it generates many files (one file for each type of objects), so we can get the following error
Stale CT dump file /var/lib/vz/dump/Dump.101 found, removing Can't unlink /var/lib/vz/dump/Dump.101 Only a tools, which checkpoints CT, knows how to delete own data, so lets do that in the script vzt-rst. Signed-off-by: Andrey Vagin <ava...@openvz.org> --- include/cpt.h | 3 ++- scripts/vps-rst.in | 11 ++++++++++- src/lib/env.c | 10 +--------- src/lib/hooks_ct.c | 31 +++++++++++++++++++++++++++++-- src/lib/hooks_vz.c | 22 +++++++++++++++++----- 5 files changed, 59 insertions(+), 18 deletions(-) diff --git a/include/cpt.h b/include/cpt.h index 7932952..be7e0ae 100644 --- a/include/cpt.h +++ b/include/cpt.h @@ -11,13 +11,14 @@ #define CMD_DUMP 3 #define CMD_RESTORE 4 #define CMD_UNDUMP 5 +#define CMD_CLEANUP 6 #define CMD_KILL 10 #define CMD_RESUME 11 #define GET_DUMP_FILE(req_cmd) \ do { \ - dumpfile = param->dumpfile; \ + dumpfile = param ? param->dumpfile : NULL; \ if (dumpfile == NULL) { \ if (cmd == req_cmd) { \ logger(-1, 0, "Error: dumpfile is not specified"); \ diff --git a/scripts/vps-rst.in b/scripts/vps-rst.in index 91080b3..29ac014 100755 --- a/scripts/vps-rst.in +++ b/scripts/vps-rst.in @@ -30,9 +30,18 @@ exec 1>&2 . @SCRIPTDIR@/vps-functions +vzcheckvar CMD +vzcheckvar VE_DUMP_DIR + +if [ "$CMD" = "CLEANUP" ]; then + [ -d $VE_DUMP_DIR ] || exit 0 + echo Stale CT dump directory $VE_DUMP_DIR found, removing + rm -rf $VE_DUMP_DIR + exit +fi + vzcheckvar VE_ROOT vzcheckvar VE_STATE_FILE -vzcheckvar VE_DUMP_DIR vzcheckvar VE_VETH_DEVS veth_args="" diff --git a/src/lib/env.c b/src/lib/env.c index b45c878..b21f712 100644 --- a/src/lib/env.c +++ b/src/lib/env.c @@ -779,15 +779,7 @@ int vps_start(vps_handler *h, envid_t veid, vps_param *param, /* Start was successful, remove the default dump file: * it is now useless and inconsistent with the fs state */ - char buf[STR_SIZE]; - - get_dump_file(veid, param->res.cpt.dumpdir, buf, sizeof(buf)); - if (stat_file(buf) == 1) { - logger(0, 0, "Stale CT dump file %s found, removing", - buf); - if (unlink(buf) < 0) - logger(-1, 0, "Can't unlink %s", buf); - } + h->env_restore(h, veid, param, CMD_CLEANUP, NULL, 0); } return ret; diff --git a/src/lib/hooks_ct.c b/src/lib/hooks_ct.c index 18650e0..9ca34e9 100644 --- a/src/lib/hooks_ct.c +++ b/src/lib/hooks_ct.c @@ -924,7 +924,7 @@ static int ct_chkpnt(vps_handler *h, envid_t veid, static int ct_restore_fn(vps_handler *h, envid_t veid, const vps_res *res, int wait_p, int old_wait_p, int err_p, void *data) { - char *argv[2], *env[5]; + char *argv[2], *env[6]; const char *dumpfile = NULL; const char *statefile = NULL; cpt_param *param = data; @@ -957,8 +957,10 @@ static int ct_restore_fn(vps_handler *h, envid_t veid, const vps_res *res, "%s=%s\n", veth->dev_name_ve, veth->dev_name); } env[3] = strdup(buf); + snprintf(buf, sizeof(buf), "CMD=RESUME"); + env[4] = strdup(buf); - env[4] = NULL; + env[5] = NULL; ret = run_script(argv[0], argv, env, 0); free_arg(env); @@ -985,6 +987,31 @@ err_destroy: static int ct_restore(vps_handler *h, envid_t veid, vps_param *vps_p, int cmd, cpt_param *param, skipFlags skip) { + if (cmd == CMD_CLEANUP) { + char dumpfile[STR_SIZE], buf[STR_SIZE]; + char *argv[2]; + char *env[3]; + int ret; + + argv[0] = SCRIPTDIR "/vps-rst"; + argv[1] = NULL; + + get_dump_file(veid, param ? param->dumpdir : NULL, + dumpfile, sizeof(dumpfile)); + snprintf(buf, sizeof(buf), "VE_DUMP_DIR=%s", dumpfile); + env[0] = strdup(buf); + snprintf(buf, sizeof(buf), "CMD=CLEANUP"); + env[1] = strdup(buf); + env[2] = NULL; + + ret = run_script(argv[0], argv, env, 0); + free_arg(env); + if (ret) + return VZ_RESTORE_ERROR; + + return 0; + } + return vps_start_custom(h, veid, vps_p, SKIP_CONFIGURE | SKIP_ACTION_SCRIPT | SKIP_VETH_CREATE | skip, NULL, ct_restore_fn, param); diff --git a/src/lib/hooks_vz.c b/src/lib/hooks_vz.c index 49ec042..86a2c92 100644 --- a/src/lib/hooks_vz.c +++ b/src/lib/hooks_vz.c @@ -795,13 +795,25 @@ err_undump: static int vz_restore(vps_handler *h, envid_t veid, vps_param *vps_p, int cmd, cpt_param *param, skipFlags skip) { - int ret, rst_fd; - int dump_fd = -1; + int ret, dump_fd = -1, rst_fd = -1; char buf[PATH_LEN]; const char *dumpfile = NULL; - logger(0, 0, "Restoring container ..."); ret = VZ_RESTORE_ERROR; + GET_DUMP_FILE(CMD_UNDUMP); + + if (cmd == CMD_CLEANUP) { + if (stat_file(dumpfile) == 1) { + logger(0, 0, "Stale CT dump file %s found, removing", dumpfile); + if (unlink(dumpfile) < 0) { + logger(-1, 0, "Can't unlink %s", dumpfile); + return VZ_RESTORE_ERROR; + } + } + return 0; + } + + logger(0, 0, "Restoring container ..."); if ((rst_fd = open(PROC_RST, O_RDWR)) < 0) { if (errno == ENOENT) logger(-1, errno, "Error: No checkpointing" @@ -816,7 +828,6 @@ static int vz_restore(vps_handler *h, envid_t veid, vps_param *vps_p, goto err; } } - GET_DUMP_FILE(CMD_UNDUMP); if (cmd == CMD_RESTORE || cmd == CMD_UNDUMP) { dump_fd = open(dumpfile, O_RDONLY); if (dump_fd < 0) { @@ -838,7 +849,8 @@ static int vz_restore(vps_handler *h, envid_t veid, vps_param *vps_p, if (ret) goto err; err: - close(rst_fd); + if (rst_fd != -1) + close(rst_fd); if (dump_fd != -1) close(dump_fd); if (!ret) { -- 1.8.2 _______________________________________________ Devel mailing list Devel@openvz.org https://lists.openvz.org/mailman/listinfo/devel