diff options
author | Viktor Söderqvist <viktor.soderqvist@est.tech> | 2021-08-31 08:25:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-30 23:25:36 -0700 |
commit | f24c63a292e045d4b14b82b25981f00a95c1767a (patch) | |
tree | 8d378dd0e6eb9fc016840e3652236b34fa9a9b3f /src/defrag.c | |
parent | 1e7ad894d2ecb9ad73d68ff1f1102195582b1469 (diff) | |
download | redis-f24c63a292e045d4b14b82b25981f00a95c1767a.tar.gz |
Slot-to-keys using dict entry metadata (#9356)
* Enhance dict to support arbitrary metadata carried in dictEntry
Co-authored-by: Viktor Söderqvist <viktor.soderqvist@est.tech>
* Rewrite slot-to-keys mapping to linked lists using dict entry metadata
This is a memory enhancement for Redis Cluster.
The radix tree slots_to_keys (which duplicates all key names prefixed with their
slot number) is replaced with a linked list for each slot. The dict entries of
the same cluster slot form a linked list and the pointers are stored as metadata
in each dict entry of the main DB dict.
This commit also moves the slot-to-key API from db.c to cluster.c.
Co-authored-by: Jim Brunner <brunnerj@amazon.com>
Diffstat (limited to 'src/defrag.c')
-rw-r--r-- | src/defrag.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/src/defrag.c b/src/defrag.c index c804af370..f5d56078d 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -34,6 +34,7 @@ */ #include "server.h" +#include "cluster.h" #include <time.h> #include <assert.h> #include <stddef.h> @@ -45,7 +46,7 @@ int je_get_defrag_hint(void* ptr); /* forward declarations*/ -void defragDictBucketCallback(void *privdata, dictEntry **bucketref); +void defragDictBucketCallback(dict *d, dictEntry **bucketref); dictEntry* replaceSatelliteDictKeyPtrAndOrDefragDictEntry(dict *d, sds oldkey, sds newkey, uint64_t hash, long *defragged); /* Defrag helper for generic allocations. @@ -895,12 +896,15 @@ void defragScanCallback(void *privdata, const dictEntry *de) { /* Defrag scan callback for each hash table bucket, * used in order to defrag the dictEntry allocations. */ -void defragDictBucketCallback(void *privdata, dictEntry **bucketref) { - UNUSED(privdata); /* NOTE: this function is also used by both activeDefragCycle and scanLaterHash, etc. don't use privdata */ +void defragDictBucketCallback(dict *d, dictEntry **bucketref) { while(*bucketref) { dictEntry *de = *bucketref, *newde; if ((newde = activeDefragAlloc(de))) { *bucketref = newde; + if (server.cluster_enabled && d == server.db[0].dict) { + /* Cluster keyspace dict. Update slot-to-entries mapping. */ + slotToKeyReplaceEntry(newde); + } } bucketref = &(*bucketref)->next; } |