From c938cfe1592c1b18d581ba53c3efb13326c620be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mattias=20Finn=C3=A9?= Date: Tue, 26 Feb 2019 15:20:49 +0100 Subject: [PATCH] Dropping a populating index actually calls IndexPopulator#drop() --- .../impl/api/index/IndexPopulationJob.java | 5 +++++ .../api/index/MultipleIndexPopulator.java | 22 +++++++++++++++++-- .../impl/api/index/PopulatingIndexProxy.java | 2 +- .../schema/BlockBasedIndexPopulator.java | 1 + .../api/index/MultipleIndexPopulatorTest.java | 14 +++++++++++- 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java index 419e9aa4ff99e..3bb9673245999 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexPopulationJob.java @@ -156,6 +156,11 @@ void cancelPopulation( MultipleIndexPopulator.IndexPopulation population ) multiPopulator.cancelIndexPopulation( population ); } + void dropPopulation( MultipleIndexPopulator.IndexPopulation population ) + { + multiPopulator.dropIndexPopulation( population ); + } + /** * A transaction happened that produced the given updates. Let this job incorporate its data, * feeding it to the {@link IndexPopulator}. diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java index 40920d77b584d..a49ac2aff73f7 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulator.java @@ -350,6 +350,11 @@ void cancelIndexPopulation( IndexPopulation indexPopulation ) indexPopulation.cancel(); } + void dropIndexPopulation( IndexPopulation indexPopulation ) + { + indexPopulation.cancelAndDrop(); + } + private boolean removeFromOngoingPopulations( IndexPopulation indexPopulation ) { return populations.remove( indexPopulation ); @@ -541,6 +546,20 @@ void create() } void cancel() + { + cancel( () -> populator.close( false ) ); + } + + void cancelAndDrop() + { + cancel( populator::drop ); + } + + /** + * Cancels population also executing a specific operation on the populator + * @param specificPopulatorOperation specific operation in addition to closing the populator. + */ + private void cancel( Runnable specificPopulatorOperation ) { populatorLock.lock(); try @@ -550,8 +569,7 @@ void cancel() // First of all remove this population from the list of ongoing populations so that it won't receive more updates. // This is good because closing the populator may wait for an opportunity to perform the close, among the incoming writes to it. removeFromOngoingPopulations( this ); - - populator.close( false ); + specificPopulatorOperation.run(); resetIndexCountsForPopulation( this ); populationOngoing = false; } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java index 233ae39f11412..b9883cf347381 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/PopulatingIndexProxy.java @@ -82,7 +82,7 @@ public void process( IndexEntryUpdate update ) @Override public void drop() { - job.cancelPopulation( indexPopulation ); + job.dropPopulation( indexPopulation ); } @Override diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/BlockBasedIndexPopulator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/BlockBasedIndexPopulator.java index bbb8b6d5ddedb..be606c22b2237 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/BlockBasedIndexPopulator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/index/schema/BlockBasedIndexPopulator.java @@ -122,6 +122,7 @@ public abstract class BlockBasedIndexPopulator,V private synchronized BlockStorage newThreadLocalBlockStorage() { Preconditions.checkState( !merged, "Already merged" ); + Preconditions.checkState( !cancellation.cancelled(), "Already closed" ); try { int id = allScanUpdates.size(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java index a2270a2ad1a2f..b45d54fa8a094 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/MultipleIndexPopulatorTest.java @@ -39,12 +39,12 @@ import org.neo4j.kernel.api.index.IndexEntryUpdate; import org.neo4j.kernel.api.index.IndexPopulator; import org.neo4j.kernel.api.index.IndexUpdater; -import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.kernel.api.schema.SchemaDescriptorFactory; import org.neo4j.kernel.api.schema.index.TestIndexDescriptorFactory; import org.neo4j.kernel.impl.api.SchemaState; import org.neo4j.kernel.impl.api.index.MultipleIndexPopulator.IndexPopulation; import org.neo4j.logging.LogProvider; +import org.neo4j.storageengine.api.NodePropertyAccessor; import org.neo4j.storageengine.api.schema.IndexSample; import org.neo4j.storageengine.api.schema.StoreIndexDescriptor; @@ -119,6 +119,18 @@ public void flippedPopulationAreNotCanceable() throws FlipFailedKernelException verify( indexPopulation.populator, never() ).close( false ); } + @Test + public void cancelAndDropShouldCallDropOnPopulator() throws FlipFailedKernelException + { + IndexPopulator populator = createIndexPopulator(); + IndexPopulation indexPopulation = addPopulator( populator, 1 ); + + indexPopulation.cancelAndDrop(); + + verify( populator, never() ).close( false ); + verify( populator ).drop(); + } + @Test public void testMultiplePopulatorsCreation() throws FlipFailedKernelException {