diff options
author | Ariel Shtul <ashtul@gmail.com> | 2020-09-22 10:18:07 +0300 |
---|---|---|
committer | Oran Agra <oran@redislabs.com> | 2020-10-27 08:49:22 +0200 |
commit | 77f91e09cf70d96ee0bc1806d503fc69322257c5 (patch) | |
tree | 4a026503bedb9e17e86d12804bc4aab0905d6ff2 | |
parent | d60953bf2588f1dc597ff63d6859415348906efd (diff) | |
download | redis-77f91e09cf70d96ee0bc1806d503fc69322257c5.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>
(cherry picked from commit 63a05dde462c1be4bd74c32630eca6e794ae440a)
-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
@@ -1097,6 +1097,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. */ @@ -146,6 +146,7 @@ robj *rdbLoadObject(int type, rio *rdb, robj *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 ec00ee71c..0d190ac6f 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[] = { @@ -270,6 +272,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); |