diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java index ea25df52eba4..578e636d0412 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexProxyCreator.java @@ -59,7 +59,8 @@ public IndexProxyCreator( IndexSamplingConfig samplingConfig, public IndexProxy createPopulatingIndexProxy( final long ruleId, final IndexDescriptor descriptor, final SchemaIndexProvider.Descriptor providerDescriptor, - final boolean constraint, + IndexConfiguration config, + final boolean flipToTentative, final IndexingService.Monitor monitor, final IndexPopulationJob populationJob ) throws IOException { @@ -67,7 +68,6 @@ public IndexProxy createPopulatingIndexProxy( final long ruleId, // TODO: This is here because there is a circular dependency from PopulatingIndexProxy to FlippableIndexProxy final String indexUserDescription = indexUserDescription( descriptor, providerDescriptor ); - final IndexConfiguration config = IndexConfiguration.of( constraint ); IndexPopulator populator = populatorFromProvider( providerDescriptor, ruleId, descriptor, config, samplingConfig ); @@ -96,7 +96,7 @@ public IndexProxy createPopulatingIndexProxy( final long ruleId, descriptor, config, onlineAccessorFromProvider( providerDescriptor, ruleId, config, samplingConfig ), storeView, providerDescriptor, true ); - if ( constraint ) + if ( flipToTentative ) { return new TentativeConstraintIndexProxy( flipper, onlineProxy ); } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java index a1c8a74602b5..6e054d08ecd8 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/api/index/IndexingService.java @@ -41,6 +41,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.index.IndexPopulationFailedKernelException; import org.neo4j.kernel.api.exceptions.schema.ConstraintVerificationFailedKernelException; +import org.neo4j.kernel.api.index.IndexConfiguration; import org.neo4j.kernel.api.index.IndexDescriptor; import org.neo4j.kernel.api.index.IndexUpdater; import org.neo4j.kernel.api.index.InternalIndexState; @@ -210,8 +211,18 @@ public void init() break; case POPULATING: // The database was shut down during population, or a crash has occurred, or some other sad thing. - indexProxy = indexProxyCreator - .createRecoveringIndexProxy( descriptor, providerDescriptor, constraint ); + if ( constraint && indexRule.getOwningConstraint() == null ) + { + // don't bother rebuilding if we are going to throw the index away anyhow + indexProxy = indexProxyCreator.createFailedIndexProxy( + indexId, descriptor, providerDescriptor, constraint, + failure( "Constraint for index was not committed." ) ); + } + else + { + indexProxy = indexProxyCreator + .createRecoveringIndexProxy( descriptor, providerDescriptor, constraint ); + } break; case FAILED: IndexPopulationFailure failure = failure( provider.getPopulationFailure( indexId ) ); @@ -269,17 +280,16 @@ public void start() throws Exception for ( Map.Entry entry : rebuildingDescriptors.entrySet() ) { long indexId = entry.getKey(); - RebuildingIndexDescriptor descriptors = entry.getValue(); - - /* - * Passing in "false" for unique here may seem surprising, and.. well, yes, it is, I was surprised too. - * However, it is actually perfectly safe, because whenever we have constraint indexes here, they will - * be in a state where they didn't finish populating, and despite the fact that we re-create them here, - * they will get dropped as soon as recovery is completed by the constraint system. - */ + RebuildingIndexDescriptor descriptor = entry.getValue(); + IndexProxy proxy = indexProxyCreator.createPopulatingIndexProxy( - indexId, descriptors.getIndexDescriptor(), descriptors.getProviderDescriptor(), false, - monitor, populationJob ); + indexId, + descriptor.getIndexDescriptor(), + descriptor.getProviderDescriptor(), + descriptor.getConfiguration(), + false, // never pass through a tentative online state during recovery + monitor, + populationJob ); proxy.start(); indexMap.putIndexProxy( indexId, proxy ); } @@ -524,7 +534,8 @@ public void createIndexes( IndexRule... rules ) throws IOException { populationJob = populationJob == null ? newIndexPopulationJob() : populationJob; index = indexProxyCreator.createPopulatingIndexProxy( - ruleId, descriptor, providerDescriptor, constraint, monitor, populationJob ); + ruleId, descriptor, providerDescriptor, IndexConfiguration.of( constraint ), constraint, + monitor, populationJob ); index.start(); } else