Quoting Tycho Andersen (tycho.ander...@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.ander...@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.ander...@canonical.com>

Acked-by: Serge E. Hallyn <serge.hal...@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@lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to