summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAriel Shtul <ashtul@gmail.com>2020-09-22 10:18:07 +0300
committerOran Agra <oran@redislabs.com>2020-10-27 08:49:22 +0200
commit77f91e09cf70d96ee0bc1806d503fc69322257c5 (patch)
tree4a026503bedb9e17e86d12804bc4aab0905d6ff2
parentd60953bf2588f1dc597ff63d6859415348906efd (diff)
downloadredis-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.c2
-rw-r--r--src/rdb.h1
-rw-r--r--src/redis-check-rdb.c19
3 files changed, 21 insertions, 1 deletions
diff --git a/src/rdb.c b/src/rdb.c
index 4f859a3d3..a1e966eae 100644
--- a/src/rdb.c
+++ b/src/rdb.c
@@ -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. */
diff --git a/src/rdb.h b/src/rdb.h
index 40a50f7ba..513c99df6 100644
--- a/src/rdb.h
+++ b/src/rdb.h
@@ -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);