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()) {

Reply via email to