Fix issue #88 - don't let seperate KeyDB processes listen on the same port

Former-commit-id: 4631119179df5cff638e9b8c51b030cef89a6c02
This commit is contained in:
John Sully 2019-10-13 10:02:21 -04:00
parent b11d3c4b82
commit dba52de8ca
5 changed files with 21 additions and 17 deletions

View File

@ -476,7 +476,7 @@ static int anetV6Only(char *err, int s) {
return ANET_OK; return ANET_OK;
} }
static int _anetTcpServer(char *err, int port, char *bindaddr, int af, int backlog, int fReusePort) static int _anetTcpServer(char *err, int port, char *bindaddr, int af, int backlog, int fReusePort, int fFirstListen)
{ {
int s = -1, rv; int s = -1, rv;
char _port[6]; /* strlen("65535") */ char _port[6]; /* strlen("65535") */
@ -498,8 +498,12 @@ static int _anetTcpServer(char *err, int port, char *bindaddr, int af, int backl
if (af == AF_INET6 && anetV6Only(err,s) == ANET_ERR) goto error; if (af == AF_INET6 && anetV6Only(err,s) == ANET_ERR) goto error;
if (anetSetReuseAddr(err,s) == ANET_ERR) goto error; if (anetSetReuseAddr(err,s) == ANET_ERR) goto error;
if (fReusePort && anetSetReusePort(err,s) == ANET_ERR) goto error; if (fReusePort && !fFirstListen && anetSetReusePort(err,s) == ANET_ERR) goto error;
if (anetListen(err,s,p->ai_addr,p->ai_addrlen,backlog) == ANET_ERR) s = ANET_ERR; if (anetListen(err,s,p->ai_addr,p->ai_addrlen,backlog) == ANET_ERR) {
s = ANET_ERR;
goto end;
}
if (fReusePort && fFirstListen && anetSetReusePort(err,s) == ANET_ERR) goto error;
goto end; goto end;
} }
if (p == NULL) { if (p == NULL) {
@ -515,14 +519,14 @@ end:
return s; return s;
} }
int anetTcpServer(char *err, int port, char *bindaddr, int backlog, int fReusePort) int anetTcpServer(char *err, int port, char *bindaddr, int backlog, int fReusePort, int fFirstListen)
{ {
return _anetTcpServer(err, port, bindaddr, AF_INET, backlog, fReusePort); return _anetTcpServer(err, port, bindaddr, AF_INET, backlog, fReusePort, fFirstListen);
} }
int anetTcp6Server(char *err, int port, char *bindaddr, int backlog, int fReusePort) int anetTcp6Server(char *err, int port, char *bindaddr, int backlog, int fReusePort, int fFirstListen)
{ {
return _anetTcpServer(err, port, bindaddr, AF_INET6, backlog, fReusePort); return _anetTcpServer(err, port, bindaddr, AF_INET6, backlog, fReusePort, fFirstListen);
} }
int anetUnixServer(char *err, char *path, mode_t perm, int backlog) int anetUnixServer(char *err, char *path, mode_t perm, int backlog)

View File

@ -62,8 +62,8 @@ int anetUnixNonBlockConnect(char *err, char *path);
int anetRead(int fd, char *buf, int count); int anetRead(int fd, char *buf, int count);
int anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len); int anetResolve(char *err, char *host, char *ipbuf, size_t ipbuf_len);
int anetResolveIP(char *err, char *host, char *ipbuf, size_t ipbuf_len); int anetResolveIP(char *err, char *host, char *ipbuf, size_t ipbuf_len);
int anetTcpServer(char *err, int port, char *bindaddr, int backlog, int fReusePort); int anetTcpServer(char *err, int port, char *bindaddr, int backlog, int fReusePort, int fFirstListen);
int anetTcp6Server(char *err, int port, char *bindaddr, int backlog, int fReusePort); int anetTcp6Server(char *err, int port, char *bindaddr, int backlog, int fReusePort, int fFirstListen);
int anetUnixServer(char *err, char *path, mode_t perm, int backlog); int anetUnixServer(char *err, char *path, mode_t perm, int backlog);
int anetTcpAccept(char *err, int serversock, char *ip, size_t ip_len, int *port); int anetTcpAccept(char *err, int serversock, char *ip, size_t ip_len, int *port);
int anetUnixAccept(char *err, int serversock); int anetUnixAccept(char *err, int serversock);

View File

