diff --git a/00-RELEASENOTES b/00-RELEASENOTES index 1fa620bd8..7c5a75412 100644 --- a/00-RELEASENOTES +++ b/00-RELEASENOTES @@ -11,6 +11,14 @@ CRITICAL: There is a critical bug affecting MOST USERS. Upgrade ASAP. SECURITY: There are security fixes in the release. -------------------------------------------------------------------------------- +================================================================================ +Redis 6.0.3 Released Sat May 16 18:10:21 CEST 2020 +================================================================================ + +Upgrade urgency CRITICAL: a crash introduced in 6.0.2 is now fixed. + +1eab62f7e Remove the client from CLOSE_ASAP list before caching the master. + ================================================================================ Redis 6.0.2 Released Fri May 15 22:24:36 CEST 2020 ================================================================================ diff --git a/src/networking.cpp b/src/networking.cpp index 54c0d35ee..13e7f4da3 100644 --- a/src/networking.cpp +++ b/src/networking.cpp @@ -1545,6 +1545,16 @@ bool freeClient(client *c) { /* Notify module system that this client auth status changed. */ moduleNotifyUserChanged(c); + /* If this client was scheduled for async freeing we need to remove it + * from the queue. Note that we need to do this here, because later + * we may call replicationCacheMaster() and the client should already + * be removed from the list of clients to free. */ + if (c->flags & CLIENT_CLOSE_ASAP) { + ln = listSearchKey(g_pserver->clients_to_close,c); + serverAssert(ln != NULL); + listDelNode(g_pserver->clients_to_close,ln); + } + /* If it is our master that's beging disconnected we should make sure * to cache the state to try a partial resynchronization later. * @@ -1552,9 +1562,8 @@ bool freeClient(client *c) { * some unexpected state, by checking its flags. */ if (FActiveMaster(c)) { serverLog(LL_WARNING,"Connection with master lost."); - if (!(c->flags & (CLIENT_PROTOCOL_ERROR| - CLIENT_BLOCKED))) - { + if (!(c->flags & (CLIENT_PROTOCOL_ERROR|CLIENT_BLOCKED))) { + c->flags &= ~(CLIENT_CLOSE_ASAP|CLIENT_CLOSE_AFTER_REPLY); replicationCacheMaster(MasterInfoFromClient(c), c); return false; } @@ -1622,15 +1631,7 @@ bool freeClient(client *c) { * we lost the connection with the master. */ if (c->flags & CLIENT_MASTER) replicationHandleMasterDisconnection(MasterInfoFromClient(c)); - /* If this client was scheduled for async freeing we need to remove it - * from the queue. */ - if (c->flags & CLIENT_CLOSE_ASAP) { - ln = listSearchKey(g_pserver->clients_to_close,c); - serverAssert(ln != NULL); - listDelNode(g_pserver->clients_to_close,ln); - } - - /* Remove the contribution that this client gave to our + /* Remove the contribution that this client gave to our * incrementally computed memory usage. */ g_pserver->stat_clients_type_memory[c->client_cron_last_memory_type] -= c->client_cron_last_memory_usage; @@ -3459,7 +3460,6 @@ void processEventsWhileBlocked(int iel) { } - int aof_state = g_pserver->aof_state; aeReleaseLock(); serverAssertDebug(!GlobalLocksAcquired()); try diff --git a/src/replication.cpp b/src/replication.cpp index 792ac16d1..766a9ff67 100644 --- a/src/replication.cpp +++ b/src/replication.cpp @@ -3244,9 +3244,6 @@ void replicationCacheMaster(redisMaster *mi, client *c) { /* Unlink the client from the server structures. */ unlinkClient(c); - /* Clear flags that can create issues once we reconnect the client. */ - c->flags &= ~(CLIENT_CLOSE_ASAP|CLIENT_CLOSE_AFTER_REPLY); - /* Reset the master client so that's ready to accept new commands: * we want to discard te non processed query buffers and non processed * offsets, including pending transactions, already populated arguments,