Skip to content

Commit 31148f6

Browse files
committed
Add RM_DefragRedisModuleDict module API
1 parent 53c1d99 commit 31148f6

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/module.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13913,6 +13913,42 @@ RedisModuleString *RM_DefragRedisModuleString(RedisModuleDefragCtx *ctx, RedisMo
1391313913
return activeDefragStringOb(str);
1391413914
}
1391513915

13916+
/* Defrag callback for radix tree iterator, called for each node,
13917+
* used in order to defrag the nodes allocations. */
13918+
int moduleDefragRaxNode(raxNode **noderef) {
13919+
raxNode *newnode = activeDefragAlloc(*noderef);
13920+
if (newnode) {
13921+
*noderef = newnode;
13922+
return 1;
13923+
}
13924+
return 0;
13925+
}
13926+
13927+
/* Defrag a RedisModuleDict previously allocated by RM_CreateDict. */
13928+
typedef void *(*RedisModuleDefragDictFunc)(RedisModuleDefragCtx *ctx, RedisModuleDict *dict, void *data, void *privdata);
13929+
RedisModuleDict *RM_DefragRedisModuleDict(RedisModuleDefragCtx *ctx, RedisModuleDict *dict, RedisModuleDefragDictFunc callback, void *privdata) {
13930+
RedisModuleDict *newdict = NULL;
13931+
rax* newrax;
13932+
raxIterator ri;
13933+
13934+
if ((newdict = activeDefragAlloc(dict)))
13935+
dict = newdict;
13936+
if ((newrax = activeDefragAlloc(dict->rax)))
13937+
dict->rax = newrax;
13938+
raxStart(&ri,dict->rax);
13939+
ri.node_cb = moduleDefragRaxNode;
13940+
moduleDefragRaxNode(&dict->rax->head);
13941+
raxSeek(&ri,"^",NULL,0);
13942+
while (raxNext(&ri)) {
13943+
void *newdata = NULL;
13944+
if (callback)
13945+
newdata = callback(ctx, dict, ri.data, privdata);
13946+
if (newdata)
13947+
raxSetData(ri.node, ri.data=newdata);
13948+
}
13949+
raxStop(&ri);
13950+
return dict;
13951+
}
1391613952

1391713953
/* Perform a late defrag of a module datatype key.
1391813954
*

src/redismodule.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -927,6 +927,7 @@ typedef int (*RedisModuleConfigSetEnumFunc)(const char *name, int val, void *pri
927927
typedef int (*RedisModuleConfigApplyFunc)(RedisModuleCtx *ctx, void *privdata, RedisModuleString **err);
928928
typedef void (*RedisModuleOnUnblocked)(RedisModuleCtx *ctx, RedisModuleCallReply *reply, void *private_data);
929929
typedef int (*RedisModuleAuthCallback)(RedisModuleCtx *ctx, RedisModuleString *username, RedisModuleString *password, RedisModuleString **err);
930+
typedef void (*RedisModuleDefragDictFunc)(RedisModuleDefragCtx *ctx, RedisModuleDict *dict, void *data, void *privdata);
930931

931932
typedef struct RedisModuleTypeMethods {
932933
uint64_t version;
@@ -1310,6 +1311,7 @@ REDISMODULE_API void *(*RedisModule_DefragAlloc)(RedisModuleDefragCtx *ctx, void
13101311
REDISMODULE_API void *(*RedisModule_DefragAllocRaw)(RedisModuleDefragCtx *ctx, size_t size) REDISMODULE_ATTR;
13111312
REDISMODULE_API void (*RedisModule_DefragFreeRaw)(RedisModuleDefragCtx *ctx, void *ptr) REDISMODULE_ATTR;
13121313
REDISMODULE_API RedisModuleString *(*RedisModule_DefragRedisModuleString)(RedisModuleDefragCtx *ctx, RedisModuleString *str) REDISMODULE_ATTR;
1314+
REDISMODULE_API RedisModuleDict *(*RedisModule_DefragRedisModuleDict)(RedisModuleDefragCtx *ctx, RedisModuleDict *dict, RedisModuleDefragDictFunc *callback, void *privdata) REDISMODULE_ATTR;
13131315
REDISMODULE_API int (*RedisModule_DefragShouldStop)(RedisModuleDefragCtx *ctx) REDISMODULE_ATTR;
13141316
REDISMODULE_API int (*RedisModule_DefragCursorSet)(RedisModuleDefragCtx *ctx, unsigned long cursor) REDISMODULE_ATTR;
13151317
REDISMODULE_API int (*RedisModule_DefragCursorGet)(RedisModuleDefragCtx *ctx, unsigned long *cursor) REDISMODULE_ATTR;

0 commit comments

Comments
 (0)