[ https://issues.apache.org/jira/browse/RATIS-2089?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17849259#comment-17849259 ]
Siyao Meng commented on RATIS-2089: ----------------------------------- Thanks a lot for filing this one [~ivanandika] . I am +1 on this. I am in the same boat when working on HDDS-10108. A little bit background on my side: 1. In HDDS-10108, I'm trying to utilize the improvement made in RATIS-1994. 2. The goal of HDDS-10108 is to use {{send(ALL_COMMITTED)}} ONLY in Ozone to achieve the same level of consistency as {{send(MAJORITY)}} + {{watch(ALL_COMMITTED)}}. The latter is the existing Ozone implementation. 3. So effectively, the goal of HDDS-10108 is to remove explicit watch() calls in Ozone in order to eliminate this extra {{watch()}} round trip. 4. Then I [observed|https://github.com/apache/ozone/pull/6014#issuecomment-2102763285] the same issue as you mentioned, an Ozone test case `testDatanodeExclusionWithMajorityCommit` failed because {{failedServers}} (dead datanodes list) relies on the "retry" logic in {{XceiverClientRatis#watchForCommit}} to be populated. 5. And as a result, I will only get null reply (with non-null exception) from the future returned from {{XceiverClientRatis#sendRequestAsync}}. So I won't get CommitInfo that will be very useful in this case. If RATIS-2089 can be done, I won't have to do the "retry hack" like {{watchForCommit()}} did :) > Add CommitInfoProto in NotReplicatedException > --------------------------------------------- > > Key: RATIS-2089 > URL: https://issues.apache.org/jira/browse/RATIS-2089 > Project: Ratis > Issue Type: Improvement > Reporter: Ivan Andika > Assignee: Ivan Andika > Priority: Minor > > In Ozone's XceiverClientRatis#watchForCommit, there are two watch commits > request with different ReplicationLevel > # Watch for ALL_COMMITTED > # Watch for MAJORITY_COMMITTED (If the previous watch threw an exception) > Based on the second watch request, the client will remove some failed > datanode UUID from the commitInfoMap. > The second watch might not be necessary since the entries in > AbstractCommitWatcher.commitIndexMap implies that the PutBlock request has > been committed to the majority of the servers. Therefore, another > MAJORITY_COMMITTED watch might not be necessary. From my understanding, the > second MAJORITY_COMMITTED only serves to gain information to remove entries > from commitInfoMap. > If the first watch failed with NotReplicatedException, we might be able to > remove the need to a second watch request. Since NotReplicatedException is a > Raft server exception, we can include the CommitInfoProtos in the > NotReplicatedException. The client can use this CommitInfoProtos to remove > the entry from commitInfoMap without sending another WATCH request. > This CommitInfoProto is returned for every RaftClientReply > (RaftClientReply.commitInfos), but if there is an exception, it seems the > RaftClientReply is not accessible to the client. > However, if the exception is a client exception (e.g. due to Raft client > watch timeout configuration), the client might have no choice but to send > another watch request. > So in this patch, I propose to include CommitInfoProto into > NotReplicatedException. -- This message was sent by Atlassian Jira (v8.20.10#820010)