> ... we probably need to add an extra field in TransactionContext for this
purpose.

We may use TransactionContext.setStateMachineContext(..).  State machine
could put whatever it wants.

Tsz-Wo


On Fri, Feb 5, 2021 at 3:15 AM Rui Wang <[email protected]> wrote:

> 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