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


##########
ratis-docs/src/site/markdown/configurations.md:
##########
@@ -227,6 +227,29 @@ if it fails to receive any RPC responses from this peer 
within this specified ti
 | **Default**     | false                                                      
           |
 
 
+| **Property**    | 
`raft.server.read.read-index.leadership-heartbeat-check.skip.enabled` |
+|:----------------|:----------------------------------------------------------------------|
+| **Description** | whether to skip the leadership check heartbeat for read 
index.        |
+| **Type**        | boolean                                                    
           |
+| **Default**     | false                                                      
           |
+
+Note that although enabling `leadership-heartbeat-check.skip.enabled` reduce 
the RTT due to the leadership check heartbeat, 
+it causes reads to not be linearizable in some cases. 
+This is because without the leadership check heartbeats, the leader might not 
be the latest leader 
+and might serve stale reads. 
+There might be a small period of time when there is a split brain and two Raft 
peers that believe that 
+they are leaders (old leader and new leader where old leader's term < new 
leader's term). 
+The old leader might not have detected that it has lost majority heartbeats 
and stepped down or the old leader 
+has not received any RPC with higher term which forces the old leader to steps 
down. 
+Without the leadership check heartbeat which should detect that the old leader 
is no longer the latest leader and
+force the old leader to step down, the old leader ReadIndex might return an 
index that is lower than 
+the new leader's applied index. 
+This means that the old leader might return stale data which is not 
linearizable by definition. 
+However, this situation should happen only abnormal situations when the Raft 
group encounters a leader election
+due to network partition between the old leader and the other majority quorum 
(which will elect a new leader).
+Therefore, this might be an acceptable tradeoff for applications that seek to 
improve the linearizable read 
+performance.

Review Comment:
   Thanks for adding the doc.  Below is my suggestion:
   ```md
   | **Property**    | `raft.server.read.leader.heartbeat-check.enabled` |
   |:----------------|:--------------------------------------------------|
   | **Description** | whether to check heartbeat for read index.        |
   | **Type**        | boolean                                           |
   | **Default**     | true                                              |
   
   Note that the original read index algorithm requires heartbeat check
   in order to guarantee linearizable read.
   By setting this property to false,
   it reduces the RTT by eliminating the heartbeat check.
   However, it might cause the reads not to be linearizable in a split-brain 
case.
   Without the heartbeat check, a leader might not be the latest leader
   and, as a result, it might serve stale reads.
   When there is a split brain, there might be a small period of time
   that the (old) leader has lost majority heartbeats but have not yet detected 
it.
   As the same time, a new leader is elected by a majority of peers.
   Then, the old leader might serve stale data
   since it does not have the transactions committed by the new leaders.
   Since such split-brain case is supposed to be rare,
   it might be an acceptable tradeoff for applications that 
   seek to improve the linearizable read performance.
   ```



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