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.hal...@ubuntu.com>
I have now run a total of 24 full testsuite run on the CI infrastructure, all successful with that change. Acked-by: Stéphane Graber <stgra...@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@lists.linuxcontainers.org > http://lists.linuxcontainers.org/listinfo/lxc-devel -- Stéphane Graber Ubuntu developer http://www.ubuntu.com
signature.asc
Description: Digital signature
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel