In Redis RDB check: more details in error reportings.

This commit is contained in:
antirez 2016-07-01 15:26:55 +02:00
parent e697153d18
commit 7e220a964a

View File

@ -41,22 +41,29 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/param.h> #include <sys/param.h>
#define rdbExitReportCorruptRDB(reason) rdbCheckThenExit(reason, __LINE__); #define rdbExitReportCorruptRDB(...) rdbCheckThenExit(__LINE__,__VA_ARGS__)
extern int rdbCheckMode; extern int rdbCheckMode;
void rdbCheckError(const char *fmt, ...); void rdbCheckError(const char *fmt, ...);
void rdbCheckSetError(const char *fmt, ...); void rdbCheckSetError(const char *fmt, ...);
void rdbCheckThenExit(char *reason, int where) { void rdbCheckThenExit(int linenum, char *reason, ...) {
if (!rdbCheckMode) { va_list ap;
serverLog(LL_WARNING, "Corrupt RDB detected at rdb.c:%d (%s). " char msg[1024];
"Running 'redis-check-rdb %s'", int len;
where, reason, server.rdb_filename);
len = snprintf(msg,sizeof(msg),
"Internal error in RDB reading function at rdb.c:%d -> ", linenum);
va_start(ap,reason);
vsnprintf(msg+len,sizeof(msg)-len,reason,ap);
va_end(ap);
if (!rdbCheckMode) {
serverLog(LL_WARNING, "%s", msg);
char *argv[2] = {"",server.rdb_filename}; char *argv[2] = {"",server.rdb_filename};
redis_check_rdb_main(2,argv); redis_check_rdb_main(2,argv);
} else { } else {
rdbCheckError("Internal error in RDB reading function at rdb.c:%d (%s)", rdbCheckError("%s",msg);
where, reason);
} }
exit(1); exit(1);
} }
@ -172,7 +179,8 @@ int rdbLoadLenByRef(rio *rdb, int *isencoded, uint64_t *lenptr) {
if (rioRead(rdb,&len,8) == 0) return -1; if (rioRead(rdb,&len,8) == 0) return -1;
*lenptr = ntohu64(len); *lenptr = ntohu64(len);
} else { } else {
rdbExitReportCorruptRDB("Unknown length encoding in rdbLoadLen()"); rdbExitReportCorruptRDB(
"Unknown length encoding %d in rdbLoadLen()",type);
return -1; /* Never reached. */ return -1; /* Never reached. */
} }
return 0; return 0;
@ -240,7 +248,7 @@ void *rdbLoadIntegerObject(rio *rdb, int enctype, int flags, size_t *lenptr) {
val = (int32_t)v; val = (int32_t)v;
} else { } else {
val = 0; /* anti-warning */ val = 0; /* anti-warning */
rdbExitReportCorruptRDB("Unknown RDB integer encoding type"); rdbExitReportCorruptRDB("Unknown RDB integer encoding type %d",enctype);
} }
if (plain || sds) { if (plain || sds) {
char buf[LONG_STR_SIZE], *p; char buf[LONG_STR_SIZE], *p;
@ -457,7 +465,7 @@ void *rdbGenericLoadStringObject(rio *rdb, int flags, size_t *lenptr) {
case RDB_ENC_LZF: case RDB_ENC_LZF:
return rdbLoadLzfStringObject(rdb,flags,lenptr); return rdbLoadLzfStringObject(rdb,flags,lenptr);
default: default:
rdbExitReportCorruptRDB("Unknown RDB encoding type"); rdbExitReportCorruptRDB("Unknown RDB string encoding type %d",len);
} }
} }
@ -1288,7 +1296,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
hashTypeConvert(o, OBJ_ENCODING_HT); hashTypeConvert(o, OBJ_ENCODING_HT);
break; break;
default: default:
rdbExitReportCorruptRDB("Unknown encoding"); rdbExitReportCorruptRDB("Unknown RDB encoding type %d",rdbtype);
break; break;
} }
} else if (rdbtype == RDB_TYPE_MODULE) { } else if (rdbtype == RDB_TYPE_MODULE) {
@ -1313,7 +1321,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
} }
o = createModuleObject(mt,ptr); o = createModuleObject(mt,ptr);
} else { } else {
rdbExitReportCorruptRDB("Unknown object type"); rdbExitReportCorruptRDB("Unknown RDB encoding type %d",rdbtype);
} }
return o; return o;
} }