[ https://issues.apache.org/jira/browse/IGNITE-21396?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Aleksandr Polovtcev updated IGNITE-21396: ----------------------------------------- Description: I've created a following test: {code:java} public class TestClass extends ClusterPerTestIntegrationTest { @Test void testConcurrentDrop() { String tableName = "TEST"; executeSql(String.format("CREATE TABLE %s (key INT PRIMARY KEY)", tableName)); var stopFlag = new AtomicBoolean(); CompletableFuture<Void> selectFuture = CompletableFuture.runAsync(() -> { while (!stopFlag.get()) { executeSql(String.format("SELECT COUNT(*) FROM %s", tableName)); } }); executeSql(String.format("DROP TABLE %s", tableName)); stopFlag.set(true); assertThat(selectFuture, willCompleteSuccessfully()); } } {code} It starts a polling thread that uses {{SELECT COUNT(*)}} to constantly poll a table, while we drop the table in a different thread. This test fails with an NPE in SqlQueryProcessor: {code:java} Caused by: java.lang.NullPointerException: table at java.base/java.util.Objects.requireNonNull(Objects.java:235) at org.apache.ignite.internal.sql.engine.SqlQueryProcessor.primaryReplicas(SqlQueryProcessor.java:378) at org.apache.ignite.internal.sql.engine.SqlQueryProcessor$1.forTable(SqlQueryProcessor.java:313) at org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.lambda$mapFragments$4(MappingServiceImpl.java:160) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) at java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) at java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) at java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) at java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) at org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.mapFragments(MappingServiceImpl.java:168) at org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.lambda$map0$2(MappingServiceImpl.java:140) at com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$remap$15(BoundedLocalCache.java:2629) at java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916) at com.github.benmanes.caffeine.cache.BoundedLocalCache.remap(BoundedLocalCache.java:2624) at com.github.benmanes.caffeine.cache.BoundedLocalCache.compute(BoundedLocalCache.java:2574) at com.github.benmanes.caffeine.cache.LocalCache.compute(LocalCache.java:93) at org.apache.ignite.internal.sql.engine.util.cache.CaffeineCacheFactory$CaffeineCacheToCacheAdapter.compute(CaffeineCacheFactory.java:124) at org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.map0(MappingServiceImpl.java:126) at org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.map(MappingServiceImpl.java:101) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.execute(ExecutionServiceImpl.java:827) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.executeQuery(ExecutionServiceImpl.java:266) at org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.executePlan(ExecutionServiceImpl.java:300) at org.apache.ignite.internal.sql.engine.SqlQueryProcessor.executePlan(SqlQueryProcessor.java:681) at org.apache.ignite.internal.sql.engine.SqlQueryProcessor.lambda$executeParsedStatement$17(SqlQueryProcessor.java:644) {code} I would expect the test to fail with a different error, e.g. that the table has not been found. > NPE SqlQueryProcessor during concurrent SELECT and DROP TABLE > ------------------------------------------------------------- > > Key: IGNITE-21396 > URL: https://issues.apache.org/jira/browse/IGNITE-21396 > Project: Ignite > Issue Type: Bug > Components: sql > Reporter: Aleksandr Polovtcev > Priority: Major > Labels: ignite-3 > > I've created a following test: > {code:java} > public class TestClass extends ClusterPerTestIntegrationTest { > @Test > void testConcurrentDrop() { > String tableName = "TEST"; > executeSql(String.format("CREATE TABLE %s (key INT PRIMARY KEY)", > tableName)); > var stopFlag = new AtomicBoolean(); > CompletableFuture<Void> selectFuture = CompletableFuture.runAsync(() > -> { > while (!stopFlag.get()) { > executeSql(String.format("SELECT COUNT(*) FROM %s", > tableName)); > } > }); > executeSql(String.format("DROP TABLE %s", tableName)); > stopFlag.set(true); > assertThat(selectFuture, willCompleteSuccessfully()); > } > } > {code} > It starts a polling thread that uses {{SELECT COUNT(*)}} to constantly poll a > table, while we drop the table in a different thread. This test fails with an > NPE in SqlQueryProcessor: > {code:java} > Caused by: java.lang.NullPointerException: table > at java.base/java.util.Objects.requireNonNull(Objects.java:235) > at > org.apache.ignite.internal.sql.engine.SqlQueryProcessor.primaryReplicas(SqlQueryProcessor.java:378) > at > org.apache.ignite.internal.sql.engine.SqlQueryProcessor$1.forTable(SqlQueryProcessor.java:313) > at > org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.lambda$mapFragments$4(MappingServiceImpl.java:160) > at > java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) > at > java.base/java.util.AbstractList$RandomAccessSpliterator.forEachRemaining(AbstractList.java:720) > at > java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) > at > java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) > at > java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.forEachRemaining(StreamSpliterators.java:310) > at > java.base/java.util.stream.Streams$ConcatSpliterator.forEachRemaining(Streams.java:734) > at > java.base/java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:762) > at > java.base/java.util.stream.ReferencePipeline$7$1.accept(ReferencePipeline.java:276) > at > java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625) > at > java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) > at > java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) > at > java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921) > at > java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234) > at > java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682) > at > org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.mapFragments(MappingServiceImpl.java:168) > at > org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.lambda$map0$2(MappingServiceImpl.java:140) > at > com.github.benmanes.caffeine.cache.BoundedLocalCache.lambda$remap$15(BoundedLocalCache.java:2629) > at > java.base/java.util.concurrent.ConcurrentHashMap.compute(ConcurrentHashMap.java:1916) > at > com.github.benmanes.caffeine.cache.BoundedLocalCache.remap(BoundedLocalCache.java:2624) > at > com.github.benmanes.caffeine.cache.BoundedLocalCache.compute(BoundedLocalCache.java:2574) > at > com.github.benmanes.caffeine.cache.LocalCache.compute(LocalCache.java:93) > at > org.apache.ignite.internal.sql.engine.util.cache.CaffeineCacheFactory$CaffeineCacheToCacheAdapter.compute(CaffeineCacheFactory.java:124) > at > org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.map0(MappingServiceImpl.java:126) > at > org.apache.ignite.internal.sql.engine.exec.mapping.MappingServiceImpl.map(MappingServiceImpl.java:101) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl$DistributedQueryManager.execute(ExecutionServiceImpl.java:827) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.executeQuery(ExecutionServiceImpl.java:266) > at > org.apache.ignite.internal.sql.engine.exec.ExecutionServiceImpl.executePlan(ExecutionServiceImpl.java:300) > at > org.apache.ignite.internal.sql.engine.SqlQueryProcessor.executePlan(SqlQueryProcessor.java:681) > at > org.apache.ignite.internal.sql.engine.SqlQueryProcessor.lambda$executeParsedStatement$17(SqlQueryProcessor.java:644) > {code} > I would expect the test to fail with a different error, e.g. that the table > has not been found. -- This message was sent by Atlassian Jira (v8.20.10#820010)