diff options
author | Oran Agra <oran@redislabs.com> | 2022-02-08 19:10:13 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-02-08 19:10:13 +0200 |
commit | aa9beaca7727993d7d996348ea1fe9699b0fd90a (patch) | |
tree | 90ea609a35239516b466cd1be80c633115b3622f /src/replication.c | |
parent | 0990dec3f5c331c7eae6e219716b4d57dd185ccb (diff) | |
download | redis-aa9beaca7727993d7d996348ea1fe9699b0fd90a.tar.gz |
Attempt to fix a rare crash in cluster tests. (#10265)
The theory is that a replica gets disconnected from within REPLCONF ACK,
so when we go up the stack, we'll crash when attempting to access
c->cmd->flags
Diffstat (limited to 'src/replication.c')
-rw-r--r-- | src/replication.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/src/replication.c b/src/replication.c index c389a1407..ebd07ce86 100644 --- a/src/replication.c +++ b/src/replication.c @@ -1546,6 +1546,9 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) { listNode *ln; listIter li; + /* Note: there's a chance we got here from within the REPLCONF ACK command + * so we must avoid using freeClient, otherwise we'll crash on our way up. */ + listRewind(server.slaves,&li); while((ln = listNext(&li))) { client *slave = ln->value; @@ -1554,7 +1557,7 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) { struct redis_stat buf; if (bgsaveerr != C_OK) { - freeClient(slave); + freeClientAsync(slave); serverLog(LL_WARNING,"SYNC failed. BGSAVE child returned an error"); continue; } @@ -1598,7 +1601,7 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) { } else { if ((slave->repldbfd = open(server.rdb_filename,O_RDONLY)) == -1 || redis_fstat(slave->repldbfd,&buf) == -1) { - freeClient(slave); + freeClientAsync(slave); serverLog(LL_WARNING,"SYNC failed. Can't open/stat DB after BGSAVE: %s", strerror(errno)); continue; } @@ -1610,7 +1613,7 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) { connSetWriteHandler(slave->conn,NULL); if (connSetWriteHandler(slave->conn,sendBulkToSlave) == C_ERR) { - freeClient(slave); + freeClientAsync(slave); continue; } } |