Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
3b38164e
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
3b38164e
编写于
10月 03, 2019
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Modules: RM_Replicate() in thread safe contexts.
上级
ef9fe9b0
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
26 addition
and
4 deletion
+26
-4
src/module.c
src/module.c
+26
-4
未找到文件。
src/module.c
浏览文件 @
3b38164e
...
...
@@ -1372,6 +1372,20 @@ void moduleReplicateMultiIfNeeded(RedisModuleCtx *ctx) {
*
* Please refer to RedisModule_Call() for more information.
*
* ## Note about calling this function from a thread safe context:
*
* Normally when you call this function from the callback implementing a
* module command, or any other callback provided by the Redis Module API,
* Redis will accumulate all the calls to this function in the context of
* the callback, and will propagate all the commands wrapped in a MULTI/EXEC
* transaction. However when calling this function from a threaded safe context
* that can live an undefined amount of time, and can be locked/unlocked in
* at will, the behavior is different: MULTI/EXEC wrapper is not emitted
* and the command specified is inserted in the AOF and replication stream
* immediately.
*
* ## Return value
*
* The command returns REDISMODULE_ERR if the format specifiers are invalid
* or the command name does not belong to a known command. */
int
RM_Replicate
(
RedisModuleCtx
*
ctx
,
const
char
*
cmdname
,
const
char
*
fmt
,
...)
{
...
...
@@ -1389,10 +1403,18 @@ int RM_Replicate(RedisModuleCtx *ctx, const char *cmdname, const char *fmt, ...)
va_end
(
ap
);
if
(
argv
==
NULL
)
return
REDISMODULE_ERR
;
/* Replicate! */
moduleReplicateMultiIfNeeded
(
ctx
);
alsoPropagate
(
cmd
,
ctx
->
client
->
db
->
id
,
argv
,
argc
,
PROPAGATE_AOF
|
PROPAGATE_REPL
);
/* Replicate! When we are in a threaded context, we want to just insert
* the replicated command ASAP, since it is not clear when the context
* will stop being used, so accumulating stuff does not make much sense,
* nor we could easily use the alsoPropagate() API from threads. */
if
(
ctx
->
flags
&
REDISMODULE_CTX_THREAD_SAFE
)
{
propagate
(
cmd
,
ctx
->
client
->
db
->
id
,
argv
,
argc
,
PROPAGATE_AOF
|
PROPAGATE_REPL
);
}
else
{
moduleReplicateMultiIfNeeded
(
ctx
);
alsoPropagate
(
cmd
,
ctx
->
client
->
db
->
id
,
argv
,
argc
,
PROPAGATE_AOF
|
PROPAGATE_REPL
);
}
/* Release the argv. */
for
(
j
=
0
;
j
<
argc
;
j
++
)
decrRefCount
(
argv
[
j
]);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录