Description
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.
Attachments
Issue Links
- is related to
-
HDDS-7593 Supporting HSync and lease recovery
- Resolved
-
HDDS-10972 Reduce the default watch timeout configuration in DatanodeRatisServerConfig
- Resolved
- is required by
-
HDDS-10932 Reduce number of watch requests by using CommitInfoProto from NotReplicatedException
- Resolved
- relates to
-
HDDS-10108 [hsync] Adopt RATIS-1994 to reduce hsync latency
- Patch Available
- links to