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

S.Çağlar Onur caglar at 10ur.org
Wed Mar 26 01:24:24 UTC 2014


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.

> 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>


More information about the lxc-devel mailing list