From 43be967690d7b778cf829540b504a9662177511d Mon Sep 17 00:00:00 2001 From: "zhaozhao.zz" Date: Thu, 30 Nov 2017 18:11:05 +0800 Subject: networking: optimize unlinkClient() in freeClient() --- src/networking.c | 14 ++++++++++---- src/replication.c | 1 + src/server.h | 1 + 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; -- cgit v1.2.1