This is an automated email from the ASF dual-hosted git repository.

jasonhuynh pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new 75ae584  GEODE-3926: Lucene Query Exception is thrown if queries are 
executed in the middle of reindexing a region (#1742)
75ae584 is described below

commit 75ae58423bc66ca127fec7d2fc3ad71fbed61094
Author: Jason Huynh <huyn...@gmail.com>
AuthorDate: Tue Apr 10 18:14:54 2018 -0700

    GEODE-3926: Lucene Query Exception is thrown if queries are executed in the 
middle of reindexing a region (#1742)
    
      * Add new internal exception, LuceneIndexCreationInProgressException
      * Index the region even if it's empty
      * Added awaitility clauses to reindexing tests
      * getRepositories will throw an exception if the index is not available
      * getRepositories will not throw an exception if the data region is empty 
(this scenario can occur when creating the index before the region)
---
 .../cache/lucene/internal/InternalLuceneIndex.java |  1 +
 ...=> LuceneIndexCreationInProgressException.java} | 29 ++-------
 .../internal/LuceneIndexForPartitionedRegion.java  | 12 +++-
 .../cache/lucene/internal/LuceneQueryImpl.java     |  2 +
 .../cache/lucene/internal/LuceneRawIndex.java      |  9 ++-
 .../lucene/internal/LuceneRegionListener.java      |  2 +
 .../cache/lucene/internal/LuceneServiceImpl.java   | 19 +++---
 .../internal/PartitionedRepositoryManager.java     | 26 +++++++-
 .../internal/RawLuceneRepositoryManager.java       | 17 ++---
 .../sanctioned-geode-lucene-serializables.txt      |  1 +
 .../lucene/LuceneQueriesReindexDUnitTest.java      |  2 +
 ...ncyWithRegionCreatedBeforeReindexDUnitTest.java |  1 +
 .../LuceneIndexForPartitionedRegionTest.java       | 34 ++++++++++
 .../LuceneIndexRecoveryHAIntegrationTest.java      |  7 +-
 .../lucene/internal/LuceneQueryImplJUnitTest.java  |  2 +-
 .../internal/LuceneServiceImplJUnitTest.java       |  5 ++
 .../PartitionedRepositoryManagerJUnitTest.java     | 76 ++++++++++++++++++++--
 .../RawLuceneRepositoryManagerJUnitTest.java       |  9 ++-
 18 files changed, 193 insertions(+), 61 deletions(-)

diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
index 74e4ac8..d308a16 100644
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
@@ -39,4 +39,5 @@ public interface InternalLuceneIndex extends LuceneIndex {
 
   void initialize();
 
+  boolean isIndexAvailable(int id);
 }
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationInProgressException.java
similarity index 61%
copy from 
geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
copy to 
geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationInProgressException.java
index 74e4ac8..9c58ba5 100644
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/InternalLuceneIndex.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexCreationInProgressException.java
@@ -12,31 +12,12 @@
  * or implied. See the License for the specific language governing permissions 
and limitations under
  * the License.
  */
-
 package org.apache.geode.cache.lucene.internal;
 
-import org.apache.geode.cache.Cache;
-import org.apache.geode.cache.lucene.LuceneIndex;
-import org.apache.geode.cache.lucene.internal.repository.RepositoryManager;
-
-public interface InternalLuceneIndex extends LuceneIndex {
-
-  RepositoryManager getRepositoryManager();
-
-  /**
-   * Dump the files for this index to the given directory.
-   */
-  void dumpFiles(String directory);
-
-  /**
-   * Destroy the index
-   */
-  void destroy(boolean initiator);
-
-  LuceneIndexStats getIndexStats();
-
-  Cache getCache();
-
-  void initialize();
+import org.apache.geode.GemFireException;
 
+public class LuceneIndexCreationInProgressException extends GemFireException {
+  public LuceneIndexCreationInProgressException(String message) {
+    super(message);
+  }
 }
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
index 577bdef..247e1b4 100644
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegion.java
@@ -16,6 +16,7 @@
 package org.apache.geode.cache.lucene.internal;
 
 import java.util.Set;
+import java.util.concurrent.ExecutorService;
 
 import org.apache.geode.CancelException;
 import org.apache.geode.cache.AttributesFactory;
@@ -49,8 +50,11 @@ public class LuceneIndexForPartitionedRegion extends 
LuceneIndexImpl {
 
   public static final String FILES_REGION_SUFFIX = ".files";
 
+  private final ExecutorService waitingThreadPoolFromDM;
+
   public LuceneIndexForPartitionedRegion(String indexName, String regionPath, 
InternalCache cache) {
     super(indexName, regionPath, cache);
+    this.waitingThreadPoolFromDM = 
cache.getDistributionManager().getWaitingThreadPool();
 
     final String statsName = indexName + "-" + regionPath;
     this.fileSystemStats = new FileSystemStats(cache.getDistributedSystem(), 
statsName);
@@ -62,7 +66,7 @@ public class LuceneIndexForPartitionedRegion extends 
LuceneIndexImpl {
       mapper = new HeterogeneousLuceneSerializer();
     }
     PartitionedRepositoryManager partitionedRepositoryManager =
-        new PartitionedRepositoryManager(this, mapper);
+        new PartitionedRepositoryManager(this, mapper, 
this.waitingThreadPoolFromDM);
     return partitionedRepositoryManager;
   }
 
@@ -202,6 +206,12 @@ public class LuceneIndexForPartitionedRegion extends 
LuceneIndexImpl {
     }
   }
 
+  @Override
+  public boolean isIndexAvailable(int id) {
+    PartitionedRegion fileAndChunkRegion = getFileAndChunkRegion();
+    return 
fileAndChunkRegion.get(IndexRepositoryFactory.APACHE_GEODE_INDEX_COMPLETE, id) 
!= null;
+  }
+
   private void destroyOnRemoteMembers() {
     PartitionedRegion pr = (PartitionedRegion) getDataRegion();
     DistributionManager dm = pr.getDistributionManager();
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java
index 6039af2..1026a83 100644
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneQueryImpl.java
@@ -133,6 +133,8 @@ public class LuceneQueryImpl<K, V> implements 
LuceneQuery<K, V> {
     } catch (TransactionException e) {
       // When function execution is run from server
       throw new 
LuceneQueryException(LUCENE_QUERY_CANNOT_BE_EXECUTED_WITHIN_A_TRANSACTION);
+    } catch (LuceneIndexCreationInProgressException e) {
+      throw new LuceneQueryException("Lucene Index is not available, currently 
indexing");
     }
 
     return entries;
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRawIndex.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRawIndex.java
index d4168bd..1416cab 100755
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRawIndex.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRawIndex.java
@@ -32,8 +32,8 @@ public class LuceneRawIndex extends LuceneIndexImpl {
     if (mapper == null) {
       mapper = new HeterogeneousLuceneSerializer();
     }
-    RawLuceneRepositoryManager rawLuceneRepositoryManager =
-        new RawLuceneRepositoryManager(this, mapper);
+    RawLuceneRepositoryManager rawLuceneRepositoryManager = new 
RawLuceneRepositoryManager(this,
+        mapper, cache.getDistributionManager().getWaitingThreadPool());
     return rawLuceneRepositoryManager;
   }
 
@@ -50,4 +50,9 @@ public class LuceneRawIndex extends LuceneIndexImpl {
 
   @Override
   public void destroy(boolean initiator) {}
+
+  @Override
+  public boolean isIndexAvailable(int id) {
+    return true;
+  }
 }
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java
index 7313a82..a3f2764 100644
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneRegionListener.java
@@ -26,6 +26,7 @@ import 
org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueImpl;
 import org.apache.geode.cache.lucene.LuceneSerializer;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.internal.cache.InternalRegionArguments;
+import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.RegionListener;
 
 public class LuceneRegionListener implements RegionListener {
@@ -108,6 +109,7 @@ public class LuceneRegionListener implements RegionListener 
{
     if (region.getFullPath().equals(this.regionPath)
         && this.afterCreateInvoked.compareAndSet(false, true)) {
       this.service.afterDataRegionCreated(this.luceneIndex);
+      this.service.createLuceneIndexOnDataRegion((PartitionedRegion) region, 
luceneIndex);
     }
   }
 
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java
index 01bc5c6..ede3449 100644
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/LuceneServiceImpl.java
@@ -166,8 +166,7 @@ public class LuceneServiceImpl implements 
InternalLuceneService {
     if (!regionPath.startsWith("/")) {
       regionPath = "/" + regionPath;
     }
-    String name = indexName + "#" + regionPath.replace('/', '_');
-    return name;
+    return indexName + "#" + regionPath.replace('/', '_');
   }
 
   public static String getUniqueIndexRegionName(String indexName, String 
regionPath,
@@ -254,15 +253,13 @@ public class LuceneServiceImpl implements 
InternalLuceneService {
             throw new BucketNotFoundException(
                 "Bucket ID : " + primaryBucketId + " not found during lucene 
indexing");
           }
-          if (!userBucket.isEmpty()) {
-            /**
-             *
-             * Calling getRepository will in turn call computeRepository
-             * which is responsible for indexing the user region.
-             *
-             **/
-            repositoryManager.getRepository(primaryBucketId);
-          }
+          /**
+           *
+           * Calling getRepository will in turn call computeRepository
+           * which is responsible for indexing the user region.
+           *
+           **/
+          repositoryManager.getRepository(primaryBucketId);
         } catch (BucketNotFoundException | PrimaryBucketException e) {
           logger.debug("Bucket ID : " + primaryBucketId
               + " not found while saving to lucene index: " + e.getMessage(), 
e);
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManager.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManager.java
index f60f83b..e439293 100755
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManager.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManager.java
@@ -20,6 +20,9 @@ import java.util.Collection;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+
+import org.apache.logging.log4j.Logger;
 
 import org.apache.geode.InternalGemFireError;
 import org.apache.geode.cache.Region;
@@ -32,8 +35,11 @@ import 
org.apache.geode.internal.cache.BucketNotFoundException;
 import org.apache.geode.internal.cache.BucketRegion;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.execute.InternalRegionFunctionContext;
+import org.apache.geode.internal.logging.LogService;
 
 public class PartitionedRepositoryManager implements RepositoryManager {
+  private final Logger logger = LogService.getLogger();
+
   public static IndexRepositoryFactory indexRepositoryFactory = new 
IndexRepositoryFactory();
   /**
    * map of the parent bucket region to the index repository
@@ -54,10 +60,14 @@ public class PartitionedRepositoryManager implements 
RepositoryManager {
   protected volatile boolean closed;
   private final CountDownLatch isDataRegionReady = new CountDownLatch(1);
 
-  public PartitionedRepositoryManager(InternalLuceneIndex index, 
LuceneSerializer serializer) {
+  private final ExecutorService waitingThreadPoolFromDM;
+
+  public PartitionedRepositoryManager(InternalLuceneIndex index, 
LuceneSerializer serializer,
+      ExecutorService waitingThreadPool) {
     this.index = index;
     this.serializer = serializer;
     this.closed = false;
+    this.waitingThreadPoolFromDM = waitingThreadPool;
   }
 
   public void setUserRegionForRepositoryManager(PartitionedRegion userRegion) {
@@ -76,7 +86,19 @@ public class PartitionedRepositoryManager implements 
RepositoryManager {
         throw new BucketNotFoundException(
             "User bucket was not found for region " + region + "bucket id " + 
bucketId);
       } else {
-        repos.add(getRepository(userBucket.getId()));
+        if (index.isIndexAvailable(userBucket.getId()) || 
userBucket.isEmpty()) {
+          repos.add(getRepository(userBucket.getId()));
+        } else {
+          waitingThreadPoolFromDM.execute(() -> {
+            try {
+              getRepository(userBucket.getId());
+            } catch (BucketNotFoundException | LuceneIndexDestroyedException 
e) {
+              logger.debug("Lucene Index creation in progress.", e);
+            }
+          });
+          throw new LuceneIndexCreationInProgressException(
+              "Lucene Index creation in progress for bucket: " + 
userBucket.getId());
+        }
       }
     }
 
diff --git 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManager.java
 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManager.java
index 0b38c45..25a4678 100755
--- 
a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManager.java
+++ 
b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManager.java
@@ -15,6 +15,7 @@
 package org.apache.geode.cache.lucene.internal;
 
 import java.io.IOException;
+import java.util.concurrent.ExecutorService;
 
 import org.apache.geode.cache.lucene.LuceneSerializer;
 import org.apache.geode.cache.lucene.internal.repository.IndexRepository;
@@ -24,8 +25,9 @@ import org.apache.geode.internal.cache.PartitionedRegion;
 public class RawLuceneRepositoryManager extends PartitionedRepositoryManager {
   public static IndexRepositoryFactory indexRepositoryFactory = new 
RawIndexRepositoryFactory();
 
-  public RawLuceneRepositoryManager(LuceneIndexImpl index, LuceneSerializer 
serializer) {
-    super(index, serializer);
+  public RawLuceneRepositoryManager(LuceneIndexImpl index, LuceneSerializer 
serializer,
+      ExecutorService waitingThreadPool) {
+    super(index, serializer, waitingThreadPool);
   }
 
   @Override
@@ -35,15 +37,8 @@ public class RawLuceneRepositoryManager extends 
PartitionedRepositoryManager {
       return repo;
     }
 
-    try {
-      repo = computeRepository(bucketId, this.serializer, this.index, 
this.userRegion, repo);
-      return repo;
-    } catch (IOException e) {
-      e.printStackTrace();
-    }
-
-    throw new BucketNotFoundException(
-        "Colocated index buckets not found for bucket id " + bucketId);
+    repo = computeRepository(bucketId);
+    return repo;
   }
 
   @Override
diff --git 
a/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
 
b/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
index a13c06b..3a9117a 100755
--- 
a/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
+++ 
b/geode-lucene/src/main/resources/org/apache/geode/internal/sanctioned-geode-lucene-serializables.txt
@@ -17,3 +17,4 @@ 
org/apache/geode/cache/lucene/internal/directory/DumpDirectoryFiles,true,1
 org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction,true,1
 
org/apache/geode/cache/lucene/internal/distributed/WaitUntilFlushedFunction,true,1
 org/apache/geode/cache/lucene/internal/results/LuceneGetPageFunction,true,1
+org/apache/geode/cache/lucene/internal/LuceneIndexCreationInProgressException,false
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/LuceneQueriesReindexDUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/LuceneQueriesReindexDUnitTest.java
index 75ed722..e25ca9a 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/LuceneQueriesReindexDUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/LuceneQueriesReindexDUnitTest.java
@@ -86,6 +86,7 @@ public class LuceneQueriesReindexDUnitTest extends 
LuceneQueriesAccessorBase {
     ai1.checkException();
     ai2.checkException();
 
+    waitForFlushBeforeExecuteTextSearch(accessor, 60000);
     executeTextSearch(accessor);
   }
 
@@ -123,6 +124,7 @@ public class LuceneQueriesReindexDUnitTest extends 
LuceneQueriesAccessorBase {
     ai1.checkException();
     ai2.checkException();
 
+    waitForFlushBeforeExecuteTextSearch(accessor, 60000);
     executeTextSearch(accessor);
   }
 
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/RebalanceWithRedundancyWithRegionCreatedBeforeReindexDUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/RebalanceWithRedundancyWithRegionCreatedBeforeReindexDUnitTest.java
index 866dda1..7b1f361 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/RebalanceWithRedundancyWithRegionCreatedBeforeReindexDUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/RebalanceWithRedundancyWithRegionCreatedBeforeReindexDUnitTest.java
@@ -170,6 +170,7 @@ public class 
RebalanceWithRedundancyWithRegionCreatedBeforeReindexDUnitTest
 
     createIndexAndRebalance(regionTestType, createIndex, true);
 
+    waitForFlushBeforeExecuteTextSearch(dataStore3, 60000);
     executeTextSearch(dataStore3, "world", "text", NUM_BUCKETS);
 
   }
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
index 9ebde2c..3a36a94 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexForPartitionedRegionTest.java
@@ -91,6 +91,40 @@ public class LuceneIndexForPartitionedRegionTest {
   }
 
   @Test
+  public void indexIsAvailableReturnsFalseIfCompleteFileIsNotPresent() {
+    String name = "indexName";
+    String regionPath = "regionName";
+    InternalCache cache = Fakes.cache();
+    PartitionedRegion region = mock(PartitionedRegion.class);
+    PartitionedRegion mockFileRegion = mock(PartitionedRegion.class);
+    LuceneIndexForPartitionedRegion index =
+        new LuceneIndexForPartitionedRegion(name, regionPath, cache);
+    String fileRegionName = index.createFileRegionName();
+    when(cache.getRegion(fileRegionName)).thenReturn(region);
+    LuceneIndexForPartitionedRegion spy = spy(index);
+    when(spy.getFileAndChunkRegion()).thenReturn(mockFileRegion);
+    assertFalse(spy.isIndexAvailable(0));
+  }
+
+  @Test
+  public void indexIsAvailableReturnsTrueIfCompleteFileIsPresent() {
+    String name = "indexName";
+    String regionPath = "regionName";
+    InternalCache cache = Fakes.cache();
+    PartitionedRegion region = mock(PartitionedRegion.class);
+    PartitionedRegion mockFileRegion = mock(PartitionedRegion.class);
+    LuceneIndexForPartitionedRegion index =
+        new LuceneIndexForPartitionedRegion(name, regionPath, cache);
+    String fileRegionName = index.createFileRegionName();
+    when(cache.getRegion(fileRegionName)).thenReturn(region);
+    LuceneIndexForPartitionedRegion spy = spy(index);
+    when(spy.getFileAndChunkRegion()).thenReturn(mockFileRegion);
+    
when(mockFileRegion.get(IndexRepositoryFactory.APACHE_GEODE_INDEX_COMPLETE, 1))
+        .thenReturn("SOMETHING IS PRESENT");
+    assertTrue(spy.isIndexAvailable(1));
+  }
+
+  @Test
   public void fileRegionExistsWhenFileRegionDoesNotExistShouldReturnFalse() {
     String name = "indexName";
     String regionPath = "regionName";
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexRecoveryHAIntegrationTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexRecoveryHAIntegrationTest.java
index 0f67cb6..8cee1c9 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexRecoveryHAIntegrationTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneIndexRecoveryHAIntegrationTest.java
@@ -19,6 +19,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 import java.io.IOException;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.analysis.Analyzer;
@@ -91,7 +92,8 @@ public class LuceneIndexRecoveryHAIntegrationTest {
     userRegion.put("rebalance", "test");
     service.waitUntilFlushed("index1", "userRegion", 30000, 
TimeUnit.MILLISECONDS);
 
-    RepositoryManager manager = new 
PartitionedRepositoryManager((LuceneIndexImpl) index, mapper);
+    RepositoryManager manager = new 
PartitionedRepositoryManager((LuceneIndexImpl) index, mapper,
+        Executors.newSingleThreadExecutor());
     IndexRepository repo = manager.getRepository(userRegion, 0, null);
     assertNotNull(repo);
 
@@ -106,7 +108,8 @@ public class LuceneIndexRecoveryHAIntegrationTest {
 
     userRegion = (PartitionedRegion) regionfactory.create("userRegion");
     userRegion.put("rebalance", "test");
-    manager = new PartitionedRepositoryManager((LuceneIndexImpl) index, 
mapper);
+    manager = new PartitionedRepositoryManager((LuceneIndexImpl) index, mapper,
+        Executors.newSingleThreadExecutor());
     IndexRepository newRepo = manager.getRepository(userRegion, 0, null);
 
     Assert.assertNotEquals(newRepo, repo);
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java
index a52330d..e705148 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneQueryImplJUnitTest.java
@@ -63,7 +63,6 @@ public class LuceneQueryImplJUnitTest {
   private CacheTransactionManager cacheTransactionManager;
 
 
-
   @Before
   public void createMocks() {
     region = mock(Region.class);
@@ -169,4 +168,5 @@ public class LuceneQueryImplJUnitTest {
     assertEquals("value", element.getValue());
     assertEquals(5, element.getScore(), 0.01);
   }
+
 }
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplJUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplJUnitTest.java
index 07c2d6c..8b09ff5 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplJUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/LuceneServiceImplJUnitTest.java
@@ -32,6 +32,7 @@ import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.analysis.Analyzer;
@@ -52,6 +53,7 @@ import 
org.apache.geode.cache.asyncqueue.internal.AsyncEventQueueFactoryImpl;
 import org.apache.geode.cache.lucene.LuceneIndexFactory;
 import org.apache.geode.cache.lucene.LuceneSerializer;
 import org.apache.geode.distributed.DistributedSystem;
+import org.apache.geode.distributed.internal.DistributionManager;
 import org.apache.geode.internal.cache.GemFireCacheImpl;
 import org.apache.geode.internal.cache.PartitionedRegion;
 import org.apache.geode.internal.cache.PartitionedRegionDataStore;
@@ -123,6 +125,9 @@ public class LuceneServiceImplJUnitTest {
     when(((StatisticsFactory) ds).createAtomicStatistics(any(), anyString()))
         .thenReturn(luceneIndexStats);
     when(cache.getRegion(anyString())).thenReturn(region);
+    
when(cache.getDistributionManager()).thenReturn(mock(DistributionManager.class));
+    when(cache.getDistributionManager().getWaitingThreadPool())
+        .thenReturn(Executors.newSingleThreadExecutor());
 
     RegionAttributes ratts = mock(RegionAttributes.class);
     when(region.getAttributes()).thenReturn(ratts);
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
index b2c30b1..72a8a90 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/PartitionedRepositoryManagerJUnitTest.java
@@ -29,13 +29,17 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.index.IndexWriter;
+import org.awaitility.Awaitility;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -94,6 +98,7 @@ public class PartitionedRepositoryManagerJUnitTest {
   protected LuceneIndexImpl indexForPR;
   protected PartitionedRepositoryManager repoManager;
   protected GemFireCacheImpl cache;
+  private final Map<Integer, Boolean> isIndexAvailableMap = new HashMap<>();
 
   @Before
   public void setUp() {
@@ -142,13 +147,14 @@ public class PartitionedRepositoryManagerJUnitTest {
     when(prRoot.get("rid")).thenReturn(prConfig);
     PowerMockito.mockStatic(PartitionedRegionHelper.class);
     
PowerMockito.when(PartitionedRegionHelper.getPRRoot(cache)).thenReturn(prRoot);
-    repoManager = new PartitionedRepositoryManager(indexForPR, serializer);
+    repoManager = new PartitionedRepositoryManager(indexForPR, serializer,
+        Executors.newSingleThreadExecutor());
     repoManager.setUserRegionForRepositoryManager(userRegion);
     repoManager.allowRepositoryComputation();
   }
 
   @Test
-  public void getByKey() throws BucketNotFoundException, IOException {
+  public void getByKey() throws BucketNotFoundException {
     setUpMockBucket(0);
     setUpMockBucket(1);
 
@@ -230,6 +236,9 @@ public class PartitionedRepositoryManagerJUnitTest {
     setUpMockBucket(0);
     setUpMockBucket(1);
 
+    when(indexForPR.isIndexAvailable(0)).thenReturn(true);
+    when(indexForPR.isIndexAvailable(1)).thenReturn(true);
+
     Set<Integer> buckets = new LinkedHashSet<Integer>(Arrays.asList(0, 1));
     InternalRegionFunctionContext ctx = 
Mockito.mock(InternalRegionFunctionContext.class);
     when(ctx.getLocalBucketSet((any()))).thenReturn(buckets);
@@ -254,6 +263,7 @@ public class PartitionedRepositoryManagerJUnitTest {
   @Test(expected = BucketNotFoundException.class)
   public void getMissingBucketByRegion() throws BucketNotFoundException {
     setUpMockBucket(0);
+    when(indexForPR.isIndexAvailable(0)).thenReturn(true);
 
     Set<Integer> buckets = new LinkedHashSet<Integer>(Arrays.asList(0, 1));
 
@@ -262,11 +272,67 @@ public class PartitionedRepositoryManagerJUnitTest {
     repoManager.getRepositories(ctx);
   }
 
-  protected void checkRepository(IndexRepositoryImpl repo0, int bucketId) {
+  /**
+   * Test that we get the expected exception when a user bucket is not indexed 
yet
+   */
+  @Test(expected = LuceneIndexCreationInProgressException.class)
+  public void 
luceneIndexCreationInProgressExceptionExpectedIfIndexIsNotYetIndexed()
+      throws BucketNotFoundException {
+    setUpMockBucket(0);
+
+    Set<Integer> buckets = new LinkedHashSet<Integer>(Arrays.asList(0, 1));
+
+    InternalRegionFunctionContext ctx = 
Mockito.mock(InternalRegionFunctionContext.class);
+    when(ctx.getLocalBucketSet((any()))).thenReturn(buckets);
+    repoManager.getRepositories(ctx);
+  }
+
+
+  @Test
+  public void queryOnlyWhenIndexIsAvailable() throws Exception {
+    setUpMockBucket(0);
+    setUpMockBucket(1);
+
+    when(indexForPR.isIndexAvailable(0)).thenReturn(true);
+    when(indexForPR.isIndexAvailable(1)).thenReturn(true);
+
+    Set<Integer> buckets = new LinkedHashSet<>(Arrays.asList(0, 1));
+    InternalRegionFunctionContext ctx = 
Mockito.mock(InternalRegionFunctionContext.class);
+    when(ctx.getLocalBucketSet((any()))).thenReturn(buckets);
+
+    Awaitility.await().pollDelay(1, TimeUnit.SECONDS).pollInterval(1, 
TimeUnit.SECONDS)
+        .atMost(500, TimeUnit.SECONDS).until(() -> {
+          final Collection<IndexRepository> repositories = new HashSet<>();
+          try {
+            repositories.addAll(repoManager.getRepositories(ctx));
+          } catch (BucketNotFoundException | 
LuceneIndexCreationInProgressException e) {
+          }
+          return repositories.size() == 2;
+        });
+
+    Iterator<IndexRepository> itr = 
repoManager.getRepositories(ctx).iterator();
+    IndexRepositoryImpl repo0 = (IndexRepositoryImpl) itr.next();
+    IndexRepositoryImpl repo1 = (IndexRepositoryImpl) itr.next();
+
+    assertNotNull(repo0);
+    assertNotNull(repo1);
+    assertNotEquals(repo0, repo1);
+
+    checkRepository(repo0, 0, 1);
+    checkRepository(repo1, 0, 1);
+  }
+
+  protected void checkRepository(IndexRepositoryImpl repo0, int... bucketIds) {
     IndexWriter writer0 = repo0.getWriter();
     RegionDirectory dir0 = (RegionDirectory) writer0.getDirectory();
-    assertEquals(new BucketTargetingMap(fileAndChunkBuckets.get(bucketId), 
bucketId),
-        dir0.getFileSystem().getFileAndChunkRegion());
+    boolean result = false;
+    for (int bucketId : bucketIds) {
+      BucketTargetingMap bucketTargetingMap =
+          new BucketTargetingMap(fileAndChunkBuckets.get(bucketId), bucketId);
+      result |= 
bucketTargetingMap.equals(dir0.getFileSystem().getFileAndChunkRegion());
+    }
+
+    assertTrue(result);
     assertEquals(serializer, repo0.getSerializer());
   }
 
diff --git 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManagerJUnitTest.java
 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManagerJUnitTest.java
index a000d2f..6284f36 100644
--- 
a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManagerJUnitTest.java
+++ 
b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/RawLuceneRepositoryManagerJUnitTest.java
@@ -19,6 +19,8 @@ import static org.junit.Assert.assertTrue;
 import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.when;
 
+import java.util.concurrent.Executors;
+
 import org.apache.lucene.analysis.standard.StandardAnalyzer;
 import org.apache.lucene.index.IndexWriter;
 import org.apache.lucene.store.Directory;
@@ -56,6 +58,7 @@ public class RawLuceneRepositoryManagerJUnitTest extends 
PartitionedRepositoryMa
     ((RawLuceneRepositoryManager) repoManager).close();
   }
 
+  @Override
   protected void createIndexAndRepoManager() {
     LuceneServiceImpl.luceneIndexFactory = new LuceneRawIndexFactory();
 
@@ -66,7 +69,8 @@ public class RawLuceneRepositoryManagerJUnitTest extends 
PartitionedRepositoryMa
     when(indexForPR.getCache()).thenReturn(cache);
     when(indexForPR.getRegionPath()).thenReturn("/testRegion");
     when(indexForPR.withPersistence()).thenReturn(true);
-    repoManager = new RawLuceneRepositoryManager(indexForPR, serializer);
+    repoManager =
+        new RawLuceneRepositoryManager(indexForPR, serializer, 
Executors.newSingleThreadExecutor());
     repoManager.setUserRegionForRepositoryManager(userRegion);
     repoManager.allowRepositoryComputation();
   }
@@ -78,7 +82,7 @@ public class RawLuceneRepositoryManagerJUnitTest extends 
PartitionedRepositoryMa
   }
 
   @Override
-  protected void checkRepository(IndexRepositoryImpl repo0, int bucketId) {
+  protected void checkRepository(IndexRepositoryImpl repo0, int... bucketId) {
     IndexWriter writer0 = repo0.getWriter();
     Directory dir0 = writer0.getDirectory();
     assertTrue(dir0 instanceof NIOFSDirectory);
@@ -105,4 +109,5 @@ public class RawLuceneRepositoryManagerJUnitTest extends 
PartitionedRepositoryMa
     assertNotNull(repoManager.getRepository(userRegion, 0, null));
   }
 
+
 }

-- 
To stop receiving notification emails like this one, please contact
jasonhu...@apache.org.

Reply via email to