GEODE-2545: NPE during lucene query execution when cache is closing or region is destroyed
* Throw an InternalFunctionTargetInvocationException if executing a query while cache is closing Project: http://git-wip-us.apache.org/repos/asf/geode/repo Commit: http://git-wip-us.apache.org/repos/asf/geode/commit/c4a5ab28 Tree: http://git-wip-us.apache.org/repos/asf/geode/tree/c4a5ab28 Diff: http://git-wip-us.apache.org/repos/asf/geode/diff/c4a5ab28 Branch: refs/heads/GEODE-4160-mockito Commit: c4a5ab284baba371418cb7a389cb0f327d8becdc Parents: 8ff2fd4 Author: Jason Huynh <[email protected]> Authored: Mon Feb 27 10:02:23 2017 -0800 Committer: Jason Huynh <[email protected]> Committed: Mon Feb 27 10:02:23 2017 -0800 ---------------------------------------------------------------------- .../distributed/LuceneQueryFunction.java | 4 ++++ .../LuceneQueryFunctionJUnitTest.java | 25 +++++++++----------- 2 files changed, 15 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/geode/blob/c4a5ab28/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java index e0a0a22..dd70480 100644 --- a/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java +++ b/geode-lucene/src/main/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunction.java @@ -75,6 +75,10 @@ public class LuceneQueryFunction implements Function, InternalEntity { LuceneService service = LuceneServiceProvider.get(region.getCache()); LuceneIndexImpl index = (LuceneIndexImpl) service.getIndex(searchContext.getIndexName(), region.getFullPath()); + if (index == null) { + throw new InternalFunctionInvocationTargetException( + "Index for Region:" + region.getFullPath() + " was not found"); + } RepositoryManager repoManager = index.getRepositoryManager(); LuceneIndexStats stats = index.getIndexStats(); http://git-wip-us.apache.org/repos/asf/geode/blob/c4a5ab28/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java ---------------------------------------------------------------------- diff --git a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java index 0d06cab..6a9af9b 100644 --- a/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java +++ b/geode-lucene/src/test/java/org/apache/geode/cache/lucene/internal/distributed/LuceneQueryFunctionJUnitTest.java @@ -208,20 +208,17 @@ public class LuceneQueryFunctionJUnitTest { function.execute(mockContext); } - // Disabled currently as we are retrying the function if a bucket is not found - // @Test(expected = FunctionException.class) - // public void testBucketNotFound() throws Exception { - // when(mockContext.getDataSet()).thenReturn(mockRegion); - // when(mockContext.getArguments()).thenReturn(searchArgs); - // when(mockContext.<TopEntriesCollector>getResultSender()).thenReturn(mockResultSender); - // when(mockRepoManager.getRepositories(eq(mockContext))) - // .thenThrow(new BucketNotFoundException("")); - // LuceneQueryFunction function = new LuceneQueryFunction(); - // - // function.execute(mockContext); - // - // verify(mockResultSender).sendException(any(BucketNotFoundException.class)); - // } + @Test(expected = FunctionException.class) + public void whenServiceReturnsNullIndexDuringQueryExecutionFunctionExceptionShouldBeThrown() + throws Exception { + when(mockContext.getDataSet()).thenReturn(mockRegion); + when(mockContext.getArguments()).thenReturn(searchArgs); + LuceneQueryFunction function = new LuceneQueryFunction(); + + when(mockService.getIndex(eq("indexName"), eq(regionPath))).thenReturn(null); + + function.execute(mockContext); + } @Test(expected = FunctionException.class) public void testReduceError() throws Exception {
