mirror of
https://github.com/fluencelabs/redis
synced 2025-04-02 15:51:05 +00:00
Remove client from list of unblocked clients when it is free'd
This commit is contained in:
parent
b8cfcea424
commit
3bcffcbe5b
@ -456,6 +456,13 @@ void freeClient(redisClient *c) {
|
|||||||
ln = listSearchKey(server.clients,c);
|
ln = listSearchKey(server.clients,c);
|
||||||
redisAssert(ln != NULL);
|
redisAssert(ln != NULL);
|
||||||
listDelNode(server.clients,ln);
|
listDelNode(server.clients,ln);
|
||||||
|
/* When client was just unblocked because of a blocking operation,
|
||||||
|
* remove it from the list with unblocked clients. */
|
||||||
|
if (c->flags & REDIS_UNBLOCKED) {
|
||||||
|
ln = listSearchKey(server.unblocked_clients,c);
|
||||||
|
redisAssert(ln != NULL);
|
||||||
|
listDelNode(server.unblocked_clients,ln);
|
||||||
|
}
|
||||||
/* Remove from the list of clients waiting for swapped keys, or ready
|
/* Remove from the list of clients waiting for swapped keys, or ready
|
||||||
* to be restarted, but not yet woken up again. */
|
* to be restarted, but not yet woken up again. */
|
||||||
if (c->flags & REDIS_IO_WAIT) {
|
if (c->flags & REDIS_IO_WAIT) {
|
||||||
|
@ -688,6 +688,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
|
|||||||
redisAssert(ln != NULL);
|
redisAssert(ln != NULL);
|
||||||
c = ln->value;
|
c = ln->value;
|
||||||
listDelNode(server.unblocked_clients,ln);
|
listDelNode(server.unblocked_clients,ln);
|
||||||
|
c->flags &= ~REDIS_UNBLOCKED;
|
||||||
|
|
||||||
/* Process remaining data in the input buffer. */
|
/* Process remaining data in the input buffer. */
|
||||||
if (c->querybuf && sdslen(c->querybuf) > 0)
|
if (c->querybuf && sdslen(c->querybuf) > 0)
|
||||||
|
@ -136,6 +136,8 @@
|
|||||||
#define REDIS_IO_WAIT 32 /* The client is waiting for Virtual Memory I/O */
|
#define REDIS_IO_WAIT 32 /* The client is waiting for Virtual Memory I/O */
|
||||||
#define REDIS_DIRTY_CAS 64 /* Watched keys modified. EXEC will fail. */
|
#define REDIS_DIRTY_CAS 64 /* Watched keys modified. EXEC will fail. */
|
||||||
#define REDIS_CLOSE_AFTER_REPLY 128 /* Close after writing entire reply. */
|
#define REDIS_CLOSE_AFTER_REPLY 128 /* Close after writing entire reply. */
|
||||||
|
#define REDIS_UNBLOCKED 256 /* This client was unblocked and is stored in
|
||||||
|
server.unblocked_clients */
|
||||||
|
|
||||||
/* Client request types */
|
/* Client request types */
|
||||||
#define REDIS_REQ_INLINE 1
|
#define REDIS_REQ_INLINE 1
|
||||||
|
@ -773,7 +773,8 @@ void unblockClientWaitingData(redisClient *c) {
|
|||||||
zfree(c->bpop.keys);
|
zfree(c->bpop.keys);
|
||||||
c->bpop.keys = NULL;
|
c->bpop.keys = NULL;
|
||||||
c->bpop.target = NULL;
|
c->bpop.target = NULL;
|
||||||
c->flags &= (~REDIS_BLOCKED);
|
c->flags &= ~REDIS_BLOCKED;
|
||||||
|
c->flags |= REDIS_UNBLOCKED;
|
||||||
server.bpop_blocked_clients--;
|
server.bpop_blocked_clients--;
|
||||||
listAddNodeTail(server.unblocked_clients,c);
|
listAddNodeTail(server.unblocked_clients,c);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user