summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/networking.c14
-rw-r--r--src/replication.c1
-rw-r--r--src/server.h1
3 files changed, 12 insertions, 4 deletions
diff --git a/src/networking.c b/src/networking.c
index f0bdacfae..b1235ed41 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -136,7 +136,12 @@ client *createClient(int fd) {
c->peerid = NULL;
listSetFreeMethod(c->pubsub_patterns,decrRefCountVoid);
listSetMatchMethod(c->pubsub_patterns,listMatchObjects);
- if (fd != -1) listAddNodeTail(server.clients,c);
+ if (fd != -1) {
+ listAddNodeTail(server.clients,c);
+ c->client_list_node = listLast(server.clients);
+ } else {
+ c->client_list_node = NULL;
+ }
initClientMultiState(c);
return c;
}
@@ -744,9 +749,10 @@ void unlinkClient(client *c) {
* fd is already set to -1. */
if (c->fd != -1) {
/* Remove from the list of active clients. */
- ln = listSearchKey(server.clients,c);
- serverAssert(ln != NULL);
- listDelNode(server.clients,ln);
+ if (c->client_list_node) {
+ listDelNode(server.clients,c->client_list_node);
+ c->client_list_node = NULL;
+ }
/* Unregister async I/O handlers and close the socket. */
aeDeleteFileEvent(server.el,c->fd,AE_READABLE);
diff --git a/src/replication.c b/src/replication.c
index cf4db3e3a..1207e060b 100644
--- a/src/replication.c
+++ b/src/replication.c
@@ -2206,6 +2206,7 @@ void replicationResurrectCachedMaster(int newfd) {
/* Re-add to the list of clients. */
listAddNodeTail(server.clients,server.master);
+ server.master->client_list_node = listLast(server.clients);
if (aeCreateFileEvent(server.el, newfd, AE_READABLE,
readQueryFromClient, server.master)) {
serverLog(LL_WARNING,"Error resurrecting the cached master, impossible to add the readable handler: %s", strerror(errno));
diff --git a/src/server.h b/src/server.h
index 16e912564..afae8c58c 100644
--- a/src/server.h
+++ b/src/server.h
@@ -733,6 +733,7 @@ typedef struct client {
dict *pubsub_channels; /* channels a client is interested in (SUBSCRIBE) */
list *pubsub_patterns; /* patterns a client is interested in (SUBSCRIBE) */
sds peerid; /* Cached peer ID. */
+ listNode *client_list_node; /* list node in client list */
/* Response buffer */
int bufpos;