@Override public IndexDirectoryStructure directoryStructure() { return indexProvider.directoryStructure(); }
private GatheringIndexWriter newWriter() throws IOException { GatheringIndexWriter writer = new GatheringIndexWriter(); when( mockedIndexProvider.getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ).thenReturn( writer ); when( mockedIndexProvider.getOnlineAccessor( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ).thenReturn( writer ); return writer; }
@Override public InternalIndexState getInitialState( StoreIndexDescriptor descriptor ) { return indexProvider.getInitialState( descriptor ); }
private IndexProvider mockIndexProviderWithAccessor( IndexProviderDescriptor descriptor ) throws IOException { IndexProvider provider = mock( IndexProvider.class ); when( provider.getProviderDescriptor() ).thenReturn( descriptor ); IndexAccessor indexAccessor = mock( IndexAccessor.class ); when( provider.getOnlineAccessor( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ) .thenReturn( indexAccessor ); return provider; }
@Before public void setUp() throws MisconfiguredIndexException { when( mockedIndexProvider.getProviderDescriptor() ).thenReturn( PROVIDER_DESCRIPTOR ); when( mockedIndexProvider.storeMigrationParticipant( any( FileSystemAbstraction.class ), any( PageCache.class ) ) ) .thenReturn( StoreMigrationParticipant.NOT_PARTICIPATING ); when( mockedIndexProvider.bless( any( IndexDescriptor.class ) ) ).thenCallRealMethod(); }
@Test public void shouldRunIndexPopulationJobAtShutdown() throws Throwable { // GIVEN IndexPopulator populator = mock( IndexPopulator.class ); IndexProvider provider = mock( IndexProvider.class ); IndexAccessor accessor = mock( IndexAccessor.class ); when( provider.getProviderDescriptor() ).thenReturn( DESCRIPTOR ); when( provider.getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ).thenReturn( populator ); when( populator.sampleResult() ).thenReturn( new IndexSample() ); when( provider.getOnlineAccessor( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ).thenReturn( accessor ); when( provider.bless( any( IndexDescriptor.class ) ) ).thenCallRealMethod(); BatchInserter inserter = newBatchInserterWithIndexProvider( singleInstanceIndexProviderFactory( KEY, provider ), provider.getProviderDescriptor() ); inserter.createDeferredSchemaIndex( label( "Hacker" ) ).on( "handle" ).create(); long nodeId = inserter.createNode( map( "handle", "Jakewins" ), label( "Hacker" ) ); // WHEN inserter.shutdown(); // THEN verify( provider ).init(); verify( provider ).start(); verify( provider ).getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ); verify( populator ).create(); verify( populator ).add( argThat( matchesCollection( add( nodeId, internalIndex.schema(), Values.of( "Jakewins" ) ) ) ) ); verify( populator ).verifyDeferredConstraints( any( NodePropertyAccessor.class ) ); verify( populator ).close( true ); verify( provider ).stop(); verify( provider ).shutdown(); }
StoreIndexDescriptor... rules ) throws IOException when( indexProvider.getInitialState( any( StoreIndexDescriptor.class ) ) ).thenReturn( ONLINE ); when( indexProvider.getProviderDescriptor() ).thenReturn( PROVIDER_DESCRIPTOR ); when( indexProvider.getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ) .thenReturn( populator ); data.getsProcessedByStoreScanFrom( storeView ); when( indexProvider.getOnlineAccessor( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ) .thenReturn( accessor ); when( indexProvider.storeMigrationParticipant( any( FileSystemAbstraction.class ), any( PageCache.class ) ) ) .thenReturn( StoreMigrationParticipant.NOT_PARTICIPATING );
@Test public void shouldStorePopulationFailedForRetrievalFromProviderLater() throws Exception { // GIVEN String failure = "The contrived failure"; IndexSamplingConfig indexSamplingConfig = new IndexSamplingConfig( Config.defaults() ); // WHEN (this will attempt to call close) withPopulator( indexProvider.getPopulator( descriptor, indexSamplingConfig ), p -> p.markAsFailed( failure ), false ); // THEN assertThat( indexProvider.getPopulationFailure( descriptor ), containsString( failure ) ); }
@Test public void shouldReportInitialStateAsFailedIfPopulationFailed() throws Exception { // GIVEN IndexSamplingConfig indexSamplingConfig = new IndexSamplingConfig( Config.defaults() ); withPopulator( indexProvider.getPopulator( descriptor, indexSamplingConfig ), p -> { String failure = "The contrived failure"; // WHEN p.markAsFailed( failure ); p.close( false ); // THEN assertEquals( FAILED, indexProvider.getInitialState( descriptor ) ); }, false ); }
@Test public void shouldKeepFailedIndexesAsFailedAfterRestart() throws Exception { // Given IndexPopulator indexPopulator = mock( IndexPopulator.class ); when( mockedIndexProvider.getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ) .thenReturn( indexPopulator ); IndexAccessor indexAccessor = mock( IndexAccessor.class ); when( mockedIndexProvider.getOnlineAccessor( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ) .thenReturn( indexAccessor ); startDb(); createIndex( myLabel ); rotateLogsAndCheckPoint(); // And Given killDb(); when( mockedIndexProvider.getInitialState( any( StoreIndexDescriptor.class ) ) ) .thenReturn( InternalIndexState.FAILED ); // When startDb(); // Then assertThat( getIndexes( db, myLabel ), inTx( db, hasSize( 1 ) ) ); assertThat( getIndexes( db, myLabel ), inTx( db, haveState( db, Schema.IndexState.FAILED ) ) ); verify( mockedIndexProvider, times( 2 ) ) .getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ); }
@Test public void schemaAndLabelIndexesRemovedAfterSuccessfulMigration() throws IOException { IndexDirectoryStructure directoryStructure = mock( IndexDirectoryStructure.class ); File indexProviderRootDirectory = databaseLayout.file( "just-some-directory" ); when( directoryStructure.rootDirectory() ).thenReturn( indexProviderRootDirectory ); when( indexProvider.directoryStructure() ).thenReturn( directoryStructure ); when( indexProvider.getProviderDescriptor() ) .thenReturn( new IndexProviderDescriptor( "key", "version" ) ); migrator.migrate( databaseLayout, migrationLayout, progressReporter, StandardV2_3.STORE_VERSION, StandardV3_0.STORE_VERSION ); migrator.moveMigratedFiles( migrationLayout, databaseLayout, StandardV2_3.STORE_VERSION, StandardV3_0.STORE_VERSION ); verify( fs ).deleteRecursively( indexProviderRootDirectory ); } }
@Override public IndexAccessor getOnlineAccessor( StoreIndexDescriptor descriptor, IndexSamplingConfig samplingConfig ) throws IOException { return actualProvider.getOnlineAccessor( descriptor, samplingConfig ); }
@Override public IndexProviderDescriptor getProviderDescriptor() { return indexProvider.getProviderDescriptor(); }
private long dbWithIndexAndSingleIndexedNode() throws Exception { IndexPopulator populator = mock( IndexPopulator.class ); IndexProvider provider = mock( IndexProvider.class ); when( provider.getProviderDescriptor() ).thenReturn( DESCRIPTOR ); when( provider.getPopulator( any( StoreIndexDescriptor.class ), any( IndexSamplingConfig.class ) ) ) .thenReturn( populator ); when( provider.bless( any( IndexDescriptor.class ) ) ).thenCallRealMethod(); BatchInserter inserter = newBatchInserterWithIndexProvider( singleInstanceIndexProviderFactory( KEY, provider ), provider.getProviderDescriptor() ); inserter.createDeferredSchemaIndex( label("Hacker") ).on( "handle" ).create(); long nodeId = inserter.createNode( map( "handle", "Jakewins" ), label( "Hacker" ) ); inserter.shutdown(); return nodeId; }
private IndexReference createIndex( int labelId, int[] propertyKeyIds, Optional<String> indexName ) { LabelSchemaDescriptor schema = SchemaDescriptorFactory.forLabel( labelId, propertyKeyIds ); IndexProvider provider = indexProviderMap.getDefaultProvider(); IndexProviderDescriptor providerDescriptor = provider.getProviderDescriptor(); IndexDescriptor index = IndexDescriptorFactory.forSchema( schema, indexName, providerDescriptor ); StoreIndexDescriptor schemaRule; try { schemaRule = provider.bless( index ).withId( schemaStore.nextId() ); } catch ( MisconfiguredIndexException e ) { throw new ConstraintViolationException( "Unable to create index. The index configuration was refused by the '" + providerDescriptor + "' index provider.", e ); } for ( DynamicRecord record : schemaStore.allocateFrom( schemaRule ) ) { schemaStore.updateRecord( record ); } schemaCache.addSchemaRule( schemaRule ); labelsTouched = true; flushStrategy.forceFlush(); return schemaRule; }
@Before public void setup() throws IOException, EntityNotFoundException { indexProvider = providerCreator.apply( this ); rules.fileSystem().mkdirs( indexProvider.directoryStructure().rootDirectory() ); populator = indexProvider.getPopulator( descriptor, samplingConfig ); when( nodePropertyAccessor.getNodePropertyValue( anyLong(), anyInt() ) ).thenThrow( UnsupportedOperationException.class ); prevAccessCheck = UnsafeUtil.exchangeNativeAccessCheckEnabled( false ); }
@Override public IndexPopulator getPopulator( StoreIndexDescriptor descriptor, IndexSamplingConfig samplingConfig ) { return indexProvider.getPopulator( descriptor, samplingConfig ); }
@Override public IndexCapability getCapability( StoreIndexDescriptor descriptor ) { return actualProvider.getCapability( descriptor ); }
private void writeFailure( String indexName, StringBuilder builder, IndexProvider provider, StoreIndexDescriptor descriptor ) { try { String failure = provider.getPopulationFailure( descriptor ); builder.append( indexName ); builder.append( ": " ); builder.append( failure ); builder.append( ' ' ); } catch ( IllegalStateException e ) { // Just catch } }
schemaState ); when( provider.getInitialState( onlineIndex ) ) .thenReturn( ONLINE ); when( provider.getInitialState( populatingIndex ) ) .thenReturn( InternalIndexState.POPULATING ); when( provider.getInitialState( failedIndex ) ) .thenReturn( InternalIndexState.FAILED ); verify( provider ).getPopulationFailure( failedIndex ); internalLogProvider.assertAtLeastOnce( logMatch.debug( "IndexingService.start: index 1 on :LabelOne(propertyOne) is ONLINE" ),