[Devel] [PATCH] [RFC] cpt: clean up dump files

Andrey Vagin avagin at openvz.org
Thu May 30 03:43:36 PDT 2013


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 <avagin at 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




More information about the Devel mailing list