[lxc-devel] [PATCH] RFC: commands: handle epipe

Stéphane Graber stgraber at ubuntu.com
Wed Mar 26 02:06:42 UTC 2014


On Tue, Mar 25, 2014 at 09:24:24PM -0400, S.Çağlar Onur wrote:
> Hey Stéphane,
> 
> On Tue, Mar 25, 2014 at 6:38 PM, Stéphane Graber <stgraber at ubuntu.com> wrote:
> > On Tue, Mar 25, 2014 at 03:50:06PM -0500, Serge Hallyn wrote:
> >> If we start a lxc_wait on a container while it is exiting, it is
> >> possible that we open the command socket, then the monitor closes
> >> all its mainloop sockets and exit, then we send our credentials.
> >> Then we get killed by SIGPIPE.
> >>
> >> Handle that case, recognizing that if we get sigpipe then the
> >> container is (now) stopped.
> >>
> >> Signed-off-by: Serge Hallyn <serge.hallyn at ubuntu.com>
> >
> > I have now run a total of 24 full testsuite run on the CI
> > infrastructure, all successful with that change.
> 
> I know I'm stealing the thread but wondering whether there is a way to
> hook up go bindings to your CI env. It could be useful to have it as
> it provides bunch of tests for both privileged and unprivileged
> containers.

Yep, that should be possible and would be interesting to do, though my
first priority is to finish moving all of the LXC build tools to Jenkins
before looking at extra stuff to hook in there.

> 
> > Acked-by: Stéphane Graber <stgraber at ubuntu.com>
> >
> > I will now push this to both branches and intend to release 1.0.2
> > tomorrow (this was the only real blocker I had on my list).
> >
> >> ---
> >>  src/lxc/af_unix.c  |  4 ++--
> >>  src/lxc/commands.c | 11 ++++++++++-
> >>  2 files changed, 12 insertions(+), 3 deletions(-)
> >>
> >> diff --git a/src/lxc/af_unix.c b/src/lxc/af_unix.c
> >> index a2de73e..46d8e50 100644
> >> --- a/src/lxc/af_unix.c
> >> +++ b/src/lxc/af_unix.c
> >> @@ -158,7 +158,7 @@ int lxc_abstract_unix_send_fd(int fd, int sendfd, void *data, size_t size)
> >>       msg.msg_iov = &iov;
> >>       msg.msg_iovlen = 1;
> >>
> >> -     return sendmsg(fd, &msg, 0);
> >> +     return sendmsg(fd, &msg, MSG_NOSIGNAL);
> >>  }
> >>
> >>  int lxc_abstract_unix_recv_fd(int fd, int *recvfd, void *data, size_t size)
> >> @@ -230,7 +230,7 @@ int lxc_abstract_unix_send_credential(int fd, void *data, size_t size)
> >>       msg.msg_iov = &iov;
> >>       msg.msg_iovlen = 1;
> >>
> >> -     return sendmsg(fd, &msg, 0);
> >> +     return sendmsg(fd, &msg, MSG_NOSIGNAL);
> >>  }
> >>
> >>  int lxc_abstract_unix_rcv_credential(int fd, void *data, size_t size)
> >> diff --git a/src/lxc/commands.c b/src/lxc/commands.c
> >> index 6b46c2c..b71274c 100644
> >> --- a/src/lxc/commands.c
> >> +++ b/src/lxc/commands.c
> >> @@ -263,6 +263,8 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
> >>
> >>       ret = lxc_abstract_unix_send_credential(sock, &cmd->req, sizeof(cmd->req));
> >>       if (ret != sizeof(cmd->req)) {
> >> +             if (errno == EPIPE)
> >> +                     goto epipe;
> >>               SYSERROR("command %s failed to send req to '@%s' %d",
> >>                        lxc_cmd_str(cmd->req.cmd), offset, ret);
> >>               if (ret >=0)
> >> @@ -271,8 +273,10 @@ static int lxc_cmd(const char *name, struct lxc_cmd_rr *cmd, int *stopped,
> >>       }
> >>
> >>       if (cmd->req.datalen > 0) {
> >> -             ret = send(sock, cmd->req.data, cmd->req.datalen, 0);
> >> +             ret = send(sock, cmd->req.data, cmd->req.datalen, MSG_NOSIGNAL);
> >>               if (ret != cmd->req.datalen) {
> >> +                     if (errno == EPIPE)
> >> +                             goto epipe;
> >>                       SYSERROR("command %s failed to send request data to '@%s' %d",
> >>                                lxc_cmd_str(cmd->req.cmd), offset, ret);
> >>                       if (ret >=0)
> >> @@ -289,6 +293,11 @@ out:
> >>               cmd->rsp.ret = sock;
> >>
> >>       return ret;
> >> +
> >> +epipe:
> >> +     close(sock);
> >> +     *stopped = 1;
> >> +     return 0;
> >>  }
> >>
> >>  int lxc_try_cmd(const char *name, const char *lxcpath)
> >> --
> >> 1.9.1
> >>
> >> _______________________________________________
> >> lxc-devel mailing list
> >> lxc-devel at lists.linuxcontainers.org
> >> http://lists.linuxcontainers.org/listinfo/lxc-devel
> >
> > --
> > Stéphane Graber
> > Ubuntu developer
> > http://www.ubuntu.com
> >
> > _______________________________________________
> > lxc-devel mailing list
> > lxc-devel at lists.linuxcontainers.org
> > http://lists.linuxcontainers.org/listinfo/lxc-devel
> >
> 
> 
> 
> -- 
> S.Çağlar Onur <caglar at 10ur.org>
> _______________________________________________
> lxc-devel mailing list
> lxc-devel at lists.linuxcontainers.org
> http://lists.linuxcontainers.org/listinfo/lxc-devel

-- 
Stéphane Graber
Ubuntu developer
http://www.ubuntu.com
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: Digital signature
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20140325/55e26e3e/attachment.pgp>


More information about the lxc-devel mailing list