diff options
author | Ariel Shtul <ashtul@gmail.com> | 2020-09-22 10:18:07 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-22 10:18:07 +0300 |
commit | 63a05dde462c1be4bd74c32630eca6e794ae440a (patch) | |
tree | 4fce39c89d19790886abd6b1338dcd11ea8798c7 | |
parent | 1bb5794a1fa1527ea9ce181269f2c8c1714fc045 (diff) | |
download | redis-63a05dde462c1be4bd74c32630eca6e794ae440a.tar.gz |
Fix redis-check-rdb support for modules aux data (#7826)
redis-check-rdb was unable to parse rdb files containing module aux data.
Co-authored-by: Oran Agra <oran@redislabs.com>
-rw-r--r-- | src/rdb.c | 2 | ||||
-rw-r--r-- | src/rdb.h | 1 | ||||
-rw-r--r-- | src/redis-check-rdb.c | 19 |
3 files changed, 21 insertions, 1 deletions
@@ -1146,6 +1146,8 @@ ssize_t rdbSaveSingleModuleAux(rio *rdb, int when, moduleType *mt) { /* Save a module-specific aux value. */ RedisModuleIO io; int retval = rdbSaveType(rdb, RDB_OPCODE_MODULE_AUX); + if (retval == -1) return -1; + io.bytes += retval; /* Write the "module" identifier as prefix, so that we'll be able * to call the right module during loading. */ @@ -149,6 +149,7 @@ robj *rdbLoadObject(int type, rio *rdb, sds key); void backgroundSaveDoneHandler(int exitcode, int bysignal); int rdbSaveKeyValuePair(rio *rdb, robj *key, robj *val, long long expiretime); ssize_t rdbSaveSingleModuleAux(rio *rdb, int when, moduleType *mt); +robj *rdbLoadCheckModuleValue(rio *rdb, char *modulename); robj *rdbLoadStringObject(rio *rdb); ssize_t rdbSaveStringObject(rio *rdb, robj *obj); ssize_t rdbSaveRawString(rio *rdb, unsigned char *s, size_t len); diff --git a/src/redis-check-rdb.c b/src/redis-check-rdb.c index 592feaf42..a9d110aa8 100644 --- a/src/redis-check-rdb.c +++ b/src/redis-check-rdb.c @@ -58,6 +58,7 @@ struct { #define RDB_CHECK_DOING_CHECK_SUM 5 #define RDB_CHECK_DOING_READ_LEN 6 #define RDB_CHECK_DOING_READ_AUX 7 +#define RDB_CHECK_DOING_READ_MODULE_AUX 8 char *rdb_check_doing_string[] = { "start", @@ -67,7 +68,8 @@ char *rdb_check_doing_string[] = { "read-object-value", "check-sum", "read-len", - "read-aux" + "read-aux", + "read-module-aux" }; char *rdb_type_string[] = { @@ -272,6 +274,21 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) { decrRefCount(auxkey); decrRefCount(auxval); continue; /* Read type again. */ + } else if (type == RDB_OPCODE_MODULE_AUX) { + /* AUX: Auxiliary data for modules. */ + uint64_t moduleid, when_opcode, when; + rdbstate.doing = RDB_CHECK_DOING_READ_MODULE_AUX; + if ((moduleid = rdbLoadLen(&rdb,NULL)) == RDB_LENERR) goto eoferr; + if ((when_opcode = rdbLoadLen(&rdb,NULL)) == RDB_LENERR) goto eoferr; + if ((when = rdbLoadLen(&rdb,NULL)) == RDB_LENERR) goto eoferr; + + char name[10]; + moduleTypeNameByID(name,moduleid); + rdbCheckInfo("MODULE AUX for: %s", name); + + robj *o = rdbLoadCheckModuleValue(&rdb,name); + decrRefCount(o); + continue; /* Read type again. */ } else { if (!rdbIsObjectType(type)) { rdbCheckError("Invalid object type: %d", type); |