mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
Fix module commands propagation double MULTI bug.
37a10cef
introduced automatic wrapping of MULTI/EXEC for the
alsoPropagate API. However this collides with the built-in mechanism
already present in module.c. To avoid complex changes near Redis 6 GA
this commit introduces the ability to exclude call() MUTLI/EXEC wrapping
for also propagate in order to continue to use the old code paths in
module.c.
This commit is contained in:
parent
7698316fda
commit
9dcf878f1b
@ -3326,13 +3326,8 @@ RedisModuleCallReply *RM_Call(RedisModuleCtx *ctx, const char *cmdname, const ch
|
|||||||
* a Lua script in the context of AOF and slaves. */
|
* a Lua script in the context of AOF and slaves. */
|
||||||
if (replicate) moduleReplicateMultiIfNeeded(ctx);
|
if (replicate) moduleReplicateMultiIfNeeded(ctx);
|
||||||
|
|
||||||
if (ctx->client->flags & CLIENT_MULTI ||
|
|
||||||
ctx->flags & REDISMODULE_CTX_MULTI_EMITTED) {
|
|
||||||
c->flags |= CLIENT_MULTI;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Run the command */
|
/* Run the command */
|
||||||
int call_flags = CMD_CALL_SLOWLOG | CMD_CALL_STATS;
|
int call_flags = CMD_CALL_SLOWLOG | CMD_CALL_STATS | CMD_CALL_NOWRAP;
|
||||||
if (replicate) {
|
if (replicate) {
|
||||||
if (!(flags & REDISMODULE_ARGV_NO_AOF))
|
if (!(flags & REDISMODULE_ARGV_NO_AOF))
|
||||||
call_flags |= CMD_CALL_PROPAGATE_AOF;
|
call_flags |= CMD_CALL_PROPAGATE_AOF;
|
||||||
|
@ -3266,11 +3266,15 @@ void call(client *c, int flags) {
|
|||||||
int multi_emitted = 0;
|
int multi_emitted = 0;
|
||||||
/* Wrap the commands in server.also_propagate array,
|
/* Wrap the commands in server.also_propagate array,
|
||||||
* but don't wrap it if we are already in MULIT context,
|
* but don't wrap it if we are already in MULIT context,
|
||||||
* in case the nested MULIT/EXEC.
|
* in case the nested MULTI/EXEC.
|
||||||
*
|
*
|
||||||
* And if the array contains only one command, no need to
|
* And if the array contains only one command, no need to
|
||||||
* wrap it, since the single command is atomic. */
|
* wrap it, since the single command is atomic. */
|
||||||
if (server.also_propagate.numops > 1 && !(c->flags & CLIENT_MULTI)) {
|
if (server.also_propagate.numops > 1 &&
|
||||||
|
!(c->cmd->flags & CMD_MODULE) &&
|
||||||
|
!(c->flags & CLIENT_MULTI) &&
|
||||||
|
!(flags & CMD_CALL_NOWRAP))
|
||||||
|
{
|
||||||
execCommandPropagateMulti(c);
|
execCommandPropagateMulti(c);
|
||||||
multi_emitted = 1;
|
multi_emitted = 1;
|
||||||
}
|
}
|
||||||
|
@ -395,6 +395,8 @@ typedef long long ustime_t; /* microsecond time type. */
|
|||||||
#define CMD_CALL_PROPAGATE_REPL (1<<3)
|
#define CMD_CALL_PROPAGATE_REPL (1<<3)
|
||||||
#define CMD_CALL_PROPAGATE (CMD_CALL_PROPAGATE_AOF|CMD_CALL_PROPAGATE_REPL)
|
#define CMD_CALL_PROPAGATE (CMD_CALL_PROPAGATE_AOF|CMD_CALL_PROPAGATE_REPL)
|
||||||
#define CMD_CALL_FULL (CMD_CALL_SLOWLOG | CMD_CALL_STATS | CMD_CALL_PROPAGATE)
|
#define CMD_CALL_FULL (CMD_CALL_SLOWLOG | CMD_CALL_STATS | CMD_CALL_PROPAGATE)
|
||||||
|
#define CMD_CALL_NOWRAP (1<<4) /* Don't wrap also propagate array into
|
||||||
|
MULTI/EXEC: the caller will handle it. */
|
||||||
|
|
||||||
/* Command propagation flags, see propagate() function */
|
/* Command propagation flags, see propagate() function */
|
||||||
#define PROPAGATE_NONE 0
|
#define PROPAGATE_NONE 0
|
||||||
|
@ -89,6 +89,16 @@ int propagateTestCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc
|
|||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int propagateTest2Command(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
||||||
|
{
|
||||||
|
REDISMODULE_NOT_USED(argv);
|
||||||
|
REDISMODULE_NOT_USED(argc);
|
||||||
|
|
||||||
|
RedisModule_Replicate(ctx,"INCR","c","counter");
|
||||||
|
RedisModule_ReplyWithSimpleString(ctx,"OK");
|
||||||
|
return REDISMODULE_OK;
|
||||||
|
}
|
||||||
|
|
||||||
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
|
||||||
REDISMODULE_NOT_USED(argv);
|
REDISMODULE_NOT_USED(argv);
|
||||||
REDISMODULE_NOT_USED(argc);
|
REDISMODULE_NOT_USED(argc);
|
||||||
@ -100,5 +110,11 @@ int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc)
|
|||||||
propagateTestCommand,
|
propagateTestCommand,
|
||||||
"",1,1,1) == REDISMODULE_ERR)
|
"",1,1,1) == REDISMODULE_ERR)
|
||||||
return REDISMODULE_ERR;
|
return REDISMODULE_ERR;
|
||||||
|
|
||||||
|
if (RedisModule_CreateCommand(ctx,"propagate-test-2",
|
||||||
|
propagateTest2Command,
|
||||||
|
"",1,1,1) == REDISMODULE_ERR)
|
||||||
|
return REDISMODULE_ERR;
|
||||||
|
|
||||||
return REDISMODULE_OK;
|
return REDISMODULE_OK;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user