nabarun created GEODE-5061: ------------------------------ Summary: Lucene queries cannot be executed on an accessor Key: GEODE-5061 URL: https://issues.apache.org/jira/browse/GEODE-5061 Project: Geode Issue Type: Bug Components: lucene Reporter: nabarun
h2. Current: An Apache Geode user can execute a Lucene query on an accessor without ever creating a Lucene index. This should not be allowed but it is and it causes a stack overflow when we execute a Lucene query from the accessor. This can be observed in the below test case. {code:java} public void asynchronousLuceneIndexCreationWithDifferentFieldsMustFail( RegionTestableType regionTestType) throws Exception { SerializableRunnableIF createIndex = () -> { LuceneService luceneService = LuceneServiceProvider.get(getCache()); luceneService.createIndexFactory().addField("text").create(INDEX_NAME, REGION_NAME); }; dataStore1.invoke(() -> initDataStore(createIndex, regionTestType)); dataStore2.invoke(() -> initDataStore(createIndex, regionTestType)); accessor.invoke(() -> initAccessor(createIndex, regionTestType)); putDataInRegion(accessor); assertTrue(waitForFlushBeforeExecuteTextSearch(accessor, 60000)); assertTrue(waitForFlushBeforeExecuteTextSearch(dataStore1, 60000)); executeTextSearch(accessor); dataStore1.invoke(() -> destroyIndex()); // re-index stored data AsyncInvocation ai1 = dataStore1.invokeAsync(() -> { recreateIndex(); }); dataStore2.invoke(() -> closeCache()); ai1.join(); aia.join(); assertTrue(waitForFlushBeforeExecuteTextSearch(dataStore1, 60000)); ai1.checkException(); putAllDataIntoRegion(accessor); executeTextSearch(accessor); }{code} However we can see that the issue is resolved when the accessor creates the Lucene Index. This can be seen in the below test case. {code:java} public void asynchronousLuceneIndexCreationWithDifferentFieldsMustFail( RegionTestableType regionTestType) throws Exception { SerializableRunnableIF createIndex = () -> { LuceneService luceneService = LuceneServiceProvider.get(getCache()); luceneService.createIndexFactory().addField("text").create(INDEX_NAME, REGION_NAME); }; dataStore1.invoke(() -> initDataStore(createIndex, regionTestType)); dataStore2.invoke(() -> initDataStore(createIndex, regionTestType)); accessor.invoke(() -> initAccessor(createIndex, regionTestType)); putDataInRegion(accessor); assertTrue(waitForFlushBeforeExecuteTextSearch(accessor, 60000)); assertTrue(waitForFlushBeforeExecuteTextSearch(dataStore1, 60000)); executeTextSearch(accessor); dataStore1.invoke(() -> destroyIndex()); // re-index stored data AsyncInvocation ai1 = dataStore1.invokeAsync(() -> { recreateIndex(); }); AsyncInvocation aia = accessor.invokeAsync(() -> { recreateIndex(); }); dataStore2.invoke(() -> closeCache()); ai1.join(); aia.join(); assertTrue(waitForFlushBeforeExecuteTextSearch(dataStore1, 60000)); ai1.checkException(); putAllDataIntoRegion(accessor); executeTextSearch(accessor); }{code} h2. Solution: Make sure that Lucene queries cannot be executed in the accessor if the accessor has not created the Lucene index used in the query. -- This message was sent by Atlassian JIRA (v7.6.3#76005)