Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
b43431ac
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,发现更多精彩内容 >>
提交
b43431ac
编写于
5月 15, 2015
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Sentinel: port address update code to shared links logic
上级
4dee18cb
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
38 addition
and
2 deletion
+38
-2
src/sentinel.c
src/sentinel.c
+38
-2
未找到文件。
src/sentinel.c
浏览文件 @
b43431ac
...
...
@@ -117,7 +117,7 @@ typedef struct sentinelAddr {
/* The link to a sentinelRedisInstance. When we have the same set of Sentinels
* monitoring many masters, we have different instances representing the
* same Sentinels, one per master, and we need to share the hiredis connections
* among them. Oherwise if 5 Sen
int
els are monitoring 100 masters we create
* among them. Oherwise if 5 Sen
tin
els are monitoring 100 masters we create
* 500 outgoing connections instead of 5.
*
* So this structure represents a reference counted link in terms of the two
...
...
@@ -1018,7 +1018,7 @@ int sentinelTryConnectionSharing(sentinelRedisInstance *ri) {
di
=
dictGetIterator
(
sentinel
.
masters
);
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
sentinelRedisInstance
*
master
=
dictGetVal
(
de
),
*
match
;
/* We want to share with the same physical Sen
it
nel referenced
/* We want to share with the same physical Sen
ti
nel referenced
* in other masters, so skip our master. */
if
(
master
==
ri
->
master
)
continue
;
match
=
getSentinelRedisInstanceByAddrAndRunID
(
master
->
sentinels
,
...
...
@@ -1036,6 +1036,41 @@ int sentinelTryConnectionSharing(sentinelRedisInstance *ri) {
return
REDIS_ERR
;
}
/* When we detect a Sentinel to switch address (reporting a different IP/port
* pair in Hello messages), let's update all the matching Sentinels in the
* context of other masters as well and disconnect the links, so that everybody
* will be updated.
*
* Return the number of updated Sentinel addresses. */
int
sentinelUpdateSentinelAddressInAllMasters
(
sentinelRedisInstance
*
ri
)
{
redisAssert
(
ri
->
flags
&
SRI_SENTINEL
);
dictIterator
*
di
;
dictEntry
*
de
;
int
reconfigured
=
0
;
di
=
dictGetIterator
(
sentinel
.
masters
);
while
((
de
=
dictNext
(
di
))
!=
NULL
)
{
sentinelRedisInstance
*
master
=
dictGetVal
(
de
),
*
match
;
match
=
getSentinelRedisInstanceByAddrAndRunID
(
master
->
sentinels
,
NULL
,
0
,
ri
->
runid
);
if
(
match
->
link
->
disconnected
==
0
)
{
instanceLinkCloseConnection
(
match
->
link
,
match
->
link
->
cc
);
instanceLinkCloseConnection
(
match
->
link
,
match
->
link
->
pc
);
}
if
(
match
==
ri
)
continue
;
/* Address already updated for it. */
/* Update the address of the matching Sentinel by copying the address
* of the Sentinel object that received the address update. */
releaseSentinelAddr
(
match
->
addr
);
match
->
addr
=
dupSentinelAddr
(
ri
->
addr
);
reconfigured
++
;
}
dictReleaseIterator
(
di
);
if
(
reconfigured
)
sentinelEvent
(
REDIS_NOTICE
,
"+sentinel-address-update"
,
ri
,
"%@ %d additional matching instances"
,
reconfigured
);
return
reconfigured
;
}
/* This function is called when an hiredis connection reported an error.
* We set it to NULL and mark the link as disconnected so that it will be
* reconnected again.
...
...
@@ -2303,6 +2338,7 @@ void sentinelProcessHelloMessage(char *hello, int hello_len) {
* so do it now. */
si
->
runid
=
sdsnew
(
token
[
2
]);
sentinelTryConnectionSharing
(
si
);
if
(
removed
)
sentinelUpdateSentinelAddressInAllMasters
(
si
);
sentinelFlushConfig
();
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录