Hi Snehasish,

> ... newTI = (t:1, i:21) ...

The newTI was invalid.  It probably was from the state machine.  It should
just use the TermIndex from LogEntryProto.  See  CounterStateMachine [1] as
an example.

Tsz-Wo
[1]
https://github.com/apache/ratis/blob/3d9f5af376409de7e635bb67c7dfbeadc882c413/ratis-examples/src/main/java/org/apache/ratis/examples/counter/server/CounterStateMachine.java#L263-L266

On Tue, Mar 3, 2026 at 10:52 AM Snehasish Roy via dev <[email protected]>
wrote:

> Hello everyone,
>
> I was exploring the snapshot restore capability of Ratis and found one
> scenario that failed.
>
> 1. Start a 3 Node ratis cluster and perform some updates to the state
> machine.
> 2. Take the snapshot - the snapshot will be of the format term_index. Here
> the term will initially be 1, and let's assume the index is at 10.
> 3. Kill the leader, the term would have increased to 2.
> 4. Perform some updates and trigger another snapshot. Let's assume the
> index is at 20 and term is at 2.
> 5. Stop all nodes.
> 6. A failure is observed while starting the node.
>
> ```
> Failed updateLastAppliedTermIndex: newTI = (t:1, i:21) < oldTI = (t:2,
> i:20)
> ```
>
> Based on the error logs, I suspect the state machine updated the last
> applied term index to t:2, i:20, but the ServerState has a separate
> variable for tracking the currentTerm which is initialized to 0 at startup.
> Once the leader is elected, it tried to update the log entry but the update
> failed due to precondition check.
>
> What's the correct way to solve this problem? Should the term be reset to 0
> while loading the snapshot at the server startup?
>
> References:
>
> https://github.com/apache/ratis/blob/master/ratis-server/src/main/java/org/apache/ratis/server/impl/ServerState.java#L82
>
> https://github.com/apache/ratis/blob/master/ratis-server/src/main/java/org/apache/ratis/statemachine/impl/BaseStateMachine.java#L138
>
> Thank you for looking into this issue.
>
>
> Regards,
> Snehasish
>

Reply via email to