Filed a patch to clarify in the javadoc: https://github.com/apache/incubator-ratis/pull/416
-Rui On Thu, Feb 4, 2021 at 11:01 AM Rui Wang <[email protected]> wrote: > Thanks Tsz-Wo for your detailed explanation! I think returning to a > completed future makes sense! > > I explored to put an immediate result by applyTransactionSerial(), I might > be wrong: we probably need to add an extra field in TransactionContext > for this purpose. > > -Rui > > On Thu, Feb 4, 2021 at 2:03 AM Tsz Wo Sze <[email protected]> wrote: > >> The javadoc of applyTransaction(..) may not be very clear. >> The applyTransaction(..) itself is called in the log order. However, >> since >> it returns a future, the state machine can complete the returned futures >> in >> a different order. The StateMachine implementation can choose to return a >> completed future for the ordering guarantee. >> >> For example, in ArithmeticStateMachine.applyTransaction(..), the result >> message is computed inside the method. The future is already completed >> before returning; see line 172. >> >> >> //ArithmeticStateMachine.java, line 172 >> >> final CompletableFuture<Message> f = >> CompletableFuture.completedFuture(Expression.Utils.toMessage(r)); >> >> >> Another way is to put an intermediate output in the TransactionContext >> returned by applyTransactionSerial(..). Then, applyTransaction(..) can >> simply take the intermediate output and then return it. >> >> Hope it helps. >> Tsz-Wo >> >> On Thu, Feb 4, 2021 at 4:56 AM Rui Wang <[email protected]> wrote: >> >> > Hi community, >> > >> > StateMachine Interface has both ApplyTransactionSerial and >> > ApplyTransaction, and these two function definition are: >> > >> > TransactionContext applyTransactionSerial(TransactionContext trx); >> > >> > CompletableFuture<Message> applyTransaction(TransactionContext trx); >> > >> > >> > The comments about ApplyTransactionSerial says " This step is called >> > sequentially in strict serial order that the transactions have been >> > committed in the log." >> > >> > The comments about ApplyTransaction says " This method can be called >> > concurrently with the other calls, and there is no guarantee that the >> calls >> > will be ordered according to the log commit order." >> > >> > So my question is, shouldn't there another API "Message >> > applyTransactionSerial(TransactionContext trx)" that both guarantees to >> > apply in the order of the log while it allows return a Message? >> > >> > >> > "TransactionContext applyTransactionSerial(TransactionContext trx);" >> does >> > not return a Message (for the sake of applying the transaction to the >> state >> > machine and return a result). >> > "CompletableFuture<Message> applyTransaction(TransactionContext trx);" >> > could apply transaction concurrently thus raft log ordering is not >> > guaranteed. >> > >> > >> > -Rui >> > >> >
