diff --git a/src/blocked.c b/src/blocked.c index 8acfb818..3442b9dd 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