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

Reply via email to