[ https://issues.apache.org/jira/browse/IGNITE-20477?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Aleksandr Polovtcev updated IGNITE-20477: ----------------------------------------- Description: Currently all Ignite components start synchronously (see {{IgniteComponent#start}}). This is inconvenient, because some components can complete their startup only when Meta Storage has initialized all Version Values (see {{IgniteImpl#recoverComponentsStateOnStart}}). Because of this, some components employ a hack which consists of having a "special" Versioned Value, which is injected with a future that gets resolved only after the enclosing component completes its startup (see {{startVv}} in {{TableManager}} or {{IndexManager}}). This blocks the Watch Processor inside Meta Storage, preventing it from processing further updates. This problem with this approach that it is quite cryptic and hard to understand. Instead I propose to do the following: # Change the signature of {{IgniteComponent#start}} to {{CompletableFuture<Void> start()}}. # All actions in the components startup will be divided into two categories: sync actions, that can be executed synchronously in order for the component to be usable by other components during their startup, and async actions, which need to wait for any of the Versioned Values to be initialized by the Meta Storage. Such async actions should be wrapped in a {{CompletableFuture}} and returned from the {{start}} method. # {{IgniteImpl}} startup procedure should be updated to collect the futures from all components and wait for their completion inside {{recoverComponentsStateOnStart}}, after {{metaStorageMgr.notifyRevisionUpdateListenerOnStart()}} has been called, but before Watches are deployed ({{metaStorageMgr.deployWatches()}}) > Async component start > --------------------- > > Key: IGNITE-20477 > URL: https://issues.apache.org/jira/browse/IGNITE-20477 > Project: Ignite > Issue Type: Task > Reporter: Aleksandr Polovtcev > Priority: Major > Labels: ignite-3 > > Currently all Ignite components start synchronously (see > {{IgniteComponent#start}}). This is inconvenient, because some components can > complete their startup only when Meta Storage has initialized all Version > Values (see {{IgniteImpl#recoverComponentsStateOnStart}}). Because of this, > some components employ a hack which consists of having a "special" Versioned > Value, which is injected with a future that gets resolved only after the > enclosing component completes its startup (see {{startVv}} in > {{TableManager}} or {{IndexManager}}). This blocks the Watch Processor inside > Meta Storage, preventing it from processing further updates. > This problem with this approach that it is quite cryptic and hard to > understand. Instead I propose to do the following: > # Change the signature of {{IgniteComponent#start}} to > {{CompletableFuture<Void> start()}}. > # All actions in the components startup will be divided into two categories: > sync actions, that can be executed synchronously in order for the component > to be usable by other components during their startup, and async actions, > which need to wait for any of the Versioned Values to be initialized by the > Meta Storage. Such async actions should be wrapped in a {{CompletableFuture}} > and returned from the {{start}} method. > # {{IgniteImpl}} startup procedure should be updated to collect the futures > from all components and wait for their completion inside > {{recoverComponentsStateOnStart}}, after > {{metaStorageMgr.notifyRevisionUpdateListenerOnStart()}} has been called, but > before Watches are deployed ({{metaStorageMgr.deployWatches()}}) -- This message was sent by Atlassian Jira (v8.20.10#820010)