From ded8d993b7eb8e7fbf165da4fcba7f22a44ea95d Mon Sep 17 00:00:00 2001 From: guybe7 Date: Wed, 30 Oct 2024 17:32:51 +0800 Subject: [PATCH] Modules: defrag CB should take robj, not sds (#13627) Added a log of the keyname in the test modules to reproduce the problem (tests crash without the fix) --- src/defrag.c | 9 ++++++--- tests/modules/defragtest.c | 3 ++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/defrag.c b/src/defrag.c index a819eb8ac..d3f4ceee6 100644 --- a/src/defrag.c +++ b/src/defrag.c @@ -729,8 +729,9 @@ void defragStream(redisDb *db, dictEntry *kde) { void defragModule(redisDb *db, dictEntry *kde) { robj *obj = dictGetVal(kde); serverAssert(obj->type == OBJ_MODULE); - - if (!moduleDefragValue(dictGetKey(kde), obj, db->id)) + robj keyobj; + initStaticStringObject(keyobj, dictGetKey(kde)); + if (!moduleDefragValue(&keyobj, obj, db->id)) defragLater(db, kde); } @@ -940,7 +941,9 @@ int defragLaterItem(dictEntry *de, unsigned long *cursor, long long endtime, int } else if (ob->type == OBJ_STREAM) { return scanLaterStreamListpacks(ob, cursor, endtime); } else if (ob->type == OBJ_MODULE) { - return moduleLateDefrag(dictGetKey(de), ob, cursor, endtime, dbid); + robj keyobj; + initStaticStringObject(keyobj, dictGetKey(de)); + return moduleLateDefrag(&keyobj, ob, cursor, endtime, dbid); } else { *cursor = 0; /* object type may have changed since we schedule it for later */ } diff --git a/tests/modules/defragtest.c b/tests/modules/defragtest.c index a27b57e13..597b5aa79 100644 --- a/tests/modules/defragtest.c +++ b/tests/modules/defragtest.c @@ -161,13 +161,14 @@ size_t FragFreeEffort(RedisModuleString *key, const void *value) { } int FragDefrag(RedisModuleDefragCtx *ctx, RedisModuleString *key, void **value) { - REDISMODULE_NOT_USED(key); unsigned long i = 0; int steps = 0; int dbid = RedisModule_GetDbIdFromDefragCtx(ctx); RedisModule_Assert(dbid != -1); + RedisModule_Log(NULL, "notice", "Defrag key: %s", RedisModule_StringPtrLen(key, NULL)); + /* Attempt to get cursor, validate it's what we're exepcting */ if (RedisModule_DefragCursorGet(ctx, &i) == REDISMODULE_OK) { if (i > 0) datatype_resumes++;