mirror of https://mirror.osredm.com/root/redis.git
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
This commit is contained in:
parent
0990dec3f5
commit
aa9beaca77
|
@ -1546,6 +1546,9 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) {
|
||||||
listNode *ln;
|
listNode *ln;
|
||||||
listIter li;
|
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);
|
listRewind(server.slaves,&li);
|
||||||
while((ln = listNext(&li))) {
|
while((ln = listNext(&li))) {
|
||||||
client *slave = ln->value;
|
client *slave = ln->value;
|
||||||
|
@ -1554,7 +1557,7 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) {
|
||||||
struct redis_stat buf;
|
struct redis_stat buf;
|
||||||
|
|
||||||
if (bgsaveerr != C_OK) {
|
if (bgsaveerr != C_OK) {
|
||||||
freeClient(slave);
|
freeClientAsync(slave);
|
||||||
serverLog(LL_WARNING,"SYNC failed. BGSAVE child returned an error");
|
serverLog(LL_WARNING,"SYNC failed. BGSAVE child returned an error");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1598,7 +1601,7 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) {
|
||||||
} else {
|
} else {
|
||||||
if ((slave->repldbfd = open(server.rdb_filename,O_RDONLY)) == -1 ||
|
if ((slave->repldbfd = open(server.rdb_filename,O_RDONLY)) == -1 ||
|
||||||
redis_fstat(slave->repldbfd,&buf) == -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));
|
serverLog(LL_WARNING,"SYNC failed. Can't open/stat DB after BGSAVE: %s", strerror(errno));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1610,7 +1613,7 @@ void updateSlavesWaitingBgsave(int bgsaveerr, int type) {
|
||||||
|
|
||||||
connSetWriteHandler(slave->conn,NULL);
|
connSetWriteHandler(slave->conn,NULL);
|
||||||
if (connSetWriteHandler(slave->conn,sendBulkToSlave) == C_ERR) {
|
if (connSetWriteHandler(slave->conn,sendBulkToSlave) == C_ERR) {
|
||||||
freeClient(slave);
|
freeClientAsync(slave);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue