From 1a956bcd3274fb9135d63101b803c00015f3f2af Mon Sep 17 00:00:00 2001 From: Ara Ayvazyan Date: Thu, 29 Mar 2018 15:28:21 -0700 Subject: Fix missing mutex destruction --- src/core/lib/iomgr/tcp_server_windows.cc | 1 + src/core/lib/iomgr/timer_generic.cc | 10 ++++++++++ 2 files changed, 11 insertions(+) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_server_windows.cc b/src/core/lib/iomgr/tcp_server_windows.cc index 77f3811dca..b01afdcc9d 100644 --- a/src/core/lib/iomgr/tcp_server_windows.cc +++ b/src/core/lib/iomgr/tcp_server_windows.cc @@ -129,6 +129,7 @@ static void destroy_server(void* arg, grpc_error* error) { gpr_free(sp); } grpc_channel_args_destroy(s->channel_args); + gpr_mu_destroy(&s->mu); gpr_free(s); } diff --git a/src/core/lib/iomgr/timer_generic.cc b/src/core/lib/iomgr/timer_generic.cc index 93e654b7fa..0c6f236f83 100644 --- a/src/core/lib/iomgr/timer_generic.cc +++ b/src/core/lib/iomgr/timer_generic.cc @@ -97,6 +97,12 @@ static void init_timer_ht() { } } +static void destroy_timer_ht() { + for (int i = 0; i < NUM_HASH_BUCKETS; i++) { + gpr_mu_destroy(&g_hash_mu[i]); + } +} + static bool is_in_ht(grpc_timer* t) { size_t i = GPR_HASH_POINTER(t, NUM_HASH_BUCKETS); @@ -188,6 +194,7 @@ static void validate_non_pending_timer(grpc_timer* t) { } #define INIT_TIMER_HASH_TABLE() init_timer_ht() +#define DESTROY_TIMER_HASH_TABLE() destroy_timer_ht() #define ADD_TO_HASH_TABLE(t) add_to_ht((t)) #define REMOVE_FROM_HASH_TABLE(t) remove_from_ht((t)) #define VALIDATE_NON_PENDING_TIMER(t) validate_non_pending_timer((t)) @@ -195,6 +202,7 @@ static void validate_non_pending_timer(grpc_timer* t) { #else #define INIT_TIMER_HASH_TABLE() +#define DESTROY_TIMER_HASH_TABLE() #define ADD_TO_HASH_TABLE(t) #define REMOVE_FROM_HASH_TABLE(t) #define VALIDATE_NON_PENDING_TIMER(t) @@ -283,6 +291,8 @@ static void timer_list_shutdown() { gpr_free(g_shards); gpr_free(g_shard_queue); g_shared_mutables.initialized = false; + + DESTROY_TIMER_HASH_TABLE(); } /* returns true if the first element in the list */ -- cgit v1.2.3 From f3651a6573939741ec49245fc4c2a69f0a76fa92 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Tue, 3 Apr 2018 15:12:39 -0700 Subject: Cleanup from socklen_t changes --- src/core/lib/iomgr/socket_utils_linux.cc | 1 - src/core/lib/iomgr/socket_utils_posix.cc | 5 ++--- 2 files changed, 2 insertions(+), 4 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/socket_utils_linux.cc b/src/core/lib/iomgr/socket_utils_linux.cc index b0207578de..34f93cc4b0 100644 --- a/src/core/lib/iomgr/socket_utils_linux.cc +++ b/src/core/lib/iomgr/socket_utils_linux.cc @@ -33,7 +33,6 @@ int grpc_accept4(int sockfd, grpc_resolved_address* resolved_addr, int nonblock, int cloexec) { int flags = 0; - GPR_ASSERT(sizeof(socklen_t) <= sizeof(size_t)); flags |= nonblock ? SOCK_NONBLOCK : 0; flags |= cloexec ? SOCK_CLOEXEC : 0; return accept4(sockfd, reinterpret_cast(resolved_addr->addr), diff --git a/src/core/lib/iomgr/socket_utils_posix.cc b/src/core/lib/iomgr/socket_utils_posix.cc index 2a49583ac4..c48da52ffb 100644 --- a/src/core/lib/iomgr/socket_utils_posix.cc +++ b/src/core/lib/iomgr/socket_utils_posix.cc @@ -34,9 +34,8 @@ int grpc_accept4(int sockfd, grpc_resolved_address* resolved_addr, int nonblock, int cloexec) { int fd, flags; - GPR_ASSERT(sizeof(socklen_t) <= sizeof(size_t)); - fd = accept(sockfd, (grpc_sockaddr*)resolved_addr->addr, - (socklen_t*)&resolved_addr->len); + fd = accept(sockfd, reinterpret_cast(resolved_addr->addr), + &resolved_addr->len); if (fd >= 0) { if (nonblock) { flags = fcntl(fd, F_GETFL, 0); -- cgit v1.2.3 From 00531b326e9cdea7629644d9aa3e457773fe9182 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 00:11:47 +0200 Subject: 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(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_custom.h b/src/core/lib/iomgr/tcp_custom.h index 22caa149f8..9e781e4589 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 be92e61b62..c548b687f2 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 5e3166926b..2f2fc9492a 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; } -- cgit v1.2.3 From 7d6d2e8bce0f7d8896c1186d2acc9969341f0135 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 01:42:00 +0200 Subject: 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 +++++++++------------- .../grpcio/grpc/_cython/_cygrpc/grpc_gevent.pxd | 1 - .../grpcio/grpc/_cython/_cygrpc/grpc_gevent.pyx | 5 ---- 5 files changed, 11 insertions(+), 27 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_custom.h b/src/core/lib/iomgr/tcp_custom.h index 9e781e4589..784ef84222 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 c548b687f2..79ba5c39ee 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 2f2fc9492a..949b2028f1 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 efdd36a07f..f5688d08cd 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 88983469ff..31ef671aed 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 -- cgit v1.2.3 From 18042de3b5bb249263c8090cdd2d47f7ff4d6f53 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 01:59:51 +0200 Subject: Formatting... --- src/core/lib/iomgr/tcp_uv.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 949b2028f1..790cb95527 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 -- cgit v1.2.3 From 93e67ca6c50cef62dc85a165a0ed63f23e2b0621 Mon Sep 17 00:00:00 2001 From: Michael Lumish Date: Tue, 3 Apr 2018 17:54:38 -0700 Subject: Update tcp_uv.cc --- src/core/lib/iomgr/tcp_uv.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 790cb95527..a06b8cb51c 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)); } -- cgit v1.2.3 From d03bef89fa41bc71f9e767eff71318f0e735c247 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 4 Apr 2018 17:42:04 +0200 Subject: fix memory_profile_test on libuv iomgr --- src/core/lib/iomgr/tcp_uv.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index a06b8cb51c..178efa6a37 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -356,7 +356,9 @@ static grpc_resolved_addresses* handle_addrinfo_result( i++; prev = resp; resp = resp->ai_next; - gpr_free(prev); + // addrinfo objects are allocated by libuv (e.g. in uv_getaddrinfo) + // and not by gpr_malloc + free(prev); } return addresses; } -- cgit v1.2.3 From eab30cdc3a3ec3f284fb300889422dbaef880da5 Mon Sep 17 00:00:00 2001 From: "Nicolas \"Pixel\" Noble" Date: Wed, 4 Apr 2018 19:19:41 +0200 Subject: Using libuv's inet_ntop for portability. --- src/core/lib/iomgr/socket_utils_uv.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/socket_utils_uv.cc b/src/core/lib/iomgr/socket_utils_uv.cc index 8538abc7e4..7eba40c46b 100644 --- a/src/core/lib/iomgr/socket_utils_uv.cc +++ b/src/core/lib/iomgr/socket_utils_uv.cc @@ -38,8 +38,8 @@ int grpc_inet_pton(int af, const char* src, void* dst) { } const char* grpc_inet_ntop(int af, const void* src, char* dst, size_t size) { - /* Windows InetNtopA wants a mutable ip pointer */ - return inet_ntop(af, src, dst, (socklen_t)size); + uv_inet_ntop(af, src, dst, size); + return dst; } #endif /* GRPC_UV */ -- cgit v1.2.3 From 14c0da774f4c6fea9774fa8cd05cd1d1e7f03fe3 Mon Sep 17 00:00:00 2001 From: Jan Tattermusch Date: Wed, 4 Apr 2018 20:33:38 +0200 Subject: use uv_freeaddrinfo --- src/core/lib/iomgr/tcp_uv.cc | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/tcp_uv.cc b/src/core/lib/iomgr/tcp_uv.cc index 178efa6a37..f20f8dcb74 100644 --- a/src/core/lib/iomgr/tcp_uv.cc +++ b/src/core/lib/iomgr/tcp_uv.cc @@ -338,7 +338,6 @@ static void uv_socket_connect(grpc_custom_socket* socket, static grpc_resolved_addresses* handle_addrinfo_result( struct addrinfo* result) { struct addrinfo* resp; - struct addrinfo* prev; size_t i; grpc_resolved_addresses* addresses = (grpc_resolved_addresses*)gpr_malloc(sizeof(grpc_resolved_addresses)); @@ -348,18 +347,13 @@ static grpc_resolved_addresses* handle_addrinfo_result( } addresses->addrs = (grpc_resolved_address*)gpr_malloc( sizeof(grpc_resolved_address) * addresses->naddrs); - i = 0; - resp = result; - while (resp != nullptr) { + for (resp = result, i = 0; resp != nullptr; resp = resp->ai_next, i++) { memcpy(&addresses->addrs[i].addr, resp->ai_addr, resp->ai_addrlen); addresses->addrs[i].len = resp->ai_addrlen; - i++; - prev = resp; - resp = resp->ai_next; - // addrinfo objects are allocated by libuv (e.g. in uv_getaddrinfo) - // and not by gpr_malloc - free(prev); } + // addrinfo objects are allocated by libuv (e.g. in uv_getaddrinfo) + // and not by gpr_malloc + uv_freeaddrinfo(result); return addresses; } -- cgit v1.2.3 From cbfc5310a2ea14cac736fc2c4fbee5cc920c15b1 Mon Sep 17 00:00:00 2001 From: Juanli Shen Date: Wed, 4 Apr 2018 16:15:57 -0700 Subject: Revert "Revert "Use heuristic to determine how many events to handle per iter…" MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/lib/iomgr/ev_epollex_linux.cc | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index 0ef7c03056..d3cbaf9d0a 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -59,7 +59,7 @@ //#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1 #define MAX_EPOLL_EVENTS 100 -#define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 1 +#define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 16 grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false, "pollable_refcount"); @@ -198,6 +198,7 @@ struct grpc_pollset_worker { struct grpc_pollset { gpr_mu mu; + gpr_atm worker_count; pollable* active_pollable; bool kicked_without_poller; grpc_closure* shutdown_closure; @@ -685,6 +686,7 @@ static grpc_error* pollset_kick_all(grpc_pollset* pollset) { static void pollset_init(grpc_pollset* pollset, gpr_mu** mu) { gpr_mu_init(&pollset->mu); + gpr_atm_no_barrier_store(&pollset->worker_count, 0); pollset->active_pollable = POLLABLE_REF(g_empty_pollable, "pollset"); pollset->kicked_without_poller = false; pollset->shutdown_closure = nullptr; @@ -758,8 +760,20 @@ static grpc_error* pollable_process_events(grpc_pollset* pollset, pollable* pollable_obj, bool drain) { GPR_TIMER_SCOPE("pollable_process_events", 0); static const char* err_desc = "pollset_process_events"; + // Use a simple heuristic to determine how many fd events to process + // per loop iteration. (events/workers) + int handle_count = 1; + int worker_count = gpr_atm_no_barrier_load(&pollset->worker_count); + GPR_ASSERT(worker_count > 0); + handle_count = + (pollable_obj->event_count - pollable_obj->event_cursor) / worker_count; + if (handle_count == 0) { + handle_count = 1; + } else if (handle_count > MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) { + handle_count = MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL; + } grpc_error* error = GRPC_ERROR_NONE; - for (int i = 0; (drain || i < MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL) && + for (int i = 0; (drain || i < handle_count) && pollable_obj->event_cursor != pollable_obj->event_count; i++) { int n = pollable_obj->event_cursor++; @@ -884,6 +898,7 @@ static bool begin_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, GPR_TIMER_SCOPE("begin_worker", 0); bool do_poll = (pollset->shutdown_closure == nullptr && !pollset->already_shutdown); + gpr_atm_no_barrier_fetch_add(&pollset->worker_count, 1); if (worker_hdl != nullptr) *worker_hdl = worker; worker->initialized_cv = false; worker->kicked = false; @@ -964,6 +979,7 @@ static void end_worker(grpc_pollset* pollset, grpc_pollset_worker* worker, if (worker->initialized_cv) { gpr_cv_destroy(&worker->cv); } + gpr_atm_no_barrier_fetch_add(&pollset->worker_count, -1); } #ifndef NDEBUG -- cgit v1.2.3 From 22c63877eee99b4c944120a5270cfa4cf5d2f529 Mon Sep 17 00:00:00 2001 From: Juanli Shen Date: Wed, 4 Apr 2018 20:06:28 -0700 Subject: Add TODO --- src/core/lib/iomgr/ev_epollex_linux.cc | 3 +++ 1 file changed, 3 insertions(+) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/ev_epollex_linux.cc b/src/core/lib/iomgr/ev_epollex_linux.cc index d3cbaf9d0a..44d8cf2b1e 100644 --- a/src/core/lib/iomgr/ev_epollex_linux.cc +++ b/src/core/lib/iomgr/ev_epollex_linux.cc @@ -59,6 +59,9 @@ //#define GRPC_EPOLLEX_CREATE_WORKERS_ON_HEAP 1 #define MAX_EPOLL_EVENTS 100 +// TODO(juanlishen): We use a greater-than-one value here as a workaround fix to +// a keepalive ping timeout issue. We may want to revert https://github +// .com/grpc/grpc/pull/14943 once we figure out the root cause. #define MAX_EPOLL_EVENTS_HANDLED_EACH_POLL_CALL 16 grpc_core::DebugOnlyTraceFlag grpc_trace_pollable_refcount(false, -- cgit v1.2.3 From 0c4c9d78b539ae7fcbfce2b4372811bb6b4a19d8 Mon Sep 17 00:00:00 2001 From: Yash Tibrewal Date: Thu, 5 Apr 2018 19:39:10 -0700 Subject: poll-cv fix for zero timeout --- src/core/lib/iomgr/ev_poll_posix.cc | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src/core/lib/iomgr') diff --git a/src/core/lib/iomgr/ev_poll_posix.cc b/src/core/lib/iomgr/ev_poll_posix.cc index 2e375b4022..d9aba9b6a3 100644 --- a/src/core/lib/iomgr/ev_poll_posix.cc +++ b/src/core/lib/iomgr/ev_poll_posix.cc @@ -1530,6 +1530,12 @@ static void run_poll(void* args) { // This function overrides poll() to handle condition variable wakeup fds static int cvfd_poll(struct pollfd* fds, nfds_t nfds, int timeout) { + if (timeout == 0) { + // Don't bother using background threads for polling if timeout is 0, + // poll-cv might not wait for a poll to return otherwise. + // https://github.com/grpc/grpc/issues/13298 + return poll(fds, nfds, 0); + } unsigned int i; int res, idx; grpc_cv_node* pollcv; -- cgit v1.2.3