Take clients in a ID -> Client handle dictionary.

This commit is contained in:
antirez 2018-06-27 13:26:01 +02:00
parent ed65d734e7
commit fb39bfd7af
3 changed files with 6 additions and 0 deletions

View File

@ -75,6 +75,8 @@ void linkClient(client *c) {
* this way removing the client in unlinkClient() will not require * this way removing the client in unlinkClient() will not require
* a linear scan, but just a constant time operation. */ * a linear scan, but just a constant time operation. */
c->client_list_node = listLast(server.clients); c->client_list_node = listLast(server.clients);
uint64_t id = htonu64(c->id);
raxInsert(server.clients_index,(unsigned char*)&id,sizeof(id),c,NULL);
} }
client *createClient(int fd) { client *createClient(int fd) {
@ -720,6 +722,8 @@ void unlinkClient(client *c) {
if (c->fd != -1) { if (c->fd != -1) {
/* Remove from the list of active clients. */ /* Remove from the list of active clients. */
if (c->client_list_node) { if (c->client_list_node) {
uint64_t id = htonu64(c->id);
raxRemove(server.clients_index,(unsigned char*)&id,sizeof(id),NULL);
listDelNode(server.clients,c->client_list_node); listDelNode(server.clients,c->client_list_node);
c->client_list_node = NULL; c->client_list_node = NULL;
} }

View File

@ -1890,6 +1890,7 @@ void initServer(void) {
server.pid = getpid(); server.pid = getpid();
server.current_client = NULL; server.current_client = NULL;
server.clients = listCreate(); server.clients = listCreate();
server.clients_index = raxNew();
server.clients_to_close = listCreate(); server.clients_to_close = listCreate();
server.slaves = listCreate(); server.slaves = listCreate();
server.monitors = listCreate(); server.monitors = listCreate();

View File

@ -952,6 +952,7 @@ struct redisServer {
list *clients_pending_write; /* There is to write or install handler. */ list *clients_pending_write; /* There is to write or install handler. */
list *slaves, *monitors; /* List of slaves and MONITORs */ list *slaves, *monitors; /* List of slaves and MONITORs */
client *current_client; /* Current client, only used on crash report */ client *current_client; /* Current client, only used on crash report */
rax *clients_index; /* Active clients dictionary by client ID. */
int clients_paused; /* True if clients are currently paused */ int clients_paused; /* True if clients are currently paused */
mstime_t clients_pause_end_time; /* Time when we undo clients_paused */ mstime_t clients_pause_end_time; /* Time when we undo clients_paused */
char neterr[ANET_ERR_LEN]; /* Error buffer for anet.c */ char neterr[ANET_ERR_LEN]; /* Error buffer for anet.c */