diff options
author | perryitay <85821686+perryitay@users.noreply.github.com> | 2021-11-03 20:47:18 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-03 20:47:18 +0200 |
commit | f27083a4a8a6682e391a533724c904c69852c0a0 (patch) | |
tree | 74a12c1cbb3f7885ef5275a96227b12925efc114 /src/debug.c | |
parent | f11a2d4dd764c996b2d0c0cb5abde13f2445b40c (diff) | |
download | redis-f27083a4a8a6682e391a533724c904c69852c0a0.tar.gz |
Add support for list type to store elements larger than 4GB (#9357)
Redis lists are stored in quicklist, which is currently a linked list of ziplists.
Ziplists are limited to storing elements no larger than 4GB, so when bigger
items are added they're getting truncated.
This PR changes quicklists so that they're capable of storing large items
in quicklist nodes that are plain string buffers rather than ziplist.
As part of the PR there were few other changes in redis:
1. new DEBUG sub-commands:
- QUICKLIST-PACKED-THRESHOLD - set the threshold of for the node type to
be plan or ziplist. default (1GB)
- QUICKLIST <key> - Shows low level info about the quicklist encoding of <key>
2. rdb format change:
- A new type was added - RDB_TYPE_LIST_QUICKLIST_2 .
- container type (packed / plain) was added to the beginning of the rdb object
(before the actual node list).
3. testing:
- Tests that requires over 100MB will be by default skipped. a new flag was
added to 'runtest' to run the large memory tests (not used by default)
Co-authored-by: sundb <sundbcn@gmail.com>
Co-authored-by: Oran Agra <oran@redislabs.com>
Diffstat (limited to 'src/debug.c')
-rw-r--r-- | src/debug.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/src/debug.c b/src/debug.c index 114b1bd92..77b145b61 100644 --- a/src/debug.c +++ b/src/debug.c @@ -29,9 +29,11 @@ */ #include "server.h" +#include "util.h" #include "sha1.h" /* SHA1 is used for DEBUG DIGEST */ #include "crc64.h" #include "bio.h" +#include "quicklist.h" #include <arpa/inet.h> #include <signal.h> @@ -459,6 +461,9 @@ void debugCommand(client *c) { " Setting it to 0 disables expiring keys in background when they are not", " accessed (otherwise the Redis behavior). Setting it to 1 reenables back the", " default.", +"QUICKLIST-PACKED-THRESHOLD <size>", +" Sets the threshold for elements to be inserted as plain vs packed nodes", +" Default value is 1GB, allows values up to 4GB", "SET-SKIP-CHECKSUM-VALIDATION <0|1>", " Enables or disables checksum checks for RDB files and RESTORE's payload.", "SLEEP <seconds>", @@ -469,6 +474,9 @@ void debugCommand(client *c) { " Return the size of different Redis core C structures.", "ZIPLIST <key>", " Show low level info about the ziplist encoding of <key>.", +"QUICKLIST <key> [<0|1>]", +" Show low level info about the quicklist encoding of <key>." +" The optional argument (0 by default) sets the level of detail", "CLIENT-EVICTION", " Show low level client eviction pools info (maxmemory-clients).", "PAUSE-CRON <0|1>", @@ -652,6 +660,21 @@ NULL ziplistRepr(o->ptr); addReplyStatus(c,"Ziplist structure printed on stdout"); } + } else if (!strcasecmp(c->argv[1]->ptr,"quicklist") && (c->argc == 3 || c->argc == 4)) { + robj *o; + + if ((o = objectCommandLookupOrReply(c,c->argv[2],shared.nokeyerr)) + == NULL) return; + + int full = 0; + if (c->argc == 4) + full = atoi(c->argv[3]->ptr); + if (o->encoding != OBJ_ENCODING_QUICKLIST) { + addReplyError(c,"Not a quicklist encoded object."); + } else { + quicklistRepr(o->ptr, full); + addReplyStatus(c,"Quicklist structure printed on stdout"); + } } else if (!strcasecmp(c->argv[1]->ptr,"populate") && c->argc >= 3 && c->argc <= 5) { long keys, j; @@ -782,6 +805,16 @@ NULL { server.active_expire_enabled = atoi(c->argv[2]->ptr); addReply(c,shared.ok); + } else if (!strcasecmp(c->argv[1]->ptr,"quicklist-packed-threshold") && + c->argc == 3) + { + int memerr; + unsigned long long sz = memtoull((const char *)c->argv[2]->ptr, &memerr); + if (memerr || !quicklistisSetPackedThreshold(sz)) { + addReplyError(c, "argument must be a memory value bigger then 1 and smaller than 4gb"); + } else { + addReply(c,shared.ok); + } } else if (!strcasecmp(c->argv[1]->ptr,"set-skip-checksum-validation") && c->argc == 3) { |