Skip to content
Snippets Groups Projects
Commit ecb10596 authored by Michael Lumish's avatar Michael Lumish Committed by GitHub
Browse files

Merge pull request #11875 from murgatroid99/core_uv_reuse_port

Add SO_REUSEPORT support to uv iomgr code
parents 66cedf64 6617790c
No related branches found
No related tags found
No related merge requests found
...@@ -220,6 +220,11 @@ const char *grpc_sockaddr_get_uri_scheme( ...@@ -220,6 +220,11 @@ const char *grpc_sockaddr_get_uri_scheme(
return NULL; return NULL;
} }
int grpc_sockaddr_get_family(const grpc_resolved_address *resolved_addr) {
const struct sockaddr *addr = (const struct sockaddr *)resolved_addr->addr;
return addr->sa_family;
}
int grpc_sockaddr_get_port(const grpc_resolved_address *resolved_addr) { int grpc_sockaddr_get_port(const grpc_resolved_address *resolved_addr) {
const struct sockaddr *addr = (const struct sockaddr *)resolved_addr->addr; const struct sockaddr *addr = (const struct sockaddr *)resolved_addr->addr;
switch (addr->sa_family) { switch (addr->sa_family) {
......
...@@ -75,4 +75,6 @@ char *grpc_sockaddr_to_uri(const grpc_resolved_address *addr); ...@@ -75,4 +75,6 @@ char *grpc_sockaddr_to_uri(const grpc_resolved_address *addr);
/* Returns the URI scheme corresponding to \a addr */ /* Returns the URI scheme corresponding to \a addr */
const char *grpc_sockaddr_get_uri_scheme(const grpc_resolved_address *addr); const char *grpc_sockaddr_get_uri_scheme(const grpc_resolved_address *addr);
int grpc_sockaddr_get_family(const grpc_resolved_address *resolved_addr);
#endif /* GRPC_CORE_LIB_IOMGR_SOCKADDR_UTILS_H */ #endif /* GRPC_CORE_LIB_IOMGR_SOCKADDR_UTILS_H */
...@@ -316,6 +316,7 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, ...@@ -316,6 +316,7 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s,
unsigned port_index = 0; unsigned port_index = 0;
int status; int status;
grpc_error *error = GRPC_ERROR_NONE; grpc_error *error = GRPC_ERROR_NONE;
int family;
if (s->tail != NULL) { if (s->tail != NULL) {
port_index = s->tail->port_index + 1; port_index = s->tail->port_index + 1;
...@@ -353,7 +354,18 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s, ...@@ -353,7 +354,18 @@ grpc_error *grpc_tcp_server_add_port(grpc_tcp_server *s,
} }
handle = gpr_malloc(sizeof(uv_tcp_t)); handle = gpr_malloc(sizeof(uv_tcp_t));
status = uv_tcp_init(uv_default_loop(), handle);
family = grpc_sockaddr_get_family(addr);
status = uv_tcp_init_ex(uv_default_loop(), handle, (unsigned int)family);
#if defined(GPR_LINUX) && defined(SO_REUSEPORT)
if (family == AF_INET || family == AF_INET6) {
int fd;
uv_fileno((uv_handle_t *)handle, &fd);
int enable = 1;
setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &enable, sizeof(enable));
}
#endif /* GPR_LINUX && SO_REUSEPORT */
if (status == 0) { if (status == 0) {
error = add_socket_to_server(s, handle, addr, port_index, &sp); error = add_socket_to_server(s, handle, addr, port_index, &sp);
} else { } else {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment