IGNITE-7569 Fixing index rebuild future
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/6ae70146 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/6ae70146 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/6ae70146 Branch: refs/heads/ignite-7485-2 Commit: 6ae70146609aee8014747de156f05bca3549ce3f Parents: 9253035 Author: Alexey Goncharuk <alexey.goncha...@gmail.com> Authored: Thu Feb 1 13:17:28 2018 +0300 Committer: Alexey Goncharuk <alexey.goncha...@gmail.com> Committed: Thu Feb 1 13:17:47 2018 +0300 ---------------------------------------------------------------------- .../GridCacheDatabaseSharedManager.java | 32 +++++++++++++++----- 1 file changed, 24 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/6ae70146/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java index 0b35f18..5dc81c5 100755 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java @@ -71,6 +71,7 @@ import org.apache.ignite.configuration.DataPageEvictionMode; import org.apache.ignite.configuration.DataRegionConfiguration; import org.apache.ignite.configuration.DataStorageConfiguration; import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.configuration.NearCacheConfiguration; import org.apache.ignite.events.DiscoveryEvent; import org.apache.ignite.events.EventType; import org.apache.ignite.internal.GridKernalContext; @@ -1132,19 +1133,34 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan if (cctx.kernalContext().query().moduleEnabled()) { ExchangeActions acts = fut.exchangeActions(); - if (acts != null && !F.isEmpty(acts.cacheStartRequests())) { - for (ExchangeActions.CacheActionData actionData : acts.cacheStartRequests()) { - int cacheId = CU.cacheId(actionData.request().cacheName()); - - GridFutureAdapter<Void> old = idxRebuildFuts.put(cacheId, new GridFutureAdapter<>()); - - if (old != null) - old.onDone(); + if (acts != null) { + if (!F.isEmpty(acts.cacheStartRequests())) { + for (ExchangeActions.CacheActionData actionData : acts.cacheStartRequests()) + prepareIndexRebuildFuture(CU.cacheId(actionData.request().cacheName())); + } + else if (acts.localJoinContext() != null && !F.isEmpty(acts.localJoinContext().caches())) { + for (T2<DynamicCacheDescriptor, NearCacheConfiguration> tup : acts.localJoinContext().caches()) + prepareIndexRebuildFuture(tup.get1().cacheId()); } } } } + /** + * Creates a new index rebuild future that should be completed later after exchange is done. The future + * has to be created before exchange is initialized to guarantee that we will capture a correct future + * after activation or restore completes. + * If there was an old future for the given ID, it will be completed. + * + * @param cacheId Cache ID. + */ + private void prepareIndexRebuildFuture(int cacheId) { + GridFutureAdapter<Void> old = idxRebuildFuts.put(cacheId, new GridFutureAdapter<>()); + + if (old != null) + old.onDone(); + } + /** {@inheritDoc} */ @Override public void rebuildIndexesIfNeeded(GridDhtPartitionsExchangeFuture fut) { if (cctx.kernalContext().query().moduleEnabled()) {