SzyWilliam commented on code in PR #730:
URL: https://github.com/apache/ratis/pull/730#discussion_r956862297


##########
ratis-server/src/main/java/org/apache/ratis/server/impl/ReadRequests.java:
##########
@@ -63,4 +111,69 @@ private boolean isValid(AppendEntriesReplyProto reply) {
       return 
appender.getCallIdComparator().compare(reply.getServerReply().getCallId(), 
minCallId) >= 0;
     }
   }
+
+  static class HeartbeatBroadcastListener {
+    private final Map<RaftPeerId, HeartbeatAck> pendingAcknowledgements;
+    private final int groupPeerCount;
+    private int ack;
+    private volatile boolean done;
+    private final CompletableFuture<Boolean> result;
+
+    HeartbeatBroadcastListener(List<LogAppender> senders) {
+      this.groupPeerCount = senders.size() + 1;
+      this.ack = 0;
+      this.done = false;
+      result = new CompletableFuture<>();
+
+      pendingAcknowledgements = new ConcurrentHashMap<>();
+      senders.forEach(sender ->
+          pendingAcknowledgements.put(sender.getFollowerId(), new 
HeartbeatAck(sender)));
+    }
+
+    private void handleReply(RaftPeerId peerId, AppendEntriesReplyProto reply) 
{
+      if (done) {
+        return;
+      }
+
+      
Optional.ofNullable(pendingAcknowledgements.get(peerId)).ifPresent(heartbeatAck 
-> {
+        boolean firstAcknowledged = heartbeatAck.receive(reply);
+        if (firstAcknowledged) {
+          onHeartbeatAcknowledged();
+        }
+      });
+    }
+
+    private synchronized void handleTimeout() {
+      if (!done) {
+        done = true;
+        result.complete(false);
+      }
+    }
+
+    private boolean isDone() {
+      return this.done;
+    }
+
+    synchronized void onHeartbeatAcknowledged() {
+      if (done) {
+        return;
+      }
+
+      ack++;
+
+      if (isMajorityAck()) {
+        done = true;
+        result.complete(true);
+      }
+    }
+
+    private synchronized boolean isMajorityAck() {
+      // include leader itself
+      return ack + 1 > groupPeerCount / 2;
+    }

Review Comment:
   done



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to