From daa7e33e7334f5efbe9d0f8076f9a612089bb662 Mon Sep 17 00:00:00 2001 From: Moti Cohen Date: Tue, 11 Feb 2025 16:43:24 +0200 Subject: [PATCH] Add parsing support for RDB_OPCODE_RAM_LRU for Redis Ent (No-op) (#67) Trivial parsing for the opcode RDB_OPCODE_RAM_LRU = 107. Does nothing. (Extend also rdb-cli to support --ignore-checksum) --- README.md | 2 ++ src/cli/rdb-cli.c | 9 +++++++++ src/lib/defines.h | 5 +++-- src/lib/parser.c | 13 +++++++++++++ src/lib/parser.h | 2 ++ test/dumps/redis_ent_opcode_ram_lru.rdb | Bin 0 -> 312 bytes test/test_main.c | 19 +++++++++++++++++++ 7 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 test/dumps/redis_ent_opcode_ram_lru.rdb diff --git a/README.md b/README.md index fb92d6f..3a65df3 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,7 @@ destruction, or when newer block replacing old one. Usage: rdb-cli /path/to/dump.rdb [OPTIONS] {print|json|resp|redis} [FORMAT_OPTIONS] OPTIONS: -l, --log-file Path to the log file or stdout (Default: './rdb-cli.log') + -i, --ignore-checksum Ignore RDB file checksum verification -s, --show-progress Show progress to STDOUT after every processed -k, --key Include only keys that match REGEX -K --no-key Exclude all keys that match REGEX @@ -237,6 +238,7 @@ destruction, or when newer block replacing old one. FORMAT_OPTIONS ('redis'|'resp'): -r, --support-restore Use the RESTORE command when possible -d, --del-before-write Delete each key before writing. Relevant for non-empty db + -f, --func-replace-if-exist Replace function-library if already exists in the same name rather than aborting -t, --target-redis-ver Specify the target Redis version. Helps determine which commands can be applied. Particularly crucial if support-restore being used as RESTORE is closely tied to specific RDB versions. If versions not diff --git a/src/cli/rdb-cli.c b/src/cli/rdb-cli.c index ea935af..777aac1 100644 --- a/src/cli/rdb-cli.c +++ b/src/cli/rdb-cli.c @@ -18,6 +18,7 @@ FILE* logfile = NULL; /* common options to all FORMATTERS */ typedef struct Options { const char *logfilePath; + int ignoreChecksum; int progressMb; /* print progress every MB. Set to 0 if disabled */ RdbRes (*formatFunc)(RdbParser *p, int argc, char **argv); } Options; @@ -102,6 +103,7 @@ static void printUsage(int shortUsage) { printf("Usage: rdb-cli /path/to/dump.rdb [OPTIONS] {print|json|resp|redis} [FORMAT_OPTIONS]\n"); printf("OPTIONS:\n"); printf("\t-l, --log-file Path to the log file or stdout (Default: './rdb-cli.log')\n"); + printf("\t-i, --ignore-checksum Ignore RDB file checksum verification\n"); printf("\t-s, --show-progress Show progress to STDOUT after every processed\n"); printf("\t-k, --key Include only keys that match REGEX\n"); printf("\t-K --no-key Exclude all keys that match REGEX\n"); @@ -355,6 +357,7 @@ int readCommonOptions(RdbParser *p, int argc, char* argv[], Options *options, in /* default */ options->progressMb = 0; options->logfilePath = LOG_FILE_PATH_DEF; + options->ignoreChecksum = 0; options->formatFunc = formatJson; /* parse common options until FORMAT (json/resp/redis) specified */ @@ -363,6 +366,9 @@ int readCommonOptions(RdbParser *p, int argc, char* argv[], Options *options, in if (getOptArg(argc, argv, &at, "-l", "--log-file", NULL, &(options->logfilePath))) continue; + + if (getOptArg(argc, argv, &at, "-i", "--ignore-checksum", &(options->ignoreChecksum), NULL)) + continue; if (getOptArgVal(argc, argv, &at, "-s", "--show-progress", NULL, &options->progressMb, 0, INT_MAX)) continue; @@ -471,6 +477,9 @@ int main(int argc, char **argv) RdbParser *parser = RDB_createParserRdb(NULL); RDB_setLogLevel(parser, RDB_LOG_INF); RDB_setLogger(parser, logger); + + if (options.ignoreChecksum) + RDB_IgnoreChecksum(parser); if (strcmp(input, "-") == 0) { if (RDBX_createReaderFileDesc(parser, 0 /*stdin*/, 0) == NULL) diff --git a/src/lib/defines.h b/src/lib/defines.h index 394d38b..de833a0 100644 --- a/src/lib/defines.h +++ b/src/lib/defines.h @@ -60,8 +60,9 @@ /* Garantia V1006 (current) opcodes */ /*#define RDB_OPCODE_GD_DICT 100*/ -#define RDB_OPCODE_GCAS 101 -#define RDB_OPCODE_GFLAGS 102 +#define RDB_OPCODE_GCAS 101 +#define RDB_OPCODE_GFLAGS 102 +#define __RDB_OPCODE_RAM_LRU 107 /* Available only in Redis Enterprise */ /* Defines related to the dump file format. To store 32 bits lengths for short * keys requires a lot of space, so we check the most significant 2 bits of diff --git a/src/lib/parser.c b/src/lib/parser.c index f341cf1..ad4c2ac 100644 --- a/src/lib/parser.c +++ b/src/lib/parser.c @@ -48,6 +48,7 @@ struct ParsingElementInfo peInfo[PE_MAX] = { [PE_EXPIRETIMEMSEC] = {elementExpireTimeMsec, "elementExpireTimeMsec", "Parsing expire-time-msec"}, [PE_FREQ] = {elementFreq, "elementFreq", "Parsing LFU frequency"}, [PE_IDLE] = {elementIdle, "elementIdle", "Parsing LRU idle time"}, + [__PE_RAM_LRU] = {__elementRamLru, "elementRamLru", "Parsing RAM LRU Opcode. Relevant only for Redis Ent."}, [PE_NEW_KEY] = {elementNewKey, "elementNewKey", "Parsing new key-value"}, [PE_END_KEY] = {elementEndKey, "elementEndKey", "Parsing end key"}, @@ -1528,6 +1529,7 @@ RdbStatus elementNextRdbType(RdbParser *p) { case RDB_OPCODE_RESIZEDB: return nextParsingElement(p, PE_RESIZE_DB); case RDB_OPCODE_FREQ: return nextParsingElement(p, PE_FREQ); case RDB_OPCODE_IDLE: return nextParsingElement(p, PE_IDLE); + case __RDB_OPCODE_RAM_LRU: return nextParsingElement(p, __PE_RAM_LRU); /* string */ case RDB_TYPE_STRING: return nextParsingElementKeyValue(p, PE_RAW_STRING, PE_STRING); @@ -1608,6 +1610,17 @@ RdbStatus elementIdle(RdbParser *p) { return nextParsingElement(p, PE_NEXT_RDB_TYPE); } +RdbStatus __elementRamLru(RdbParser *p) { + uint64_t dummy; + IF_NOT_OK_RETURN(rdbLoadLen(p, NULL, &dummy, NULL, NULL)); + + /*** ENTER SAFE STATE ***/ + + /* Do nothing. Relevant only for Redis Ent. */ + + return nextParsingElement(p, PE_NEXT_RDB_TYPE); +} + /*** Parsing data-types Elements ***/ RdbStatus elementString(RdbParser *p) { diff --git a/src/lib/parser.h b/src/lib/parser.h index fefcf02..735ea0c 100644 --- a/src/lib/parser.h +++ b/src/lib/parser.h @@ -130,6 +130,7 @@ typedef enum ParsingElementType { PE_EXPIRETIMEMSEC, PE_FREQ, PE_IDLE, + __PE_RAM_LRU, /* Redis Enterprise specific */ PE_NEW_KEY, PE_END_KEY, @@ -529,6 +530,7 @@ RdbStatus elementExpireTime(RdbParser *p); RdbStatus elementExpireTimeMsec(RdbParser *p); RdbStatus elementFreq(RdbParser *p); RdbStatus elementIdle(RdbParser *p); +RdbStatus __elementRamLru(RdbParser *p); /*** Struct/Data Parsing Elements ***/ RdbStatus elementString(RdbParser *p); diff --git a/test/dumps/redis_ent_opcode_ram_lru.rdb b/test/dumps/redis_ent_opcode_ram_lru.rdb new file mode 100644 index 0000000000000000000000000000000000000000..9f460d315f25887ebc157ff24058a7f9d9984ba2 GIT binary patch literal 312 zcmY+8zfQw25QlA5h4P=rU~!c?O`1$Zq71AcF|nNEbBRop$__|u>`XAAz5{|sKvBdC z@GNXb0^C$WVmp2J-S2*<$J3LuAQ*ACVNe#9-Jt1DhT|c3n=2rS+BTW%=XFtHdp>=h zxxuwX$x1BSyN4Izb`8$2n5_*$$)sqATkl9A5600bNg#$mh8T)G /dev/null "); @@ -223,6 +241,7 @@ int group_misc(void) { cmocka_unit_test(test_empty_rdb), cmocka_unit_test(test_mixed_levels_registration), cmocka_unit_test(test_checksum), + cmocka_unit_test(__test_opcode_ram_lru), cmocka_unit_test(test_report_long_error), cmocka_unit_test(test_not_support_future_rdb_version), };