mirror of https://github.com/redis/redis.git
				
				
				
			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 f06d782f5a)
			
			
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…
	
		Reference in New Issue