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

Kir Kolyshkin kir at openvz.org
Fri May 31 11:26:58 PDT 2013


On 05/30/2013 03:43 AM, Andrey Vagin wrote:
> 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.


That looks a bit over-engineered. It's just a file or a directory
we need to get rid of.

I did this instead:
     http://git.openvz.org/?p=vzctl;a=commitdiff;h=4eeffe85fd
with less code and not only CT start, but also CT delete covered.

  include/destroy.h |  1 +
  src/lib/destroy.c |  8 ++++++--
  src/lib/env.c     | 11 ++---------
  3 files changed, 9 insertions(+), 11 deletions(-)

Andrey, can you please test and report back?
>
> 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) {




More information about the Devel mailing list