Avoid exiting to allow diskless loading to recover from RDB short read on module AUX data (#9199)
Currently a replica is able to recover from a short read (when diskless loading is enabled) and avoid crashing/exiting, replying to the master and then the rdb could be sent again by the master for another load attempt by the replica. There were a few scenarios that were not behaving similarly, such as when there is no end-of-file marker, or when module aux data failed to load, which should be allowed to occur due to a short read. (cherry picked from commit f06d782f5abcb30efb0117841232828ed3e129bf)
This commit is contained in:
parent
abd44c8393
commit
9914b676b3
@ -2484,8 +2484,10 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) {
|
|||||||
int when_opcode = rdbLoadLen(rdb,NULL);
|
int when_opcode = rdbLoadLen(rdb,NULL);
|
||||||
int when = rdbLoadLen(rdb,NULL);
|
int when = rdbLoadLen(rdb,NULL);
|
||||||
if (rioGetReadError(rdb)) goto eoferr;
|
if (rioGetReadError(rdb)) goto eoferr;
|
||||||
if (when_opcode != RDB_MODULE_OPCODE_UINT)
|
if (when_opcode != RDB_MODULE_OPCODE_UINT) {
|
||||||
rdbReportReadError("bad when_opcode");
|
rdbReportReadError("bad when_opcode");
|
||||||
|
goto eoferr;
|
||||||
|
}
|
||||||
moduleType *mt = moduleTypeLookupModuleByID(moduleid);
|
moduleType *mt = moduleTypeLookupModuleByID(moduleid);
|
||||||
char name[10];
|
char name[10];
|
||||||
moduleTypeNameByID(name,moduleid);
|
moduleTypeNameByID(name,moduleid);
|
||||||
@ -2509,7 +2511,7 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) {
|
|||||||
if (mt->aux_load(&io,moduleid&1023, when) != REDISMODULE_OK || io.error) {
|
if (mt->aux_load(&io,moduleid&1023, when) != REDISMODULE_OK || io.error) {
|
||||||
moduleTypeNameByID(name,moduleid);
|
moduleTypeNameByID(name,moduleid);
|
||||||
serverLog(LL_WARNING,"The RDB file contains module AUX data for the module type '%s', that the responsible module is not able to load. Check for modules log above for additional clues.", name);
|
serverLog(LL_WARNING,"The RDB file contains module AUX data for the module type '%s', that the responsible module is not able to load. Check for modules log above for additional clues.", name);
|
||||||
exit(1);
|
goto eoferr;
|
||||||
}
|
}
|
||||||
if (io.ctx) {
|
if (io.ctx) {
|
||||||
moduleFreeContext(io.ctx);
|
moduleFreeContext(io.ctx);
|
||||||
@ -2518,7 +2520,7 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) {
|
|||||||
uint64_t eof = rdbLoadLen(rdb,NULL);
|
uint64_t eof = rdbLoadLen(rdb,NULL);
|
||||||
if (eof != RDB_MODULE_OPCODE_EOF) {
|
if (eof != RDB_MODULE_OPCODE_EOF) {
|
||||||
serverLog(LL_WARNING,"The RDB file contains module AUX data for the module '%s' that is not terminated by the proper module value EOF marker", name);
|
serverLog(LL_WARNING,"The RDB file contains module AUX data for the module '%s' that is not terminated by the proper module value EOF marker", name);
|
||||||
exit(1);
|
goto eoferr;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user