Hi tison,

The readIndex provides only the linearizable consistency guarantee. A 
linearizable read returned by RaftServer at least reflects any changes already 
committed and replied to the client. If you require a more strict consistency 
guarantee, like read reflecting the latest write, you may need to add extra 
synchronization logic. I think blocking IO or dependencies on completionStage 
will both work.

Regards,
William


> 2023年8月27日 12:20,tison <[email protected]> 写道:
> 
> Hi,
> 
> I have asked a related question before[1] about syncing better query and 
> applytransaction.
> 
> Now, when I dive deeper into the Raft-based system, I notice a new case for 
> consistency.
> 
> Take the following executions as an example (supposed we implement a Map 
> statemachine):
> 
> Client 1 put k1 as v1
> Client 1 get k1
> 
> Generally, we expect the get requests gets v1. But if these two requests are 
> issued in async, it's not always true.
> 
> Even the client TCP connection can guarantee that "get k1" goes after "put 
> k1", and we do read index for "get k1", the read index returned can be lower 
> then "put k1" if it's not yet committed. Then the "get k1" request gets an 
> empty value.
> 
> I'm not sure what is the best practices to implement read my write for a 
> Ratis-based system.
> 
> 1. If we're using blocking IO, it won't be an issue cause "get k1" must be 
> after "put k1" committed and even applied.
> 2. If we build an extra facade over Ratis like IoTDB does, we can check the 
> read conditions as I did at [2].
> 3. But what if we only customize the statemachine and use the Ratis client? I 
> don't know which happens before relations I can depend on for concurrent 
> query and applytransaction.
> 
> Also, in [2] for raft-rs there is one more subtle issue that their ReadIndex 
> request can get lost or silently ignored, which causes the caller to retry 
> that can even get a much later read index. I'm curious if Ratis has the same 
> issue (lose ReadIndex or silently ignore and the caller doesn't get response 
> forever).
> 
> Best,
> tison.
> 
> [1] https://lists.apache.org/thread/wh9cf9456y1k3pt9v0qs9o3wychl937s
> [2] https://github.com/tikv/raft-rs/discussions/525#discussioncomment-6819686
> 

Reply via email to