[tarantool-patches] Re: [PATCH 07/11] coio: fix file descriptor leak on accept
Vladislav Shpilevoy
v.shpilevoy at tarantool.org
Wed Dec 5 00:29:17 MSK 2018
On 03/12/2018 19:16, Vladimir Davydov wrote:
> On Fri, Nov 30, 2018 at 06:39:39PM +0300, Vladislav Shpilevoy wrote:
>> @@ -90,44 +92,46 @@ evio_setsockopt_keepalive(int fd)
>> */
>> int keepcnt = 5;
>> if (sio_setsockopt(fd, IPPROTO_TCP, TCP_KEEPCNT, &keepcnt,
>> - sizeof(int)))
>> - diag_raise();
>> + sizeof(int)) != 0)
>> + return -1;
>> int keepidle = 30;
>>
>> if (sio_setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &keepidle,
>> - sizeof(int)))
>> - diag_raise();
>> + sizeof(int)) != 0)
>> + return -1;
>>
>> int keepintvl = 60;
>> if (sio_setsockopt(fd, IPPROTO_TCP, TCP_KEEPINTVL, &keepintvl,
>> - sizeof(int)))
>> - diag_raise();
>> + sizeof(int)) != 0)
>> + return -1;
>> #endif
>> + return 0;
>> }
>>
>> /** Set common client socket options. */
>> -void
>> +int
>> evio_setsockopt_client(int fd, int family, int type)
>> {
>> int on = 1;
>> - /* In case this throws, the socket is not leaked. */
>> if (sio_setfl(fd, O_NONBLOCK) != 0)
>> - diag_raise();
>> + return -1;
>> if (type == SOCK_STREAM && family != AF_UNIX) {
>> /*
>> * SO_KEEPALIVE to ensure connections don't hang
>> * around for too long when a link goes away.
>> */
>> - evio_setsockopt_keepalive(fd);
>> + if (evio_setsockopt_keepalive(fd) != 0)
>> + return -1;
>> /*
>> * Lower latency is more important than higher
>> * bandwidth, and we usually write entire
>> * request/response in a single syscall.
>> */
>> if (sio_setsockopt(fd, IPPROTO_TCP, TCP_NODELAY,
>> - &on, sizeof(on)))
>> - diag_raise();
>> + &on, sizeof(on)) != 0)
>> + return -1;
>> }
>> + return 0;
>> }
>>
>> /** Set options for server sockets. */
>> @@ -150,8 +154,9 @@ evio_setsockopt_server(int fd, int family, int type)
>> if (sio_setsockopt(fd, SOL_SOCKET, SO_LINGER,
>> &linger, sizeof(linger)))
>> diag_raise();
>> - if (type == SOCK_STREAM && family != AF_UNIX)
>> - evio_setsockopt_keepalive(fd);
>> + if (type == SOCK_STREAM && family != AF_UNIX &&
>> + evio_setsockopt_keepalive(fd) != 0)
>> + diag_raise();
>> }
>
> I don't like this patch, because apart from fixing the leak, it also
> removes exceptions from some evio functions, but not all of them, e.g.
> evio_setsockopt_keepalive and evio_setsockopt_client are now exception
> free while evio_setsockopt_server is not. And then you have a separate
> patch that removes the rest of exception from evio.
>
> Let's please first remove all exceptions from evio in one go, and only
> then fix the leak?
>
Done. See v2.
More information about the Tarantool-patches
mailing list