@ -499,7 +499,7 @@ void clusterInit(void) {
} }
if (listenToPort(g_pserver->port+CLUSTER_PORT_INCR, if (listenToPort(g_pserver->port+CLUSTER_PORT_INCR,
g_pserver->cfd,&g_pserver->cfd_count, 0 /*fReusePort*/) == C_ERR) g_pserver->cfd,&g_pserver->cfd_count, 0 /*fReusePort*/, 0 /*fFirstListen*/) == C_ERR)
{ {
exit(1); exit(1);
} else { } else {

View File

@ -2704,7 +2704,7 @@ void checkTcpBacklogSettings(void) {
* impossible to bind, or no bind addresses were specified in the server * impossible to bind, or no bind addresses were specified in the server
* configuration but the function is not able to bind * for at least * configuration but the function is not able to bind * for at least
* one of the IPv4 or IPv6 protocols. */ * one of the IPv4 or IPv6 protocols. */
int listenToPort(int port, int *fds, int *count, int fReusePort) { int listenToPort(int port, int *fds, int *count, int fReusePort, int fFirstListen) {
int j; int j;
/* Force binding of 0.0.0.0 if no bind address is specified, always /* Force binding of 0.0.0.0 if no bind address is specified, always
@ -2716,7 +2716,7 @@ int listenToPort(int port, int *fds, int *count, int fReusePort) {
/* Bind * for both IPv6 and IPv4, we enter here only if /* Bind * for both IPv6 and IPv4, we enter here only if
* g_pserver->bindaddr_count == 0. */ * g_pserver->bindaddr_count == 0. */
fds[*count] = anetTcp6Server(serverTL->neterr,port,NULL, fds[*count] = anetTcp6Server(serverTL->neterr,port,NULL,
g_pserver->tcp_backlog, fReusePort); g_pserver->tcp_backlog, fReusePort, fFirstListen);
if (fds[*count] != ANET_ERR) { if (fds[*count] != ANET_ERR) {
anetNonBlock(NULL,fds[*count]); anetNonBlock(NULL,fds[*count]);
(*count)++; (*count)++;
@ -2728,7 +2728,7 @@ int listenToPort(int port, int *fds, int *count, int fReusePort) {
if (*count == 1 || unsupported) { if (*count == 1 || unsupported) {
/* Bind the IPv4 address as well. */ /* Bind the IPv4 address as well. */
fds[*count] = anetTcpServer(serverTL->neterr,port,NULL, fds[*count] = anetTcpServer(serverTL->neterr,port,NULL,
g_pserver->tcp_backlog, fReusePort); g_pserver->tcp_backlog, fReusePort, fFirstListen);
if (fds[*count] != ANET_ERR) { if (fds[*count] != ANET_ERR) {
anetNonBlock(NULL,fds[*count]); anetNonBlock(NULL,fds[*count]);
(*count)++; (*count)++;
@ -2744,11 +2744,11 @@ int listenToPort(int port, int *fds, int *count, int fReusePort) {
} else if (strchr(g_pserver->bindaddr[j],':')) { } else if (strchr(g_pserver->bindaddr[j],':')) {
/* Bind IPv6 address. */ /* Bind IPv6 address. */
fds[*count] = anetTcp6Server(serverTL->neterr,port,g_pserver->bindaddr[j], fds[*count] = anetTcp6Server(serverTL->neterr,port,g_pserver->bindaddr[j],
g_pserver->tcp_backlog, fReusePort); g_pserver->tcp_backlog, fReusePort, fFirstListen);
} else { } else {
/* Bind IPv4 address. */ /* Bind IPv4 address. */
fds[*count] = anetTcpServer(serverTL->neterr,port,g_pserver->bindaddr[j], fds[*count] = anetTcpServer(serverTL->neterr,port,g_pserver->bindaddr[j],
g_pserver->tcp_backlog, fReusePort); g_pserver->tcp_backlog, fReusePort, fFirstListen);
} }
if (fds[*count] == ANET_ERR) { if (fds[*count] == ANET_ERR) {
serverLog(LL_WARNING, serverLog(LL_WARNING,
@ -2810,7 +2810,7 @@ static void initNetworkingThread(int iel, int fReusePort)
if (fReusePort || (iel == IDX_EVENT_LOOP_MAIN)) if (fReusePort || (iel == IDX_EVENT_LOOP_MAIN))
{ {
if (g_pserver->port != 0 && if (g_pserver->port != 0 &&
listenToPort(g_pserver->port,g_pserver->rgthreadvar[iel].ipfd,&g_pserver->rgthreadvar[iel].ipfd_count, fReusePort) == C_ERR) listenToPort(g_pserver->port,g_pserver->rgthreadvar[iel].ipfd,&g_pserver->rgthreadvar[iel].ipfd_count, fReusePort, (iel == IDX_EVENT_LOOP_MAIN)) == C_ERR)
exit(1); exit(1);
} }
else else

View File

@ -2014,7 +2014,7 @@ const char *getClientTypeName(int cclass);
void flushSlavesOutputBuffers(void); void flushSlavesOutputBuffers(void);
void disconnectSlaves(void); void disconnectSlaves(void);
void disconnectSlavesExcept(unsigned char *uuid); void disconnectSlavesExcept(unsigned char *uuid);
int listenToPort(int port, int *fds, int *count, int fReusePort); int listenToPort(int port, int *fds, int *count, int fReusePort, int fFirstListen);
void pauseClients(mstime_t duration); void pauseClients(mstime_t duration);
int clientsArePaused(void); int clientsArePaused(void);
int processEventsWhileBlocked(int iel); int processEventsWhileBlocked(int iel);