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 = rdbLoadLen(rdb,NULL);
 | 
			
		||||
            if (rioGetReadError(rdb)) goto eoferr;
 | 
			
		||||
            if (when_opcode != RDB_MODULE_OPCODE_UINT)
 | 
			
		||||
            if (when_opcode != RDB_MODULE_OPCODE_UINT) {
 | 
			
		||||
                rdbReportReadError("bad when_opcode");
 | 
			
		||||
                goto eoferr;
 | 
			
		||||
            }
 | 
			
		||||
            moduleType *mt = moduleTypeLookupModuleByID(moduleid);
 | 
			
		||||
            char name[10];
 | 
			
		||||
            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) {
 | 
			
		||||
                    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);
 | 
			
		||||
                    exit(1);
 | 
			
		||||
                    goto eoferr;
 | 
			
		||||
                }
 | 
			
		||||
                if (io.ctx) {
 | 
			
		||||
                    moduleFreeContext(io.ctx);
 | 
			
		||||
| 
						 | 
				
			
			@ -2518,7 +2520,7 @@ int rdbLoadRio(rio *rdb, int rdbflags, rdbSaveInfo *rsi) {
 | 
			
		|||
                uint64_t eof = rdbLoadLen(rdb,NULL);
 | 
			
		||||
                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);
 | 
			
		||||
                    exit(1);
 | 
			
		||||
                    goto eoferr;
 | 
			
		||||
                }
 | 
			
		||||
                continue;
 | 
			
		||||
            } else {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue