From b14a182e3a65eea18954526808fce02bc3e52ab2 Mon Sep 17 00:00:00 2001 From: Ben Butler-Cole Date: Thu, 11 Aug 2016 11:53:58 +0100 Subject: [PATCH] db.awaitIndex() responds to the state of an index rather than returning details --- .../builtinprocs/BuiltInProcedures.java | 14 +++++++---- .../kernel/builtinprocs/AwaitIndexTest.java | 23 +++++++++++++++++++ .../builtinprocs/BuiltInProceduresTest.java | 2 +- .../integrationtest/BuiltInProceduresIT.java | 2 +- 4 files changed, 35 insertions(+), 6 deletions(-) diff --git a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java index dda8ffddff48d..59feaf0836264 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/builtinprocs/BuiltInProcedures.java @@ -34,6 +34,7 @@ import org.neo4j.kernel.api.exceptions.index.IndexNotFoundKernelException; import org.neo4j.kernel.api.exceptions.schema.SchemaRuleNotFoundException; import org.neo4j.kernel.api.index.IndexDescriptor; +import org.neo4j.kernel.api.index.InternalIndexState; import org.neo4j.kernel.api.proc.ProcedureSignature; import org.neo4j.kernel.impl.api.TokenAccess; import org.neo4j.procedure.Context; @@ -41,6 +42,7 @@ import org.neo4j.procedure.Procedure; import static org.neo4j.helpers.collection.Iterators.asList; +import static org.neo4j.kernel.api.index.InternalIndexState.ONLINE; import static org.neo4j.procedure.Procedure.Mode.READ; public class BuiltInProcedures @@ -93,12 +95,11 @@ public Stream listIndexes() throws ProcedureException } @Procedure(name = "db.awaitIndex", mode = READ) - public Stream awaitIndex( @Name("label") String labelName, @Name("property") String propertyKeyName ) + public void awaitIndex( @Name("label") String labelName, @Name("property") String propertyKeyName ) throws ProcedureException { ReadOperations operations = tx.acquireStatement().readOperations(); - TokenNameLookup tokens = new StatementTokenNameLookup( operations ); int labelId = operations.labelGetForName( labelName ); if ( labelId == ReadOperations.NO_SUCH_LABEL ) @@ -113,17 +114,22 @@ public Stream awaitIndex( @Name("label") String labelName, @Name("p propertyKeyName ); } + InternalIndexState state; try { IndexDescriptor index = operations.indexGetForLabelAndPropertyKey( labelId, propertyKeyId ); - return Stream.of( new IndexResult( "INDEX ON " + index.userDescription( tokens ), - operations.indexGetState( index ).toString() ) ); + state = operations.indexGetState( index ); } catch ( SchemaRuleNotFoundException | IndexNotFoundKernelException e ) { throw new ProcedureException( Status.Schema.IndexNotFound, e, "No index on :%s(%s)", labelName, propertyKeyName ); } + + if ( state != ONLINE ) + { + throw new ProcedureException( Status.General.UnknownError, "Index not online" ); + } } @Procedure(name = "db.constraints", mode = READ) diff --git a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/AwaitIndexTest.java b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/AwaitIndexTest.java index 6936a260336c9..486ae3e8e3dc7 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/AwaitIndexTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/AwaitIndexTest.java @@ -48,6 +48,7 @@ import static org.mockito.Mockito.when; import static org.neo4j.kernel.api.index.InternalIndexState.ONLINE; +import static org.neo4j.kernel.api.index.InternalIndexState.POPULATING; public class AwaitIndexTest { @@ -107,6 +108,28 @@ public void shouldLookUpTheIndexByLabelIdAndPropertyKeyId() verify( operations ).indexGetForLabelAndPropertyKey( 123, 456 ); } + @Test + public void shouldThrowAnExceptionIfTheIndexIsNotOnline() + throws SchemaRuleNotFoundException, IndexNotFoundKernelException + + { + when( operations.labelGetForName( anyString() ) ).thenReturn( 123 ); + when( operations.propertyKeyGetForName( anyString() ) ).thenReturn( 456 ); + when( operations.indexGetForLabelAndPropertyKey( anyInt(), anyInt() ) ) + .thenReturn( new IndexDescriptor( -1, -1 ) ); + when( operations.indexGetState( any( IndexDescriptor.class ) ) ).thenReturn( POPULATING ); + + try + { + procedures.awaitIndex( null, null ); + fail( "Expected an exception" ); + } + catch ( ProcedureException e ) + { + assertThat( e.getMessage(), containsString( "not online" ) ); + } + } + private class StubKernelTransaction implements KernelTransaction { private final ReadOperations readOperations; diff --git a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java index c23d657e53844..f89e63cdbddf3 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/builtinprocs/BuiltInProceduresTest.java @@ -143,7 +143,7 @@ public void shouldListCorrectBuiltinProcedures() throws Throwable { // When/Then assertThat( call( "dbms.procedures" ), contains( - record( "db.awaitIndex", "db.awaitIndex(label :: STRING?, property :: STRING?) :: (description :: STRING?, state :: STRING?)" ), + record( "db.awaitIndex", "db.awaitIndex(label :: STRING?, property :: STRING?) :: VOID" ), record( "db.constraints", "db.constraints() :: (description :: STRING?)" ), record( "db.indexes", "db.indexes() :: (description :: STRING?, state :: STRING?)" ), record( "db.labels", "db.labels() :: (label :: STRING?)" ), diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java index 23b12e8e2e676..7df184d3e3366 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/integrationtest/BuiltInProceduresIT.java @@ -104,7 +104,7 @@ public void listProcedures() throws Throwable assertThat( asList( stream ), containsInAnyOrder( equalTo( new Object[]{"db.constraints", "db.constraints() :: (description :: STRING?)"} ), equalTo( new Object[]{"db.indexes", "db.indexes() :: (description :: STRING?, state :: STRING?)"} ), - equalTo( new Object[]{"db.awaitIndex", "db.awaitIndex(label :: STRING?, property :: STRING?) :: (description :: STRING?, state :: STRING?)"} ), + equalTo( new Object[]{"db.awaitIndex", "db.awaitIndex(label :: STRING?, property :: STRING?) :: VOID"} ), equalTo( new Object[]{"db.propertyKeys", "db.propertyKeys() :: (propertyKey :: STRING?)"} ), equalTo( new Object[]{"db.labels", "db.labels() :: (label :: STRING?)"} ), equalTo( new Object[]{"db.relationshipTypes", "db.relationshipTypes() :: (relationshipType :: " +