mirror of
https://github.com/fluencelabs/redis
synced 2025-06-15 18:21:21 +00:00
Merge pull request #5569 from maximebedard/backport-4497
Backport #4497 to redis 4
This commit is contained in:
@ -67,6 +67,16 @@ int listMatchObjects(void *a, void *b) {
|
|||||||
return equalStringObjects(a,b);
|
return equalStringObjects(a,b);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function links the client to the global linked list of clients.
|
||||||
|
* unlinkClient() does the opposite, among other things. */
|
||||||
|
void linkClient(client *c) {
|
||||||
|
listAddNodeTail(server.clients,c);
|
||||||
|
/* Note that we remember the linked list node where the client is stored,
|
||||||
|
* this way removing the client in unlinkClient() will not require
|
||||||
|
* a linear scan, but just a constant time operation. */
|
||||||
|
c->client_list_node = listLast(server.clients);
|
||||||
|
}
|
||||||
|
|
||||||
client *createClient(int fd) {
|
client *createClient(int fd) {
|
||||||
client *c = zmalloc(sizeof(client));
|
client *c = zmalloc(sizeof(client));
|
||||||
|
|
||||||
@ -133,9 +143,10 @@ client *createClient(int fd) {
|
|||||||
c->pubsub_channels = dictCreate(&objectKeyPointerValueDictType,NULL);
|
c->pubsub_channels = dictCreate(&objectKeyPointerValueDictType,NULL);
|
||||||
c->pubsub_patterns = listCreate();
|
c->pubsub_patterns = listCreate();
|
||||||
c->peerid = NULL;
|
c->peerid = NULL;
|
||||||
|
c->client_list_node = NULL;
|
||||||
listSetFreeMethod(c->pubsub_patterns,decrRefCountVoid);
|
listSetFreeMethod(c->pubsub_patterns,decrRefCountVoid);
|
||||||
listSetMatchMethod(c->pubsub_patterns,listMatchObjects);
|
listSetMatchMethod(c->pubsub_patterns,listMatchObjects);
|
||||||
if (fd != -1) listAddNodeTail(server.clients,c);
|
if (fd != -1) linkClient(c);
|
||||||
initClientMultiState(c);
|
initClientMultiState(c);
|
||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
@ -752,9 +763,10 @@ void unlinkClient(client *c) {
|
|||||||
* fd is already set to -1. */
|
* fd is already set to -1. */
|
||||||
if (c->fd != -1) {
|
if (c->fd != -1) {
|
||||||
/* Remove from the list of active clients. */
|
/* Remove from the list of active clients. */
|
||||||
ln = listSearchKey(server.clients,c);
|
if (c->client_list_node) {
|
||||||
serverAssert(ln != NULL);
|
listDelNode(server.clients,c->client_list_node);
|
||||||
listDelNode(server.clients,ln);
|
c->client_list_node = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Unregister async I/O handlers and close the socket. */
|
/* Unregister async I/O handlers and close the socket. */
|
||||||
aeDeleteFileEvent(server.el,c->fd,AE_READABLE);
|
aeDeleteFileEvent(server.el,c->fd,AE_READABLE);
|
||||||
|
@ -2226,7 +2226,7 @@ void replicationResurrectCachedMaster(int newfd) {
|
|||||||
server.repl_down_since = 0;
|
server.repl_down_since = 0;
|
||||||
|
|
||||||
/* Re-add to the list of clients. */
|
/* Re-add to the list of clients. */
|
||||||
listAddNodeTail(server.clients,server.master);
|
linkClient(server.master);
|
||||||
if (aeCreateFileEvent(server.el, newfd, AE_READABLE,
|
if (aeCreateFileEvent(server.el, newfd, AE_READABLE,
|
||||||
readQueryFromClient, server.master)) {
|
readQueryFromClient, server.master)) {
|
||||||
serverLog(LL_WARNING,"Error resurrecting the cached master, impossible to add the readable handler: %s", strerror(errno));
|
serverLog(LL_WARNING,"Error resurrecting the cached master, impossible to add the readable handler: %s", strerror(errno));
|
||||||
|
@ -723,6 +723,7 @@ typedef struct client {
|
|||||||
dict *pubsub_channels; /* channels a client is interested in (SUBSCRIBE) */
|
dict *pubsub_channels; /* channels a client is interested in (SUBSCRIBE) */
|
||||||
list *pubsub_patterns; /* patterns a client is interested in (SUBSCRIBE) */
|
list *pubsub_patterns; /* patterns a client is interested in (SUBSCRIBE) */
|
||||||
sds peerid; /* Cached peer ID. */
|
sds peerid; /* Cached peer ID. */
|
||||||
|
listNode *client_list_node; /* list node in client list */
|
||||||
|
|
||||||
/* Response buffer */
|
/* Response buffer */
|
||||||
int bufpos;
|
int bufpos;
|
||||||
@ -1393,6 +1394,7 @@ int handleClientsWithPendingWrites(void);
|
|||||||
int clientHasPendingReplies(client *c);
|
int clientHasPendingReplies(client *c);
|
||||||
void unlinkClient(client *c);
|
void unlinkClient(client *c);
|
||||||
int writeToClient(int fd, client *c, int handler_installed);
|
int writeToClient(int fd, client *c, int handler_installed);
|
||||||
|
void linkClient(client *c);
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
void addReplyErrorFormat(client *c, const char *fmt, ...)
|
void addReplyErrorFormat(client *c, const char *fmt, ...)
|
||||||
|
Reference in New Issue
Block a user