[lxc-devel] [PATCH] make the container exit code propagate to lxc-start exit code when appropriate

Rodrigo Vaz rodrigo at heroku.com
Thu Jul 3 17:59:16 UTC 2014


Hi Serge,

Thanks for the comment and it makes a lot of sense, here is the V2 patch.

Signed-off-by: Rodrigo Sampaio Vaz <rodrigo at heroku.com>
---
 src/lxc/lxc_start.c    | 2 ++
 src/lxc/lxccontainer.c | 1 +
 src/lxc/lxccontainer.h | 3 +++
 3 files changed, 6 insertions(+)

diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c
index 1d8145f..6212422 100644
--- a/src/lxc/lxc_start.c
+++ b/src/lxc/lxc_start.c
@@ -336,6 +336,8 @@ int main(int argc, char *argv[])
  ERROR("To get more details, run the container in foreground mode.");
  ERROR("Additional information can be obtained by setting the "
       "--logfile and --log-priority options.");
+        lxc_container_put(c);
+        return c->exit_value;
  }

 out:
diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
index 62e38d7..cb26fff 100644
--- a/src/lxc/lxccontainer.c
+++ b/src/lxc/lxccontainer.c
@@ -669,6 +669,7 @@ static bool lxcapi_start(struct lxc_container *c, int
useinit, char * const argv
 reboot:
  conf->reboot = 0;
  ret = lxc_start(c->name, argv, conf, c->config_path);
+    c->exit_value = ret;

  if (conf->reboot) {
  INFO("container requested reboot");
diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
index 1d0628a..0fb8eb1 100644
--- a/src/lxc/lxccontainer.h
+++ b/src/lxc/lxccontainer.h
@@ -106,6 +106,9 @@ struct lxc_container {
  /*! Last error number */
  int error_num;

+    /*! Container exit code */
+    int exit_value;
+
  /*! Whether container wishes to be daemonized */
  bool daemonize;

-- 
2.0.1



On Thu, Jul 3, 2014 at 11:25 AM, Serge Hallyn <serge.hallyn at ubuntu.com>
wrote:

> Quoting Rodrigo Vaz (rodrigo at heroku.com):
> > I managed to make lxc-start return the container's exit code, I'm not
> sure
> > if this could break something else and I appreciate any comment.
>
> Hi,
>
> we can't change the return value of lxcapi_start, because that would
> change the stable API.
>
> What about adding something like 'int err_value' or 'int exit_value'
> to the lxc_container struct, and having lxc_start.c, if it gets
> false back from c->start(), extracting the err_value and returning
> that?
>
> > Signed-off-by: Rodrigo Sampaio Vaz <rodrigo at heroku.com>
> > ---
> >  src/lxc/lxc_start.c    | 5 ++---
> >  src/lxc/lxccontainer.c | 8 ++++----
> >  src/lxc/lxccontainer.h | 4 ++--
> >  3 files changed, 8 insertions(+), 9 deletions(-)
> >
> > diff --git a/src/lxc/lxc_start.c b/src/lxc/lxc_start.c
> > index 1d8145f..0f4649c 100644
> > --- a/src/lxc/lxc_start.c
> > +++ b/src/lxc/lxc_start.c
> > @@ -328,9 +328,8 @@ int main(int argc, char *argv[])
> >   if (my_args.close_all_fds)
> >   c->want_close_all_fds(c, true);
> >
> > - err = c->start(c, 0, args) ? 0 : 1;
> > -
> > - if (err) {
> > + err = c->start(c, 0, args);
> > + if (err > 0) {
> >   ERROR("The container failed to start.");
> >   if (my_args.daemonize)
> >   ERROR("To get more details, run the container in foreground mode.");
> > diff --git a/src/lxc/lxccontainer.c b/src/lxc/lxccontainer.c
> > index 62e38d7..dc89f33 100644
> > --- a/src/lxc/lxccontainer.c
> > +++ b/src/lxc/lxccontainer.c
> > @@ -547,7 +547,7 @@ static bool am_single_threaded(void)
> >   * I can't decide if it'd be more convenient for callers if we accept
> > '...',
> >   * or a null-terminated array (i.e. execl vs execv)
> >   */
> > -static bool lxcapi_start(struct lxc_container *c, int useinit, char *
> > const argv[])
> > +static int lxcapi_start(struct lxc_container *c, int useinit, char *
> const
> > argv[])
> >  {
> >   int ret;
> >   struct lxc_conf *conf;
> > @@ -683,15 +683,15 @@ reboot:
> >   }
> >
> >   if (daemonize)
> > - exit (ret == 0 ? true : false);
> > + exit (ret);
> >   else
> > - return (ret == 0 ? true : false);
> > + return (ret);
> >  }
> >
> >  /*
> >   * note there MUST be an ending NULL
> >   */
> > -static bool lxcapi_startl(struct lxc_container *c, int useinit, ...)
> > +static int lxcapi_startl(struct lxc_container *c, int useinit, ...)
> >  {
> >   va_list ap;
> >   char **inargs = NULL;
> > diff --git a/src/lxc/lxccontainer.h b/src/lxc/lxccontainer.h
> > index 1d0628a..303f426 100644
> > --- a/src/lxc/lxccontainer.h
> > +++ b/src/lxc/lxccontainer.h
> > @@ -189,7 +189,7 @@ struct lxc_container {
> >   *
> >   * \return \c true on success, else \c false.
> >   */
> > - bool (*start)(struct lxc_container *c, int useinit, char * const
> argv[]);
> > + int (*start)(struct lxc_container *c, int useinit, char * const
> argv[]);
> >
> >   /*!
> >   * \brief Start the container (list variant).
> > @@ -204,7 +204,7 @@ struct lxc_container {
> >   *  arguments are specified via a list rather than an array of
> >   *  pointers.
> >   */
> > - bool (*startl)(struct lxc_container *c, int useinit, ...);
> > + int (*startl)(struct lxc_container *c, int useinit, ...);
> >
> >   /*!
> >   * \brief Stop the container.
> > --
> > 2.0.1
> >
> >
> >
> >
> > On Tue, Jul 1, 2014 at 6:36 PM, Rodrigo Vaz <rodrigo at heroku.com> wrote:
> >
> > > Hi,
> > >
> > > I've started testing lxc 1.0.4 on our environment with ubuntu trusty
> > > images and found an issue with the exit code of lxc-start.
> > >
> > > On lxc 0.9.0 the exit code matches the container:
> > >
> > > vagrant at vagrant-ubuntu-trusty-64:~$ sudo lxc-start -l debug -o
> lxc.log -n
> > > u1 -- bash -c 'echo TEST && sleep 10 && exit 143'
> > > TEST
> > > vagrant at vagrant-ubuntu-trusty-64:~$ echo $?
> > > 143
> > >
> > > Running the same test on lxc 1.0.4:
> > >
> > > root at runtime.21 ~# lxc-start -l debug -o lxc.log -n u1 -- bash -c
> 'echo
> > > TEST && sleep 10 && exit 143'
> > > TEST
> > > lxc-start: The container failed to start.
> > > lxc-start: Additional information can be obtained by setting the
> --logfile
> > > and --log-priority options.
> > > root at runtime.21 ~# echo $?
> > > 1
> > >
> > > lxc.log says:
> > >
> > >      lxc-start 1404250316.378 INFO     lxc_error - child <18118> ended
> on
> > > error (143)
> > >       lxc-start 1404250316.378 WARN     lxc_conf - failed to remove
> > > interface '(null)'
> > >       lxc-start 1404250316.382 ERROR    lxc_start_ui - The container
> > > failed to start.
> > >       lxc-start 1404250316.382 ERROR    lxc_start_ui - Additional
> > > information can be obtained by setting the --logfile and --log-priority
> > > options.
> > >
> > > This was reproducible on the same machine using lxc 0.9.0 and 1.0.4.
> > >
> > > Has anything changed recently regarding exit codes?
> > >
> > > Regards,
> > >
> > > Rodrigo.
> > >
>
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140703/44bbce73/attachment.html>


More information about the lxc-devel mailing list