szetszwo commented on code in PR #845:
URL: https://github.com/apache/ratis/pull/845#discussion_r1139864198


##########
ratis-server/src/main/java/org/apache/ratis/server/impl/TransferLeadership.java:
##########
@@ -151,29 +150,29 @@ private String tryTransferLeadership(LeaderStateImpl 
leaderState, Context contex
       return "LogAppender for transferee " + transferee + " is null";
     }
     final FollowerInfo follower = appender.getFollower();
-    final String error = leaderState.sendStartLeaderElection(follower, 
context.getLeaderLastEntry());
-    if (error == null) {
-      LOG.info("{}: sent StartLeaderElection to transferee {} immediately as 
it already has up-to-date log",
+    if (follower == null) {
+      return "Follower for LogAppender" + appender + " is null";

Review Comment:
   `appender.getFollower()` never returns null.



##########
ratis-server/src/main/java/org/apache/ratis/server/impl/LeaderStateImpl.java:
##########
@@ -663,7 +663,7 @@ CompletableFuture<RaftClientReply> 
submitStepDownRequestAsync(TransferLeadership
     return pendingStepDown.submitAsync(request);
   }
 
-  private synchronized String sendStartLeaderElection(RaftPeerId follower, 
TermIndex lastEntry) {
+  synchronized String sendStartLeaderElection(RaftPeerId follower, TermIndex 
lastEntry) {

Review Comment:
   `synchronized` is incorrect since it does not change anything in 
`LeaderStateImpl`.
   
   Actually, this method has nothing to do with `LeaderStateImpl`.  It should 
be moved to `RaftServerImpl` since it use many methods there.



##########
ratis-server/src/main/java/org/apache/ratis/server/impl/TransferLeadership.java:
##########
@@ -151,29 +150,29 @@ private String tryTransferLeadership(LeaderStateImpl 
leaderState, Context contex
       return "LogAppender for transferee " + transferee + " is null";
     }
     final FollowerInfo follower = appender.getFollower();
-    final String error = leaderState.sendStartLeaderElection(follower, 
context.getLeaderLastEntry());
-    if (error == null) {
-      LOG.info("{}: sent StartLeaderElection to transferee {} immediately as 
it already has up-to-date log",
+    if (follower == null) {
+      return "Follower for LogAppender" + appender + " is null";
+    }
+    if (LeaderStateImpl.isFollowerUpToDate(follower, 
context.getLeaderLastEntry())) {
+      LOG.info("{}: sending StartLeaderElection to transferee {} immediately 
as it already has up-to-date log",
+          server.getMemberId(), transferee);

Review Comment:
   Let's move the LOG after `tryTransferLeadership(..)` returns.  Then, we can 
check the return value before log.



##########
ratis-server/src/main/java/org/apache/ratis/server/impl/TransferLeadership.java:
##########
@@ -134,12 +134,11 @@ boolean isSteppingDown() {
   void onFollowerAppendEntriesReply(LeaderStateImpl leaderState, FollowerInfo 
follower) {
     // If the transferee has just append some entries and becomes up-to-date,
     // send StartLeaderElection to it
-    if (getTransferee().filter(t -> t.equals(follower.getId())).isPresent()) {
-      final String error = leaderState.sendStartLeaderElection(follower, 
leaderState.getLastEntry());
-      if (error == null) {
-        LOG.info("{}: sent StartLeaderElection to transferee {} after received 
AppendEntriesResponse",
-            server.getMemberId(), follower.getId());
-      }
+    if (getTransferee().filter(t -> t.equals(follower.getId())).isPresent()
+        && LeaderStateImpl.isFollowerUpToDate(follower, 
leaderState.getLastEntry())) {
+      LOG.info("{}: sending StartLeaderElection to transferee {} after 
received AppendEntriesResponse",
+          server.getMemberId(), follower.getId());
+      leaderState.sendStartLeaderElection(follower.getId(), 
leaderState.getLastEntry());

Review Comment:
   - It should reuse `leaderState.getLastEntry()`.
   
   - Check return value before LOG
   ```java
       if (!getTransferee().filter(t -> 
t.equals(follower.getId())).isPresent()) {
         return;
       }
       final TermIndex lastEntry = leaderState.getLastEntry();
       if (LeaderStateImpl.isFollowerUpToDate(follower, lastEntry)) {
         final String error = sendStartLeaderElection(follower.getId(), 
lastEntry);
         if (error != null) {
           LOG.warn("{}: Failed to sendStartLeaderElection to transferee {}",
               server.getMemberId(), follower.getId());
         } else {
           LOG.info("{}: sent StartLeaderElection to transferee {} after 
received AppendEntriesResponse",
               server.getMemberId(), follower.getId());
         }
       }
   ```



-- 
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