Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Apache RocketMQ
Rocketmq
提交
866e3090
R
Rocketmq
项目概览
Apache RocketMQ
/
Rocketmq
上一次同步 接近 3 年
通知
254
Star
16136
Fork
68
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
Rocketmq
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
866e3090
编写于
11月 20, 2018
作者:
D
dongeforever
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Make role change handler asynchronous
上级
ffc733a4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
50 addition
and
24 deletion
+50
-24
broker/src/main/java/org/apache/rocketmq/broker/dleger/DLegerRoleChangeHandler.java
...pache/rocketmq/broker/dleger/DLegerRoleChangeHandler.java
+50
-24
未找到文件。
broker/src/main/java/org/apache/rocketmq/broker/dleger/DLegerRoleChangeHandler.java
浏览文件 @
866e3090
...
...
@@ -16,9 +16,13 @@
*/
package
org.apache.rocketmq.broker.dleger
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
org.apache.rocketmq.broker.BrokerController
;
import
org.apache.rocketmq.common.ThreadFactoryImpl
;
import
org.apache.rocketmq.common.constant.LoggerName
;
import
org.apache.rocketmq.dleger.DLegerLeaderElector
;
import
org.apache.rocketmq.dleger.DLegerServer
;
import
org.apache.rocketmq.dleger.MemberState
;
import
org.apache.rocketmq.dleger.utils.UtilAll
;
import
org.apache.rocketmq.logging.InternalLogger
;
...
...
@@ -30,41 +34,63 @@ import org.apache.rocketmq.store.dleger.DLegerCommitLog;
public
class
DLegerRoleChangeHandler
implements
DLegerLeaderElector
.
RoleChangeHandler
{
private
static
final
InternalLogger
log
=
InternalLoggerFactory
.
getLogger
(
LoggerName
.
BROKER_LOGGER_NAME
);
private
ExecutorService
executorService
=
Executors
.
newSingleThreadExecutor
(
new
ThreadFactoryImpl
(
"DLegerRoleChangeHandler_"
));
private
BrokerController
brokerController
;
private
DefaultMessageStore
messageStore
;
private
DLegerCommitLog
dLegerCommitLog
;
private
DLegerServer
dLegerServer
;
public
DLegerRoleChangeHandler
(
BrokerController
brokerController
,
DefaultMessageStore
messageStore
)
{
this
.
brokerController
=
brokerController
;
this
.
messageStore
=
messageStore
;
this
.
dLegerCommitLog
=
(
DLegerCommitLog
)
messageStore
.
getCommitLog
();
this
.
dLegerServer
=
dLegerCommitLog
.
getdLegerServer
();
}
@Override
public
void
handle
(
long
term
,
MemberState
.
Role
role
)
{
long
start
=
System
.
currentTimeMillis
();
try
{
log
.
info
(
"Begin handling broker role change term={} role={} currStoreRole={}"
,
term
,
role
,
messageStore
.
getMessageStoreConfig
().
getBrokerRole
());
switch
(
role
)
{
case
CANDIDATE:
if
(
messageStore
.
getMessageStoreConfig
().
getBrokerRole
()
!=
BrokerRole
.
SLAVE
)
{
brokerController
.
changeToSlave
(
dLegerCommitLog
.
getId
());
Runnable
runnable
=
new
Runnable
()
{
@Override
public
void
run
()
{
long
start
=
System
.
currentTimeMillis
();
try
{
log
.
info
(
"Begin handling broker role change term={} role={} currStoreRole={}"
,
term
,
role
,
messageStore
.
getMessageStoreConfig
().
getBrokerRole
());
switch
(
role
)
{
case
CANDIDATE:
if
(
messageStore
.
getMessageStoreConfig
().
getBrokerRole
()
!=
BrokerRole
.
SLAVE
)
{
brokerController
.
changeToSlave
(
dLegerCommitLog
.
getId
());
}
break
;
case
FOLLOWER:
brokerController
.
changeToSlave
(
dLegerCommitLog
.
getId
());
break
;
case
LEADER:
while
(
dLegerServer
.
getMemberState
().
isLeader
()
&&
(
dLegerServer
.
getdLegerStore
().
getLegerEndIndex
()
!=
dLegerServer
.
getdLegerStore
().
getCommittedIndex
()
||
messageStore
.
dispatchBehindBytes
()
!=
0
))
{
UtilAll
.
sleep
(
100
);
}
boolean
succ
=
dLegerServer
.
getMemberState
().
isLeader
()
&&
dLegerServer
.
getdLegerStore
().
getLegerEndIndex
()
==
dLegerServer
.
getdLegerStore
().
getCommittedIndex
()
&&
messageStore
.
dispatchBehindBytes
()
==
0
;
if
(
succ
)
{
messageStore
.
recoverTopicQueueTable
();
brokerController
.
changeToMaster
(
BrokerRole
.
SYNC_MASTER
);
}
log
.
info
(
"Finish handling broker role change succ={} term={} role={} currStoreRole={} cost={}"
,
succ
,
term
,
role
,
messageStore
.
getMessageStoreConfig
().
getBrokerRole
(),
UtilAll
.
elapsed
(
start
));
break
;
default
:
break
;
}
break
;
case
FOLLOWER:
brokerController
.
changeToSlave
(
dLegerCommitLog
.
getId
());
break
;
case
LEADER:
while
(
messageStore
.
dispatchBehindBytes
()
!=
0
)
{
Thread
.
sleep
(
100
);
}
messageStore
.
recoverTopicQueueTable
();
brokerController
.
changeToMaster
(
BrokerRole
.
SYNC_MASTER
);
break
;
default
:
break
;
}
catch
(
Throwable
t
)
{
log
.
info
(
"[MONITOR]Failed handling broker role change term={} role={} currStoreRole={} cost={}"
,
term
,
role
,
messageStore
.
getMessageStoreConfig
().
getBrokerRole
(),
UtilAll
.
elapsed
(
start
),
t
);
}
}
log
.
info
(
"Finish handling broker role change term={} role={} currStoreRole={} cost={}"
,
term
,
role
,
messageStore
.
getMessageStoreConfig
().
getBrokerRole
(),
UtilAll
.
elapsed
(
start
));
}
catch
(
Throwable
t
)
{
log
.
info
(
"[MONITOR]Failed handling broker role change term={} role={} currStoreRole={} cost={}"
,
term
,
role
,
messageStore
.
getMessageStoreConfig
().
getBrokerRole
(),
UtilAll
.
elapsed
(
start
),
t
);
}
};
executorService
.
submit
(
runnable
);
}
@Override
public
void
startup
()
{
}
@Override
public
void
shutdown
()
{
executorService
.
shutdown
();
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录