Skip to content

Commit e03279c

Browse files
committed
Improve valkey-check-rdb printouts and add tests
Signed-off-by: Viktor Söderqvist <[email protected]>
1 parent 790650f commit e03279c

File tree

2 files changed

+76
-7
lines changed

2 files changed

+76
-7
lines changed

src/valkey-check-rdb.c

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ struct {
7676
rio *rio;
7777
robj *key; /* Current key we are reading. */
7878
int key_type; /* Current key type if != -1. */
79+
int rdbver; /* RDB version. */
7980
unsigned long keys; /* Number of keys processed. */
8081
unsigned long expires; /* Number of keys with an expire. */
8182
unsigned long already_expired; /* Number of keys already expired. */
@@ -625,13 +626,17 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
625626
goto err;
626627
}
627628
rdbver = atoi(buf + 6);
628-
if (rdbver < 1 || rdbver > RDB_VERSION ||
629+
if (rdbver < 1 ||
629630
(rdbver < RDB_FOREIGN_VERSION_MIN && !is_redis_magic) ||
630-
(rdbver >= RDB_FOREIGN_VERSION_MIN && rdbver <= RDB_FOREIGN_VERSION_MAX) ||
631631
(rdbver > RDB_FOREIGN_VERSION_MAX && !is_valkey_magic)) {
632632
rdbCheckError("Can't handle RDB format version %d", rdbver);
633633
goto err;
634+
} else if (rdbver > RDB_VERSION) {
635+
rdbCheckInfo("Future RDB version %d detected", rdbver);
636+
} else if (rdbIsForeignVersion(rdbver)) {
637+
rdbCheckInfo("Foreign RDB version %d detected", rdbver);
634638
}
639+
rdbstate.rdbver = rdbver;
635640

636641
expiretime = -1;
637642
while (1) {
@@ -689,6 +694,12 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
689694
if ((db_size = rdbLoadLen(&rdb, NULL)) == RDB_LENERR) goto eoferr;
690695
if ((expires_size = rdbLoadLen(&rdb, NULL)) == RDB_LENERR) goto eoferr;
691696
continue; /* Read type again. */
697+
} else if (type == RDB_OPCODE_SLOT_INFO) {
698+
/* Hint used in foreign RDB versions. */
699+
if (rdbLoadLen(&rdb, NULL) == RDB_LENERR) goto eoferr;
700+
if (rdbLoadLen(&rdb, NULL) == RDB_LENERR) goto eoferr;
701+
if (rdbLoadLen(&rdb, NULL) == RDB_LENERR) goto eoferr;
702+
continue; /* Read type again. */
692703
} else if (type == RDB_OPCODE_AUX) {
693704
/* AUX: generic string-string fields. Use to add state to RDB
694705
* which is backward compatible. Implementations of RDB loading
@@ -742,11 +753,19 @@ int redis_check_rdb(char *rdbfilename, FILE *fp) {
742753
}
743754
rdbstate.functions_num++;
744755
continue;
745-
} else {
746-
if (!rdbIsObjectType(type)) {
756+
} else if (rdbIsForeignVersion(rdbver) &&
757+
type >= RDB_FOREIGN_TYPE_MIN &&
758+
type <= RDB_FOREIGN_TYPE_MAX) {
759+
rdbCheckError("Unknown object type %d in RDB file with foreign version %d", type, rdbver);
760+
goto err;
761+
} else if (!rdbIsObjectType(type)) {
762+
if (rdbver > RDB_VERSION) {
763+
rdbCheckError("Unknown object type %d in RDB file with future version %d", type, rdbver);
764+
} else {
747765
rdbCheckError("Invalid object type: %d", type);
748-
goto err;
749766
}
767+
goto err;
768+
} else {
750769
rdbstate.key_type = type;
751770
}
752771

@@ -894,8 +913,13 @@ int redis_check_rdb_main(int argc, char **argv, FILE *fp) {
894913
rdbCheckInfo("Checking RDB file %s", argv[1]);
895914
rdbCheckSetupSignals();
896915
int retval = redis_check_rdb(argv[1], fp);
916+
rdbCheckInfo("Check RDB returned error code %d (0 means success)", retval);
897917
if (retval == 0) {
898-
rdbCheckInfo("\\o/ RDB looks OK! \\o/");
918+
if (rdbIsForeignVersion(rdbstate.rdbver) || rdbstate.rdbver > RDB_VERSION) {
919+
rdbCheckInfo("\\o/ RDB looks OK, but loading requires config 'rdb-version-check relaxed'");
920+
} else {
921+
rdbCheckInfo("\\o/ RDB looks OK! \\o/");
922+
}
899923
rdbShowGenericInfo();
900924
}
901925
if (fp) return (retval == 0) ? C_OK : C_ERR;

tests/integration/valkey-check-rdb.tcl

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,51 @@ proc get_function_code {args} {
22
return [format "#!%s name=%s\nserver.register_function('%s', function(KEYS, ARGV)\n %s \nend)" [lindex $args 0] [lindex $args 1] [lindex $args 2] [lindex $args 3]]
33
}
44

5+
tags {"check-rdb external:skip logreqres:skip"} {
6+
test {Check old valid RDB} {
7+
catch {
8+
exec src/valkey-check-rdb tests/assets/encodings.rdb
9+
} result
10+
assert_match {*\[offset ???\] \\o/ RDB looks OK! \\o/*} $result
11+
}
12+
13+
test {Check foreign RDB without unknown data} {
14+
catch {
15+
exec src/valkey-check-rdb tests/assets/encodings-rdb12.rdb
16+
} result
17+
assert_match {*\[offset ?\] Foreign RDB version 12 detected*} $result
18+
assert_match {*\[offset ???\] \\o/ RDB looks OK, but loading requires config 'rdb-version-check relaxed'*} $result
19+
}
20+
21+
test {Check foreign RDB with unknown data} {
22+
catch {
23+
exec src/valkey-check-rdb tests/assets/encodings-rdb75-unknown-types.rdb
24+
} result
25+
assert_match {*\[offset ?\] Foreign RDB version 75 detected*} $result
26+
assert_match {*--- RDB ERROR DETECTED ---*} $result
27+
assert_match {*\[offset ??\] Unknown object type 150 in RDB file with foreign version 75*} $result
28+
assert_no_match {*RDB looks OK*} $result
29+
}
30+
31+
test {Check future RDB without unknown data} {
32+
catch {
33+
exec src/valkey-check-rdb tests/assets/encodings-rdb987.rdb
34+
} result
35+
assert_match {*\[offset ?\] Future RDB version 987 detected*} $result
36+
assert_match {*\[offset ???\] \\o/ RDB looks OK, but loading requires config 'rdb-version-check relaxed'*} $result
37+
}
38+
39+
test {Check future RDB with unknown data} {
40+
catch {
41+
exec src/valkey-check-rdb tests/assets/encodings-rdb987-unknown-types.rdb
42+
} result
43+
assert_match {*\[offset ?\] Future RDB version 987 detected*} $result
44+
assert_match {*--- RDB ERROR DETECTED ---*} $result
45+
assert_match {*\[offset ??\] Unknown object type 150 in RDB file with future version 987*} $result
46+
assert_no_match {*RDB looks OK*} $result
47+
}
48+
}
49+
550
tags {"check-rdb network external:skip logreqres:skip"} {
651
start_server {} {
752
test "test valkey-check-rdb stats with empty RDB" {
@@ -96,4 +141,4 @@ tags {"check-rdb network external:skip logreqres:skip"} {
96141
assert_match "*db.5.type.stream.keys.total:10*" $result
97142
}
98143
}
99-
}
144+
}

0 commit comments

Comments
 (0)