From 00531b326e9cdea7629644d9aa3e457773fe9182 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 00:11:47 +0200 Subject: [PATCH 1/5] Making tcp_custom's setsockopt a more generic thing. --- src/core/lib/iomgr/tcp_custom.h | 3 +-- src/core/lib/iomgr/tcp_server_custom.cc | 11 ++++------- src/core/lib/iomgr/tcp_uv.cc | 19 +++++++++++-------- 3 files changed, 16 insertions(+), 17 deletions(-) diff --git a/src/core/lib/iomgr/tcp_custom.h b/src/core/lib/iomgr/tcp_custom.h index 22caa149f84..9e781e4589b 100644 --- a/src/core/lib/iomgr/tcp_custom.h +++ b/src/core/lib/iomgr/tcp_custom.h @@ -62,8 +62,7 @@ typedef struct grpc_socket_vtable { const grpc_sockaddr* addr, int* len); grpc_error* (*getsockname)(grpc_custom_socket* socket, const grpc_sockaddr* addr, int* len); - grpc_error* (*setsockopt)(grpc_custom_socket* socket, int level, int optname, - const void* optval, uint32_t optlen); + grpc_error* (*setsockopt)(grpc_custom_socket* socket); grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr, size_t len, int flags); grpc_error* (*listen)(grpc_custom_socket* socket); diff --git a/src/core/lib/iomgr/tcp_server_custom.cc b/src/core/lib/iomgr/tcp_server_custom.cc index be92e61b623..c548b687f25 100644 --- a/src/core/lib/iomgr/tcp_server_custom.cc +++ b/src/core/lib/iomgr/tcp_server_custom.cc @@ -393,13 +393,10 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s, grpc_custom_socket_vtable->init(socket, family); if (error == GRPC_ERROR_NONE) { -#if defined(GPR_LINUX) && defined(SO_REUSEPORT) - if (family == AF_INET || family == AF_INET6) { - int enable = 1; - grpc_custom_socket_vtable->setsockopt(socket, SOL_SOCKET, SO_REUSEPORT, - &enable, sizeof(enable)); - } -#endif /* GPR_LINUX && SO_REUSEPORT */ + error = grpc_custom_socket_vtable->setsockopt(socket); + } + + if (error == GRPC_ERROR_NONE) { error = add_socket_to_server(s, socket, addr, port_index, &sp); } gpr_free(allocated_addr); diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 5e3166926b6..2f2fc9492ad 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -299,14 +299,17 @@ static grpc_error* uv_socket_listen(grpc_custom_socket* socket) { return tcp_error_create("Failed to listen to port", status); } -static grpc_error* uv_socket_setsockopt(grpc_custom_socket* socket, int level, - int option_name, const void* optval, - socklen_t option_len) { - int fd; - uv_socket_t* uv_socket = (uv_socket_t*)socket->impl; - uv_fileno((uv_handle_t*)uv_socket->handle, &fd); - // TODO Handle error here. Also, does this work on windows?? - setsockopt(fd, level, option_name, &optval, (socklen_t)option_len); +static grpc_error* uv_socket_setsockopt(grpc_custom_socket* socket) { +#if defined(GPR_LINUX) && defined(SO_REUSEPORT) + if (family == AF_INET || family == AF_INET6) { + int enable = 1; + int fd; + uv_socket_t* uv_socket = (uv_socket_t*)socket->impl; + uv_fileno((uv_handle_t*)uv_socket->handle, &fd); + // TODO Handle error here. + setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable)); + } +#endif return GRPC_ERROR_NONE; } From 5426183de0b639b4131b189dcd46bdad4d828339 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 00:45:54 +0200 Subject: [PATCH 2/5] Taking care of gevent. --- src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd | 3 +-- src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd index f35aebadde4..efdd36a07f9 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd @@ -83,8 +83,7 @@ cdef extern from "src/core/lib/iomgr/tcp_custom.h": const grpc_sockaddr* addr, int* len); grpc_error* (*getsockname)(grpc_custom_socket* socket, const grpc_sockaddr* addr, int* len); - grpc_error* (*setsockopt)(grpc_custom_socket* socket, int level, int optname, - const void* optval, uint32_t len); + grpc_error* (*setsockopt)(grpc_custom_socket* socket); grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr, size_t len, int flags); grpc_error* (*listen)(grpc_custom_socket* socket); diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx index ba8c7318914..88983469ffe 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx @@ -239,8 +239,7 @@ cdef grpc_error* socket_getsockname(grpc_custom_socket* socket, length[0] = c_addr.len return grpc_error_none() -cdef grpc_error* socket_setsockopt(grpc_custom_socket* socket, int level, int optname, - const void *optval, uint32_t optlen) with gil: +cdef grpc_error* socket_setsockopt(grpc_custom_socket* socket) with gil: # No-op; we provide a default set of options return grpc_error_none() From 7d6d2e8bce0f7d8896c1186d2acc9969341f0135 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 01:42:00 +0200 Subject: [PATCH 3/5] Removing setsockopt completely actually. --- src/core/lib/iomgr/tcp_custom.h | 1 - src/core/lib/iomgr/tcp_server_custom.cc | 4 --- src/core/lib/iomgr/tcp_uv.cc | 27 ++++++++----------- .../grpc/_cython/_cygrpc/grpc_gevent.pxd | 1 - .../grpc/_cython/_cygrpc/grpc_gevent.pyx | 5 ---- 5 files changed, 11 insertions(+), 27 deletions(-) diff --git a/src/core/lib/iomgr/tcp_custom.h b/src/core/lib/iomgr/tcp_custom.h index 9e781e4589b..784ef842221 100644 --- a/src/core/lib/iomgr/tcp_custom.h +++ b/src/core/lib/iomgr/tcp_custom.h @@ -62,7 +62,6 @@ typedef struct grpc_socket_vtable { const grpc_sockaddr* addr, int* len); grpc_error* (*getsockname)(grpc_custom_socket* socket, const grpc_sockaddr* addr, int* len); - grpc_error* (*setsockopt)(grpc_custom_socket* socket); grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr, size_t len, int flags); grpc_error* (*listen)(grpc_custom_socket* socket); diff --git a/src/core/lib/iomgr/tcp_server_custom.cc b/src/core/lib/iomgr/tcp_server_custom.cc index c548b687f25..79ba5c39eee 100644 --- a/src/core/lib/iomgr/tcp_server_custom.cc +++ b/src/core/lib/iomgr/tcp_server_custom.cc @@ -392,10 +392,6 @@ static grpc_error* tcp_server_add_port(grpc_tcp_server* s, socket->connector = nullptr; grpc_custom_socket_vtable->init(socket, family); - if (error == GRPC_ERROR_NONE) { - error = grpc_custom_socket_vtable->setsockopt(socket); - } - if (error == GRPC_ERROR_NONE) { error = add_socket_to_server(s, socket, addr, port_index, &sp); } diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 2f2fc9492ad..949b2028f13 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -192,6 +192,16 @@ static grpc_error* uv_socket_init_helper(uv_socket_t* uv_socket, int domain) { if (status != 0) { return tcp_error_create("Failed to initialize UV tcp handle", status); } +#if defined(GPR_LINUX) && defined(SO_REUSEPORT) + if (domain == AF_INET || domain == AF_INET6) { + int enable = 1; + int fd; + uv_socket_t* uv_socket = (uv_socket_t*)socket->impl; + uv_fileno((uv_handle_t*)uv_socket->handle, &fd); + // TODO Handle error here. + setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable)); + } +#endif uv_socket->write_buffers = nullptr; uv_socket->read_len = 0; uv_tcp_nodelay(uv_socket->handle, 1); @@ -299,20 +309,6 @@ static grpc_error* uv_socket_listen(grpc_custom_socket* socket) { return tcp_error_create("Failed to listen to port", status); } -static grpc_error* uv_socket_setsockopt(grpc_custom_socket* socket) { -#if defined(GPR_LINUX) && defined(SO_REUSEPORT) - if (family == AF_INET || family == AF_INET6) { - int enable = 1; - int fd; - uv_socket_t* uv_socket = (uv_socket_t*)socket->impl; - uv_fileno((uv_handle_t*)uv_socket->handle, &fd); - // TODO Handle error here. - setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable)); - } -#endif - return GRPC_ERROR_NONE; -} - static void uv_tc_on_connect(uv_connect_t* req, int status) { grpc_custom_socket* socket = (grpc_custom_socket*)req->data; uv_socket_t* uv_socket = (uv_socket_t*)socket->impl; @@ -421,7 +417,6 @@ grpc_socket_vtable grpc_uv_socket_vtable = { uv_socket_init, uv_socket_connect, uv_socket_destroy, uv_socket_shutdown, uv_socket_close, uv_socket_write, uv_socket_read, uv_socket_getpeername, uv_socket_getsockname, - uv_socket_setsockopt, uv_socket_bind, uv_socket_listen, - uv_socket_accept}; + uv_socket_bind, uv_socket_listen, uv_socket_accept}; #endif diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd index efdd36a07f9..f5688d08cdc 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd @@ -83,7 +83,6 @@ cdef extern from "src/core/lib/iomgr/tcp_custom.h": const grpc_sockaddr* addr, int* len); grpc_error* (*getsockname)(grpc_custom_socket* socket, const grpc_sockaddr* addr, int* len); - grpc_error* (*setsockopt)(grpc_custom_socket* socket); grpc_error* (*bind)(grpc_custom_socket* socket, const grpc_sockaddr* addr, size_t len, int flags); grpc_error* (*listen)(grpc_custom_socket* socket); diff --git a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx index 88983469ffe..31ef671aed2 100644 --- a/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx +++ b/src/python/grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx @@ -239,10 +239,6 @@ cdef grpc_error* socket_getsockname(grpc_custom_socket* socket, length[0] = c_addr.len return grpc_error_none() -cdef grpc_error* socket_setsockopt(grpc_custom_socket* socket) with gil: - # No-op; we provide a default set of options - return grpc_error_none() - def applysockopts(s): s.setsockopt(gevent_socket.SOL_SOCKET, gevent_socket.SO_REUSEADDR, 1) s.setsockopt(gevent_socket.IPPROTO_TCP, gevent_socket.TCP_NODELAY, True) @@ -434,7 +430,6 @@ def init_grpc_gevent(): gevent_socket_vtable.read = socket_read gevent_socket_vtable.getpeername = socket_getpeername gevent_socket_vtable.getsockname = socket_getsockname - gevent_socket_vtable.setsockopt = socket_setsockopt gevent_socket_vtable.bind = socket_bind gevent_socket_vtable.listen = socket_listen gevent_socket_vtable.accept = socket_accept From 18042de3b5bb249263c8090cdd2d47f7ff4d6f53 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 01:59:51 +0200 Subject: [PATCH 4/5] Formatting... --- src/core/lib/iomgr/tcp_uv.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 949b2028f13..790cb955272 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -414,9 +414,9 @@ static void uv_resolve_async(grpc_custom_resolver* r, char* host, char* port) { grpc_custom_resolver_vtable uv_resolver_vtable = {uv_resolve, uv_resolve_async}; grpc_socket_vtable grpc_uv_socket_vtable = { - uv_socket_init, uv_socket_connect, uv_socket_destroy, - uv_socket_shutdown, uv_socket_close, uv_socket_write, - uv_socket_read, uv_socket_getpeername, uv_socket_getsockname, - uv_socket_bind, uv_socket_listen, uv_socket_accept}; + uv_socket_init, uv_socket_connect, uv_socket_destroy, + uv_socket_shutdown, uv_socket_close, uv_socket_write, + uv_socket_read, uv_socket_getpeername, uv_socket_getsockname, + uv_socket_bind, uv_socket_listen, uv_socket_accept}; #endif From 93e67ca6c50cef62dc85a165a0ed63f23e2b0621 Mon Sep 17 00:00:00 2001 From: Michael Lumish Date: Tue, 3 Apr 2018 17:54:38 -0700 Subject: [PATCH 5/5] Update tcp_uv.cc --- src/core/lib/iomgr/tcp_uv.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 790cb955272..a06b8cb51ce 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -196,8 +196,7 @@ static grpc_error* uv_socket_init_helper(uv_socket_t* uv_socket, int domain) { if (domain == AF_INET || domain == AF_INET6) { int enable = 1; int fd; - uv_socket_t* uv_socket = (uv_socket_t*)socket->impl; - uv_fileno((uv_handle_t*)uv_socket->handle, &fd); + uv_fileno((uv_handle_t*)tcp, &fd); // TODO Handle error here. setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable)); }