[lxc-devel] [PATCH 1/2] restore: Hoist handler to function level

Serge Hallyn serge.hallyn at ubuntu.com
Wed Oct 8 17:36:01 UTC 2014


Quoting Tycho Andersen (tycho.andersen at canonical.com):
> On Tue, Oct 07, 2014 at 07:33:07PM +0000, Tycho Andersen wrote:
> > This commit is in preparation for the cgroups create work, since we will need
> > the handler in both the parent and the child. This commit also re-works how
> > errors are propagated to be less verbose.
> 
> Here is an updated version:
> 
> 
> From 941623498a49551411ccf185146061f3f37d3a67 Mon Sep 17 00:00:00 2001
> From: Tycho Andersen <tycho.andersen at canonical.com>
> Date: Tue, 7 Oct 2014 19:13:51 +0000
> Subject: [PATCH 1/2] restore: Hoist handler to function level
> 
> This commit is in preparation for the cgroups create work, since we will need
> the handler in both the parent and the child. This commit also re-works how
> errors are propagated to be less verbose.
> 
> v2: rename error to has_error, handle it correctly, and remove some diff noise
> 
> Signed-off-by: Tycho Andersen <tycho.andersen at canonical.com>

Acked-by: Serge E. Hallyn <serge.hallyn at ubuntu.com>

> ---
>  src/lxc/lxccontainer.c | 68 +++++++++++++++++++++++---------------------------
>  1 file changed, 31 insertions(+), 37 deletions(-)
> 
> diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> index fee758d..4b31f5c 100644
> --- a/src/lxc/lxccontainer.c
> +++ b/src/lxc/lxccontainer.c
> @@ -3809,6 +3809,8 @@ static bool lxcapi_restore(struct lxc_container *c, char *directory, bool verbos
>  	struct lxc_list *it;
>  	struct lxc_rootfs *rootfs;
>  	char pidfile[L_tmpnam];
> +	struct lxc_handler *handler;
> +	bool has_error = true;
>  
>  	if (!criu_ok(c))
>  		return false;
> @@ -3821,9 +3823,18 @@ static bool lxcapi_restore(struct lxc_container *c, char *directory, bool verbos
>  	if (!tmpnam(pidfile))
>  		return false;
>  
> +	handler = lxc_init(c->name, c->lxc_conf, c->config_path);
> +	if (!handler)
> +		return false;
> +
> +	if (!cgroup_init(handler)) {
> +		ERROR("failed initing cgroups");
> +		goto out_fini_handler;
> +	}
> +
>  	pid = fork();
>  	if (pid < 0)
> -		return false;
> +		goto out_fini_handler;
>  
>  	if (pid == 0) {
>  		struct criu_opts os;
> @@ -3862,30 +3873,22 @@ static bool lxcapi_restore(struct lxc_container *c, char *directory, bool verbos
>  		exit(1);
>  	} else {
>  		int status;
> -		struct lxc_handler *handler;
> -		bool error = false;
>  
>  		pid_t w = waitpid(pid, &status, 0);
>  
>  		if (w == -1) {
>  			perror("waitpid");
> -			return false;
> +			goto out_fini_handler;
>  		}
>  
> -		handler = lxc_init(c->name, c->lxc_conf, c->config_path);
> -		if (!handler)
> -			return false;
> -
>  		if (WIFEXITED(status)) {
>  			if (WEXITSTATUS(status)) {
> -				error = true;
>  				goto out_fini_handler;
>  			}
>  			else {
>  				int netnr = 0, ret;
>  				FILE *f = fopen(pidfile, "r");
>  				if (!f) {
> -					error = true;
>  					perror("reading pidfile");
>  					ERROR("couldn't read restore's init pidfile %s\n", pidfile);
>  					goto out_fini_handler;
> @@ -3894,71 +3897,62 @@ static bool lxcapi_restore(struct lxc_container *c, char *directory, bool verbos
>  				ret = fscanf(f, "%d", (int*) &handler->pid);
>  				fclose(f);
>  				if (ret != 1) {
> -					error = true;
>  					ERROR("reading restore pid failed");
>  					goto out_fini_handler;
>  				}
>  
> -				if (!cgroup_init(handler)) {
> -					error = true;
> -					ERROR("failed initing cgroups");
> -					goto out_fini_handler;
> -				}
> -
>  				if (!cgroup_parse_existing_cgroups(handler)) {
>  					ERROR("failed creating cgroups");
>  					goto out_fini_handler;
>  				}
>  
> -				if (container_mem_lock(c)) {
> -					error = true;
> +				if (container_mem_lock(c))
>  					goto out_fini_handler;
> -				}
>  
>  				lxc_list_for_each(it, &c->lxc_conf->network) {
>  					char eth[128], veth[128];
>  					struct lxc_netdev *netdev = it->elem;
>  
>  					if (read_criu_file(directory, "veth", netnr, veth)) {
> -						error = true;
> -						goto out_unlock;
> +						container_mem_unlock(c);
> +						goto out_fini_handler;
>  					}
> +
>  					if (read_criu_file(directory, "eth", netnr, eth)) {
> -						error = true;
> -						goto out_unlock;
> +						container_mem_unlock(c);
> +						goto out_fini_handler;
>  					}
> +
>  					netdev->priv.veth_attr.pair = strdup(veth);
>  					if (!netdev->priv.veth_attr.pair) {
> -						error = true;
> -						goto out_unlock;
> +						container_mem_unlock(c);
> +						goto out_fini_handler;
>  					}
> +
>  					netnr++;
>  				}
> -out_unlock:
> +
>  				container_mem_unlock(c);
> -				if (error)
> -					goto out_fini_handler;
>  
> -				if (lxc_set_state(c->name, handler, RUNNING)) {
> -					error = true;
> +				if (lxc_set_state(c->name, handler, RUNNING))
>  					goto out_fini_handler;
> -				}
>  			}
>  		} else {
>  			ERROR("CRIU was killed with signal %d\n", WTERMSIG(status));
> -			error = true;
>  			goto out_fini_handler;
>  		}
>  
>  		if (lxc_poll(c->name, handler)) {
>  			lxc_abort(c->name, handler);
> -			return false;
> +			goto out_fini_handler;
>  		}
> +	}
> +
> +	has_error = false;
>  
>  out_fini_handler:
> -		lxc_fini(c->name, handler);
> -		return !error;
> -	}
> +	lxc_fini(c->name, handler);
> +	return !has_error;
>  }
>  
>  static int lxcapi_attach_run_waitl(struct lxc_container *c, lxc_attach_options_t *options, const char *program, const char *arg, ...)
> -- 
> 1.9.1
> 
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel


More information about the lxc-devel mailing list