From 5d56931396a5650a50558a992609691955edbc9e Mon Sep 17 00:00:00 2001 From: Joan Fontanals Martinez Date: Thu, 27 Nov 2025 12:21:03 +0100 Subject: [PATCH 1/4] redismodule.h with DelayTrimming flags --- redismodule.h | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/redismodule.h b/redismodule.h index 2918e92..8572fc6 100644 --- a/redismodule.h +++ b/redismodule.h @@ -46,7 +46,7 @@ typedef long long ustime_t; /* API versions. */ #define REDISMODULE_APIVER_1 1 -/* Version of the RedisModuleTypeMethods structure. Once the RedisModuleTypeMethods +/* Version of the RedisModuleTypeMethods structure. Once the RedisModuleTypeMethods * structure is changed, this version number needs to be changed synchronistically. */ #define REDISMODULE_TYPE_METHOD_VERSION 5 @@ -67,11 +67,14 @@ typedef long long ustime_t; #define REDISMODULE_OPEN_KEY_NOEFFECTS (1<<20) /* Allow access expired key that haven't deleted yet */ #define REDISMODULE_OPEN_KEY_ACCESS_EXPIRED (1<<21) +/* Allow access trimmed key that haven't deleted yet */ +#define REDISMODULE_OPEN_KEY_ACCESS_TRIMMED (1<<22) + /* Mask of all REDISMODULE_OPEN_KEY_* values. Any new mode should be added to this list. * Should not be used directly by the module, use RM_GetOpenKeyModesAll instead. * Located here so when we will add new modes we will not forget to update it. */ -#define _REDISMODULE_OPEN_KEY_ALL REDISMODULE_READ | REDISMODULE_WRITE | REDISMODULE_OPEN_KEY_NOTOUCH | REDISMODULE_OPEN_KEY_NONOTIFY | REDISMODULE_OPEN_KEY_NOSTATS | REDISMODULE_OPEN_KEY_NOEXPIRE | REDISMODULE_OPEN_KEY_NOEFFECTS | REDISMODULE_OPEN_KEY_ACCESS_EXPIRED +#define _REDISMODULE_OPEN_KEY_ALL REDISMODULE_READ | REDISMODULE_WRITE | REDISMODULE_OPEN_KEY_NOTOUCH | REDISMODULE_OPEN_KEY_NONOTIFY | REDISMODULE_OPEN_KEY_NOSTATS | REDISMODULE_OPEN_KEY_NOEXPIRE | REDISMODULE_OPEN_KEY_NOEFFECTS | REDISMODULE_OPEN_KEY_ACCESS_EXPIRED | REDISMODULE_OPEN_KEY_ACCESS_TRIMMED /* List push and pop */ #define REDISMODULE_LIST_HEAD 0 @@ -126,7 +129,7 @@ typedef long long ustime_t; #define REDISMODULE_HASH_CFIELDS (1<<2) #define REDISMODULE_HASH_EXISTS (1<<3) #define REDISMODULE_HASH_COUNT_ALL (1<<4) -#define REDISMODULE_HASH_EXPIRE_TIME (1<<5) +#define REDISMODULE_HASH_EXPIRE_TIME (1<<5) #define REDISMODULE_CONFIG_DEFAULT 0 /* This is the default for a module config. */ #define REDISMODULE_CONFIG_IMMUTABLE (1ULL<<0) /* Can this value only be set at startup? */ @@ -215,11 +218,13 @@ typedef struct RedisModuleStreamID { #define REDISMODULE_CTX_FLAGS_SERVER_STARTUP (1<<24) /* This context can call execute debug commands. */ #define REDISMODULE_CTX_FLAGS_DEBUG_ENABLED (1<<25) +/* Trim is in progress due to slot migration. */ +#define REDISMODULE_CTX_TRIM_IN_PROGRESS (1<<26) /* Next context flag, must be updated when adding new flags above! This flag should not be used directly by the module. * Use RedisModule_GetContextFlagsAll instead. */ -#define _REDISMODULE_CTX_FLAGS_NEXT (1<<26) +#define _REDISMODULE_CTX_FLAGS_NEXT (1<<27) /* Keyspace changes notification classes. Every class is associated with a * character for configuration purposes. @@ -272,6 +277,7 @@ This flag should not be used directly by the module. #define REDISMODULE_CLUSTER_FLAG_NONE 0 #define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1) #define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2) +#define REDISMODULE_CLUSTER_FLAG_NO_TRIM (1<<3) #define REDISMODULE_NOT_USED(V) ((void) V) @@ -515,7 +521,8 @@ typedef void (*RedisModuleEventLoopOneShotFunc)(void *user_data); #define REDISMODULE_EVENT_KEY 17 #define REDISMODULE_EVENT_CLUSTER_SLOT_MIGRATION 18 #define REDISMODULE_EVENT_CLUSTER_SLOT_MIGRATION_TRIM 19 -#define _REDISMODULE_EVENT_NEXT 20 /* Next event flag, should be updated if a new event added. */ +#define REDISMODULE_EVENT_CLUSTER_UNOWNEDKEYS 20 +#define _REDISMODULE_EVENT_NEXT 21 /* Next event flag, should be updated if a new event added. */ typedef struct RedisModuleEvent { uint64_t id; /* REDISMODULE_EVENT_... defines. */ @@ -604,7 +611,7 @@ static const RedisModuleEvent /* Deprecated since Redis 7.0, not used anymore. */ __attribute__ ((deprecated)) RedisModuleEvent_ReplBackup = { - REDISMODULE_EVENT_REPL_BACKUP, + REDISMODULE_EVENT_REPL_BACKUP, 1 }, RedisModuleEvent_ReplAsyncLoad = { @@ -634,6 +641,10 @@ static const RedisModuleEvent RedisModuleEvent_ClusterSlotMigrationTrim = { REDISMODULE_EVENT_CLUSTER_SLOT_MIGRATION_TRIM, 1 + }, + RedisModuleEvent_ClusterUnownedKeys = { + REDISMODULE_EVENT_CLUSTER_UNOWNEDKEYS, + 1 }; /* Those are values that are used for the 'subevent' callback argument. */ @@ -726,6 +737,10 @@ static const RedisModuleEvent #define REDISMODULE_SUBEVENT_CLUSTER_SLOT_MIGRATION_TRIM_BACKGROUND 2 #define _REDISMODULE_SUBEVENT_CLUSTER_SLOT_MIGRATION_TRIM_NEXT 3 +#define REDISMODULE_SUBEVENT_CLUSTER_UNOWNEDKEYS_DETECTED 0 +#define REDISMODULE_SUBEVENT_CLUSTER_UNOWNEDKEYS_RESOLVED 1 +#define _REDISMODULE_SUBEVENT_CLUSTER_UNOWNEDKEYS_NEXT 2 + /* RedisModuleClientInfo flags. */ #define REDISMODULE_CLIENTINFO_FLAG_SSL (1<<0) #define REDISMODULE_CLIENTINFO_FLAG_PUBSUB (1<<1) @@ -1343,6 +1358,7 @@ REDISMODULE_API void (*RedisModule_GetRandomBytes)(unsigned char *dst, size_t le REDISMODULE_API void (*RedisModule_GetRandomHexChars)(char *dst, size_t len) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags) REDISMODULE_ATTR; +REDISMODULE_API uint64_t (*RedisModule_GetClusterFlags)(RedisModuleCtx *ctx) REDISMODULE_ATTR; REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlot)(RedisModuleString *key) REDISMODULE_ATTR; REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlotC)(const char *keystr, size_t keylen) REDISMODULE_ATTR; REDISMODULE_API const char *(*RedisModule_ClusterCanonicalKeyNameInSlot)(unsigned int slot) REDISMODULE_ATTR; @@ -1740,6 +1756,7 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int REDISMODULE_GET_API(GetRandomBytes); REDISMODULE_GET_API(GetRandomHexChars); REDISMODULE_GET_API(SetClusterFlags); + REDISMODULE_GET_API(GetClusterFlags); REDISMODULE_GET_API(ClusterKeySlot); REDISMODULE_GET_API(ClusterKeySlotC); REDISMODULE_GET_API(ClusterCanonicalKeyNameInSlot); @@ -1828,9 +1845,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int REDISMODULE_GET_API(ConfigSetEnum); REDISMODULE_GET_API(ConfigSetNumeric); - #ifdef REDISMODULE_RLEC_API_DEFS - REDISMODULE_RLEC_API_DEFS + REDISMODULE_RLEC_API_DEFS #endif if (RedisModule_IsModuleNameBusy && RedisModule_IsModuleNameBusy(name)) return REDISMODULE_ERR; From 8dc7f6eb964129774f54bba662121bd2ec1388b7 Mon Sep 17 00:00:00 2001 From: Joan Fontanals Martinez Date: Fri, 28 Nov 2025 13:35:01 +0100 Subject: [PATCH 2/4] update --- redismodule.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/redismodule.h b/redismodule.h index 8572fc6..89da302 100644 --- a/redismodule.h +++ b/redismodule.h @@ -277,8 +277,8 @@ This flag should not be used directly by the module. #define REDISMODULE_CLUSTER_FLAG_NONE 0 #define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1) #define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2) -#define REDISMODULE_CLUSTER_FLAG_NO_TRIM (1<<3) +#define REDISMODULE_CLUSTER_POLICY_NO_TRIM 0 #define REDISMODULE_NOT_USED(V) ((void) V) /* Logging level strings */ @@ -1358,8 +1358,8 @@ REDISMODULE_API void (*RedisModule_GetRandomBytes)(unsigned char *dst, size_t le REDISMODULE_API void (*RedisModule_GetRandomHexChars)(char *dst, size_t len) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags) REDISMODULE_ATTR; -REDISMODULE_API uint64_t (*RedisModule_GetClusterFlags)(RedisModuleCtx *ctx) REDISMODULE_ATTR; -REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlot)(RedisModuleString *key) REDISMODULE_ATTR; +REDISMODULE_API int (*RedisModule_AcquireClusterPolicy)(RedisModuleCtx *ctx, int policy) REDISMODULE_ATTR; +REDISMODULE_API int (*RedisModule_ReleaseClusterPolicy)(RedisModuleCtx *ctx, int policy) REDISMODULE_ATTR;REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlot)(RedisModuleString *key) REDISMODULE_ATTR; REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlotC)(const char *keystr, size_t keylen) REDISMODULE_ATTR; REDISMODULE_API const char *(*RedisModule_ClusterCanonicalKeyNameInSlot)(unsigned int slot) REDISMODULE_ATTR; REDISMODULE_API int (*RedisModule_ClusterCanAccessKeysInSlot)(int slot) REDISMODULE_ATTR; @@ -1756,7 +1756,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int REDISMODULE_GET_API(GetRandomBytes); REDISMODULE_GET_API(GetRandomHexChars); REDISMODULE_GET_API(SetClusterFlags); - REDISMODULE_GET_API(GetClusterFlags); + REDISMODULE_GET_API(AcquireClusterPolicy); + REDISMODULE_GET_API(ReleaseClusterPolicy); REDISMODULE_GET_API(ClusterKeySlot); REDISMODULE_GET_API(ClusterKeySlotC); REDISMODULE_GET_API(ClusterCanonicalKeyNameInSlot); From e4a86ddab44c2fcbf0dcf05e43520356db8b78c0 Mon Sep 17 00:00:00 2001 From: Joan Fontanals Martinez Date: Mon, 1 Dec 2025 10:56:00 +0100 Subject: [PATCH 3/4] align with new new commits --- redismodule.h | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/redismodule.h b/redismodule.h index 89da302..650cd9a 100644 --- a/redismodule.h +++ b/redismodule.h @@ -278,7 +278,7 @@ This flag should not be used directly by the module. #define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1) #define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2) -#define REDISMODULE_CLUSTER_POLICY_NO_TRIM 0 +#define REDISMODULE_SERVER_CAPA_NO_TRIM 0 #define REDISMODULE_NOT_USED(V) ((void) V) /* Logging level strings */ @@ -1358,8 +1358,9 @@ REDISMODULE_API void (*RedisModule_GetRandomBytes)(unsigned char *dst, size_t le REDISMODULE_API void (*RedisModule_GetRandomHexChars)(char *dst, size_t len) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags) REDISMODULE_ATTR; -REDISMODULE_API int (*RedisModule_AcquireClusterPolicy)(RedisModuleCtx *ctx, int policy) REDISMODULE_ATTR; -REDISMODULE_API int (*RedisModule_ReleaseClusterPolicy)(RedisModuleCtx *ctx, int policy) REDISMODULE_ATTR;REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlot)(RedisModuleString *key) REDISMODULE_ATTR; +REDISMODULE_API int (*RedisModule_AcquireServerCapability)(RedisModuleCtx *ctx, int capa) REDISMODULE_ATTR; +REDISMODULE_API int (*RedisModule_ReleaseServerCapability)(RedisModuleCtx *ctx, int capa) REDISMODULE_ATTR; +REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlot)(RedisModuleString *key) REDISMODULE_ATTR; REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlotC)(const char *keystr, size_t keylen) REDISMODULE_ATTR; REDISMODULE_API const char *(*RedisModule_ClusterCanonicalKeyNameInSlot)(unsigned int slot) REDISMODULE_ATTR; REDISMODULE_API int (*RedisModule_ClusterCanAccessKeysInSlot)(int slot) REDISMODULE_ATTR; @@ -1756,8 +1757,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int REDISMODULE_GET_API(GetRandomBytes); REDISMODULE_GET_API(GetRandomHexChars); REDISMODULE_GET_API(SetClusterFlags); - REDISMODULE_GET_API(AcquireClusterPolicy); - REDISMODULE_GET_API(ReleaseClusterPolicy); + REDISMODULE_GET_API(AcquireServerCapability); + REDISMODULE_GET_API(ReleaseServerCapability); REDISMODULE_GET_API(ClusterKeySlot); REDISMODULE_GET_API(ClusterKeySlotC); REDISMODULE_GET_API(ClusterCanonicalKeyNameInSlot); From 800353c6369feaff8ab6db416f5ee96ad0874d19 Mon Sep 17 00:00:00 2001 From: Joan Fontanals Martinez Date: Tue, 2 Dec 2025 12:06:45 +0100 Subject: [PATCH 4/4] align with dedicated api --- redismodule.h | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/redismodule.h b/redismodule.h index 650cd9a..323fd21 100644 --- a/redismodule.h +++ b/redismodule.h @@ -278,7 +278,6 @@ This flag should not be used directly by the module. #define REDISMODULE_CLUSTER_FLAG_NO_FAILOVER (1<<1) #define REDISMODULE_CLUSTER_FLAG_NO_REDIRECTION (1<<2) -#define REDISMODULE_SERVER_CAPA_NO_TRIM 0 #define REDISMODULE_NOT_USED(V) ((void) V) /* Logging level strings */ @@ -1358,8 +1357,8 @@ REDISMODULE_API void (*RedisModule_GetRandomBytes)(unsigned char *dst, size_t le REDISMODULE_API void (*RedisModule_GetRandomHexChars)(char *dst, size_t len) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetDisconnectCallback)(RedisModuleBlockedClient *bc, RedisModuleDisconnectFunc callback) REDISMODULE_ATTR; REDISMODULE_API void (*RedisModule_SetClusterFlags)(RedisModuleCtx *ctx, uint64_t flags) REDISMODULE_ATTR; -REDISMODULE_API int (*RedisModule_AcquireServerCapability)(RedisModuleCtx *ctx, int capa) REDISMODULE_ATTR; -REDISMODULE_API int (*RedisModule_ReleaseServerCapability)(RedisModuleCtx *ctx, int capa) REDISMODULE_ATTR; +REDISMODULE_API int (*RedisModule_ClusterDisableTrim)(RedisModuleCtx *ctx) REDISMODULE_ATTR; +REDISMODULE_API int (*RedisModule_ClusterEnableTrim)(RedisModuleCtx *ctx) REDISMODULE_ATTR; REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlot)(RedisModuleString *key) REDISMODULE_ATTR; REDISMODULE_API unsigned int (*RedisModule_ClusterKeySlotC)(const char *keystr, size_t keylen) REDISMODULE_ATTR; REDISMODULE_API const char *(*RedisModule_ClusterCanonicalKeyNameInSlot)(unsigned int slot) REDISMODULE_ATTR; @@ -1757,8 +1756,8 @@ static int RedisModule_Init(RedisModuleCtx *ctx, const char *name, int ver, int REDISMODULE_GET_API(GetRandomBytes); REDISMODULE_GET_API(GetRandomHexChars); REDISMODULE_GET_API(SetClusterFlags); - REDISMODULE_GET_API(AcquireServerCapability); - REDISMODULE_GET_API(ReleaseServerCapability); + REDISMODULE_GET_API(ClusterDisableTrim); + REDISMODULE_GET_API(ClusterEnableTrim); REDISMODULE_GET_API(ClusterKeySlot); REDISMODULE_GET_API(ClusterKeySlotC); REDISMODULE_GET_API(ClusterCanonicalKeyNameInSlot);