summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhaozhao.zz <zhaozhao.zz@alibaba-inc.com>2017-11-30 18:11:05 +0800
committerzhaozhao.zz <zhaozhao.zz@alibaba-inc.com>2017-11-30 18:11:05 +0800
commit43be967690d7b778cf829540b504a9662177511d (patch)
tree85c87b8cf97bdf61785d30f961db18338104981e
parent75fa7879e6b4408247db6b7eba3def64c00d4f9a (diff)
downloadredis-43be967690d7b778cf829540b504a9662177511d.tar.gz
networking: optimize unlinkClient() in freeClient()
-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 aeaeca967..10e8b48e6 100644
--- a/src/networking.c
+++ b/src/networking.c
@@ -135,7 +135,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;
}
@@ -743,9 +748,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 e3b56075a..82cb9a7e0 100644
--- a/src/server.h
+++ b/src/server.h
@@ -722,6 +722,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;