[ 
https://issues.apache.org/jira/browse/IGNITE-19047?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17737062#comment-17737062
 ] 

Aleksandr Polovtcev commented on IGNITE-19047:
----------------------------------------------

Thank you, the issue is much clearer now!

> Implement metastorage and cmg raft log re-application in async manner
> ---------------------------------------------------------------------
>
>                 Key: IGNITE-19047
>                 URL: https://issues.apache.org/jira/browse/IGNITE-19047
>             Project: Ignite
>          Issue Type: Improvement
>            Reporter: Alexander Lapin
>            Priority: Major
>              Labels: ignite-3
>
> h3. Motivation
> In order to prevent inconsistent reads, raft replays local stable raft log on 
> raft node restart in see org.apache.ignite.raft.jraft.core.NodeImpl#init. 
> However, occurred that such approach led to a deadlock:
> 1. Restart of the table waited for the raft log to replay.
> 2. Log record waiter for index to be ready.
> 3. Index manager waited the table to be created to create index on top of it, 
> that is awaited in step 2.
> Given issue was addressed in 
> https://issues.apache.org/jira/browse/IGNITE-18203 and later slightly updated 
> in https://issues.apache.org/jira/browse/IGNITE-19022 in a way that 
> logApplyComplition future was introduced that is completed when all local 
> stable log records are applied (org.apache.ignite.raft.jraft.core.NodeImpl):
> {code:java}
> public boolean init(final NodeOptions opts) {
>     ...
>     // Wait committed.
>     long commitIdx = logManager.getLastLogIndex();
>     CompletableFuture<Long> logApplyComplition = new CompletableFuture<>();
>     if (commitIdx > fsmCaller.getLastAppliedIndex()) {
>         LastAppliedLogIndexListener lnsr = new LastAppliedLogIndexListener() {
>             @Override
>             public void onApplied( long lastAppliedLogIndex) {
>                 if (lastAppliedLogIndex >= commitIdx) {
>                     logApplyComplition.complete(lastAppliedLogIndex);
>                     ...
>                 }
>             }
>         };
>     ...
> }{code}
> Depending on replication group type given logApplyComplition is either blocks 
> access to restoring data until ready or is synchronously awaited on start.
> For meta storage and CMG latter is used 
> (org.apache.ignite.internal.raft.Loza).
> {code:java}
> public CompletableFuture<RaftGroupService> startRaftGroupNode(
>         RaftNodeId nodeId,
>         PeersAndLearners configuration,
>         RaftGroupListener lsnr,
>         RaftGroupEventsListener eventsLsnr
> ) throws NodeStoppingException {
>     ...
>     // TODO: https://issues.apache.org/jira/browse/IGNITE-19047 Meta storage 
> and cmg raft log re-application in async manner
>     raftServer.raftNodeReadyFuture(nodeId.groupId()).join();
>     ...
> } {code}
> For partitions, access is blocked until local recovery is finished, see 
> org.apache.ignite.internal.replicator.Replica#ready usage for more details.
> h3. Definition of Done
>  * Implement meta storage and cmg raft log re-application in async manner 
> like it's done for partitions.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to