From f7bd816bbbcb5bb944750c10d798b6b9e63e1d3b Mon Sep 17 00:00:00 2001 From: antirez Date: Tue, 5 May 2015 16:32:53 +0200 Subject: [PATCH] Don't put clients into unblocked list multiple times --- src/blocked.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/blocked.c b/src/blocked.c index 8acfb8184..3442b9dd4 100644 --- a/src/blocked.c +++ b/src/blocked.c @@ -137,10 +137,14 @@ void unblockClient(redisClient *c) { /* Clear the flags, and put the client in the unblocked list so that * we'll process new commands in its query buffer ASAP. */ c->flags &= ~REDIS_BLOCKED; - c->flags |= REDIS_UNBLOCKED; c->btype = REDIS_BLOCKED_NONE; server.bpop_blocked_clients--; - listAddNodeTail(server.unblocked_clients,c); + /* The client may already be into the unblocked list because of a previous + * blocking operation, don't add back it into the list multiple times. */ + if (!(c->flags & REDIS_UNBLOCKED)) { + c->flags |= REDIS_UNBLOCKED; + listAddNodeTail(server.unblocked_clients,c); + } } /* This function gets called when a blocked client timed out in order to