diff --git a/src/main/java/bftsmart/tom/core/Synchronizer.java b/src/main/java/bftsmart/tom/core/Synchronizer.java index 422fc850d379e0a4bba784a8c75ead5e0b8d70b8..ac3bb82cd908440e18bcf198f3558aab27ac0950 100644 --- a/src/main/java/bftsmart/tom/core/Synchronizer.java +++ b/src/main/java/bftsmart/tom/core/Synchronizer.java @@ -774,7 +774,7 @@ public class Synchronizer { execManager.setNewLeader(electionResult.getRegency().getLeaderId()); // 重启心跳 - tom.heartBeatTimer.restart(); + tom.heartBeatTimer.restartformlc(); // 重启业务消息超时定时器 requestsTimer.startTimer(controller.getStaticConf().getRequestTimeout()); diff --git a/src/main/java/bftsmart/tom/leaderchange/HeartBeatTimer.java b/src/main/java/bftsmart/tom/leaderchange/HeartBeatTimer.java index 05a9b69dd4f277fb2c7624bdb8873a110daf1aca..cbe79edb521f9fda9fe70855f0dd91c896a22e08 100644 --- a/src/main/java/bftsmart/tom/leaderchange/HeartBeatTimer.java +++ b/src/main/java/bftsmart/tom/leaderchange/HeartBeatTimer.java @@ -102,6 +102,25 @@ public class HeartBeatTimer { start(); } + // 在领导者切换过程中触发的心跳重新启动,要与领导者确认过程解耦 + public synchronized void restartformlc() { + stopAll(); + if (leaderTimer == null) { + leaderTimer = Executors.newSingleThreadScheduledExecutor(); + leaderTimer.scheduleWithFixedDelay(new LeaderHeartbeatBroadcastingTask(this), NORMAL_DELAY, + tomLayer.controller.getStaticConf().getHeartBeatPeriod(), TimeUnit.MILLISECONDS); + } + + if (followerTimer == null) { + // 非领导者心跳定时器重新开启后,更新上次心跳消息接收时间 + heartBeatting.time = System.currentTimeMillis(); + followerTimer = Executors.newSingleThreadScheduledExecutor(); + followerTimer.scheduleWithFixedDelay(new FollowerHeartbeatCheckingTask(), NORMAL_DELAY, + tomLayer.controller.getStaticConf().getHeartBeatPeriod(), TimeUnit.MILLISECONDS); + } + + } + public synchronized void stopAll() { innerStop(); }