summaryrefslogtreecommitdiff
path: root/src/defrag.c
diff options
context:
space:
mode:
authorViktor Söderqvist <viktor.soderqvist@est.tech>2021-08-31 08:25:36 +0200
committerGitHub <noreply@github.com>2021-08-30 23:25:36 -0700
commitf24c63a292e045d4b14b82b25981f00a95c1767a (patch)
tree8d378dd0e6eb9fc016840e3652236b34fa9a9b3f /src/defrag.c
parent1e7ad894d2ecb9ad73d68ff1f1102195582b1469 (diff)
downloadredis-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.c10
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;
}