diff --git a/community/community-it/index-it/src/test/java/schema/MultiIndexPopulationConcurrentUpdatesIT.java b/community/community-it/index-it/src/test/java/schema/MultiIndexPopulationConcurrentUpdatesIT.java index 5d4d9fb0bb0ac..ec4058bdcc7db 100644 --- a/community/community-it/index-it/src/test/java/schema/MultiIndexPopulationConcurrentUpdatesIT.java +++ b/community/community-it/index-it/src/test/java/schema/MultiIndexPopulationConcurrentUpdatesIT.java @@ -313,9 +313,10 @@ private void launchCustomIndexPopulation( Map labelNameIdMap, in JobScheduler scheduler = getJobScheduler(); TokenNameLookup tokenNameLookup = new SilentTokenNameLookup( ktx.tokenRead() ); + NullLogProvider nullLogProvider = NullLogProvider.getInstance(); indexService = IndexingServiceFactory.createIndexingService( Config.defaults(), scheduler, providerMap, storeView, tokenNameLookup, getIndexRules( neoStores ), - NullLogProvider.getInstance(), IndexingService.NO_MONITOR, getSchemaState() ); + nullLogProvider, nullLogProvider, IndexingService.NO_MONITOR, getSchemaState() ); indexService.start(); rules = createIndexRules( labelNameIdMap, propertyId ); diff --git a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java index 8e9dd2fbc45a5..f0731efbe46d3 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/NeoStoreDataSource.java @@ -176,6 +176,7 @@ public class NeoStoreDataSource extends LifecycleAdapter private final LogService logService; private final AutoIndexing autoIndexing; private final LogProvider logProvider; + private final LogProvider userLogProvider; private final DependencyResolver dependencyResolver; private final TokenNameLookup tokenNameLookup; private final TokenHolders tokenHolders; @@ -244,6 +245,7 @@ public NeoStoreDataSource( DatabaseCreationContext context ) this.explicitIndexProvider = context.getExplicitIndexProvider(); this.storeCopyCheckPointMutex = context.getStoreCopyCheckPointMutex(); this.logProvider = context.getLogService().getInternalLogProvider(); + this.userLogProvider = context.getLogService().getUserLogProvider(); this.tokenHolders = context.getTokenHolders(); this.locks = context.getLocks(); this.statementLocksFactory = context.getStatementLocksFactory(); @@ -500,7 +502,7 @@ private StorageEngine buildStorageEngine( OperationalMode operationalMode, VersionContextSupplier versionContextSupplier ) { RecordStorageEngine storageEngine = - new RecordStorageEngine( databaseLayout, config, pageCache, fs, logProvider, tokenHolders, + new RecordStorageEngine( databaseLayout, config, pageCache, fs, logProvider, userLogProvider, tokenHolders, schemaState, constraintSemantics, scheduler, tokenNameLookup, lockService, indexProviderMap, indexingServiceMonitor, databaseHealth, explicitIndexProviderLookup, indexConfigStore, 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 7e563f246499e..0a8150a72825d 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 @@ -109,10 +109,11 @@ public class IndexingService extends LifecycleAdapter implements IndexingUpdateS private final IndexProviderMap providerMap; private final IndexMapReference indexMapRef; private final Iterable indexDescriptors; - private final Log log; + private final Log internalLog; + private final Log userLog; private final TokenNameLookup tokenNameLookup; private final MultiPopulatorFactory multiPopulatorFactory; - private final LogProvider logProvider; + private final LogProvider internalLogProvider; private final Monitor monitor; private final SchemaState schemaState; private final IndexPopulationJobController populationJobController; @@ -181,7 +182,8 @@ public void awaitingPopulationOfRecoveredIndex( StoreIndexDescriptor descriptor JobScheduler scheduler, SchemaState schemaState, MultiPopulatorFactory multiPopulatorFactory, - LogProvider logProvider, + LogProvider internalLogProvider, + LogProvider userLogProvider, Monitor monitor ) { this.indexProxyCreator = indexProxyCreator; @@ -193,10 +195,11 @@ public void awaitingPopulationOfRecoveredIndex( StoreIndexDescriptor descriptor this.tokenNameLookup = tokenNameLookup; this.schemaState = schemaState; this.multiPopulatorFactory = multiPopulatorFactory; - this.logProvider = logProvider; + this.internalLogProvider = internalLogProvider; this.monitor = monitor; this.populationJobController = new IndexPopulationJobController( scheduler ); - this.log = logProvider.getLog( getClass() ); + this.internalLog = internalLogProvider.getLog( getClass() ); + this.userLog = userLogProvider.getLog( getClass() ); } /** @@ -224,7 +227,7 @@ public void init() indexProviders.computeIfAbsent( providerDescriptor, indexProviderDescriptor -> new ArrayList<>() ) .add( indexLogRecord ); - log.debug( indexStateInfo( "init", initialState, indexDescriptor ) ); + internalLog.debug( indexStateInfo( "init", initialState, indexDescriptor ) ); switch ( initialState ) { case ONLINE: @@ -293,7 +296,7 @@ public void start() .add( indexLogRecord ); indexProviders.computeIfAbsent( providerDescriptor, indexProviderDescriptor -> new ArrayList<>() ) .add( indexLogRecord ); - log.debug( indexStateInfo( "start", state, descriptor ) ); + internalLog.debug( indexStateInfo( "start", state, descriptor ) ); switch ( state ) { case ONLINE: @@ -611,7 +614,7 @@ else if ( index != null ) public void triggerIndexSampling( IndexSamplingMode mode ) { - log.info( "Manual trigger for sampling all indexes [" + mode + "]" ); + internalLog.info( "Manual trigger for sampling all indexes [" + mode + "]" ); samplingController.sampleIndexes( mode ); } @@ -619,7 +622,7 @@ public void triggerIndexSampling( SchemaDescriptor descriptor, IndexSamplingMode throws IndexNotFoundKernelException { String description = descriptor.userDescription( tokenNameLookup ); - log.info( "Manual trigger for sampling index " + description + " [" + mode + "]" ); + internalLog.info( "Manual trigger for sampling index " + description + " [" + mode + "]" ); samplingController.sampleIndex( indexMapRef.getIndexId( descriptor ), mode ); } @@ -643,7 +646,7 @@ public void activateIndex( long indexId ) throws IndexProxy index = getIndexProxy( indexId ); index.awaitStoreScanCompleted(); index.activate(); - log.info( "Constraint %s is %s.", index.getDescriptor(), ONLINE.name() ); + internalLog.info( "Constraint %s is %s.", index.getDescriptor(), ONLINE.name() ); } } catch ( InterruptedException e ) @@ -716,7 +719,7 @@ private void closeAllIndexes() } catch ( Exception e ) { - log.error( "Unable to close index", e ); + internalLog.error( "Unable to close index", e ); } } // Effectively clearing it @@ -747,7 +750,7 @@ public ResourceIterator snapshotIndexFiles() throws IOException private IndexPopulationJob newIndexPopulationJob( EntityType type, boolean verifyBeforeFlipping ) { - MultipleIndexPopulator multiPopulator = multiPopulatorFactory.create( storeView, logProvider, type, schemaState ); + MultipleIndexPopulator multiPopulator = multiPopulatorFactory.create( storeView, internalLogProvider, type, schemaState ); return new IndexPopulationJob( multiPopulator, monitor, verifyBeforeFlipping ); } @@ -785,10 +788,10 @@ private void logIndexStateSummary( String method, Map logRecords = indexStateEntry.getValue(); for ( IndexLogRecord logRecord : logRecords ) { - log.info( indexStateInfo( method, state, logRecord.getDescriptor() ) ); + internalLog.info( indexStateInfo( method, state, logRecord.getDescriptor() ) ); } } - log.info( format( "IndexingService.%s: indexes not specifically mentioned above are %s", method, mostPopularState ) ); + internalLog.info( format( "IndexingService.%s: indexes not specifically mentioned above are %s", method, mostPopularState ) ); } private void logIndexProviderSummary( String method, Map> indexProviders ) @@ -810,8 +813,7 @@ private void logIndexProviderSummary( String method, Map indexRules, - LogProvider logProvider, + LogProvider internalLogProvider, + LogProvider userLogProvider, IndexingService.Monitor monitor, SchemaState schemaState ) { @@ -52,13 +53,13 @@ public static IndexingService createIndexingService( Config config, MultiPopulatorFactory multiPopulatorFactory = MultiPopulatorFactory.forConfig( config ); IndexMapReference indexMapRef = new IndexMapReference(); IndexSamplingControllerFactory factory = - new IndexSamplingControllerFactory( samplingConfig, storeView, scheduler, tokenNameLookup, logProvider ); + new IndexSamplingControllerFactory( samplingConfig, storeView, scheduler, tokenNameLookup, internalLogProvider ); IndexSamplingController indexSamplingController = factory.create( indexMapRef ); IndexProxyCreator proxySetup = - new IndexProxyCreator( samplingConfig, storeView, providerMap, tokenNameLookup, logProvider ); + new IndexProxyCreator( samplingConfig, storeView, providerMap, tokenNameLookup, internalLogProvider ); return new IndexingService( proxySetup, providerMap, indexMapRef, storeView, indexRules, indexSamplingController, tokenNameLookup, scheduler, schemaState, - multiPopulatorFactory, logProvider, monitor ); + multiPopulatorFactory, internalLogProvider, userLogProvider, monitor ); } } diff --git a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java index 36397773999ec..1cc9b098eba5f 100644 --- a/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java +++ b/community/kernel/src/main/java/org/neo4j/kernel/impl/storageengine/impl/recordstorage/RecordStorageEngine.java @@ -152,6 +152,7 @@ public RecordStorageEngine( PageCache pageCache, FileSystemAbstraction fs, LogProvider logProvider, + LogProvider userLogProvider, TokenHolders tokenHolders, SchemaState schemaState, ConstraintSemantics constraintSemantics, @@ -204,7 +205,7 @@ public RecordStorageEngine( this.indexProviderMap = indexProviderMap; indexingService = IndexingServiceFactory.createIndexingService( config, scheduler, indexProviderMap, indexStoreView, tokenNameLookup, - Iterators.asList( schemaStorage.indexesGetAll() ), logProvider, + Iterators.asList( schemaStorage.indexesGetAll() ), logProvider, userLogProvider, indexingServiceMonitor, schemaState ); integrityValidator = new IntegrityValidator( neoStores, indexingService ); diff --git a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java index f9884acc3fc6e..02e37962b05a6 100644 --- a/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java +++ b/community/kernel/src/main/java/org/neo4j/unsafe/batchinsert/internal/BatchInserterImpl.java @@ -502,9 +502,12 @@ private IndexReference createIndex( int labelId, int[] propertyKeyIds, Optional< private void repopulateAllIndexes( NativeLabelScanStore labelIndex ) { LogProvider logProvider = logService.getInternalLogProvider(); + LogProvider userLogProvider = logService.getUserLogProvider(); IndexStoreView indexStoreView = new DynamicIndexStoreView( storeIndexStoreView, labelIndex, NO_LOCK_SERVICE, neoStores, logProvider ); - IndexingService indexingService = life.add( IndexingServiceFactory.createIndexingService( config, jobScheduler, indexProviderMap, indexStoreView, - new NonTransactionalTokenNameLookup( tokenHolders ), emptyList(), logProvider, NO_MONITOR, new DatabaseSchemaState( logProvider ) ) ); + IndexingService indexingService = IndexingServiceFactory + .createIndexingService( config, jobScheduler, indexProviderMap, indexStoreView, new NonTransactionalTokenNameLookup( tokenHolders ), + emptyList(), logProvider, userLogProvider, NO_MONITOR, new DatabaseSchemaState( logProvider ) ); + life.add( indexingService ); try { StoreIndexDescriptor[] descriptors = getIndexesNeedingPopulation(); diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexingServiceTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexingServiceTest.java index 0f13db2365f72..99d25274594cb 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexingServiceTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/api/index/IndexingServiceTest.java @@ -44,6 +44,7 @@ import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.Consumer; import java.util.function.IntPredicate; import org.neo4j.graphdb.DependencyResolver; @@ -175,7 +176,8 @@ public class IndexingServiceTest private final IndexAccessor accessor = mock( IndexAccessor.class, RETURNS_MOCKS ); private final IndexStoreView storeView = mock( IndexStoreView.class ); private final TokenNameLookup nameLookup = mock( TokenNameLookup.class ); - private final AssertableLogProvider logProvider = new AssertableLogProvider(); + private final AssertableLogProvider internalLogProvider = new AssertableLogProvider(); + private final AssertableLogProvider userLogProvider = new AssertableLogProvider(); @Before public void setUp() @@ -192,7 +194,7 @@ public void noMessagesWhenThereIsNoIndexes() IndexingService indexingService = createIndexServiceWithCustomIndexMap( indexMapReference ); indexingService.start(); - logProvider.assertNoLoggingOccurred(); + internalLogProvider.assertNoLoggingOccurred(); } @Test @@ -385,7 +387,7 @@ public void shouldLogIndexStateOnInit() throws Exception life.add( IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, mock( IndexStoreView.class ), mockLookup, asList( onlineIndex, populatingIndex, failedIndex ), - logProvider, IndexingService.NO_MONITOR, schemaState ) ); + internalLogProvider, userLogProvider, IndexingService.NO_MONITOR, schemaState ) ); when( provider.getInitialState( onlineIndex ) ) .thenReturn( ONLINE ); @@ -403,7 +405,7 @@ public void shouldLogIndexStateOnInit() throws Exception life.init(); // then - logProvider.assertAtLeastOnce( + internalLogProvider.assertAtLeastOnce( logMatch.debug( "IndexingService.init: index 1 on :LabelOne(propertyOne) is ONLINE" ), logMatch.debug( "IndexingService.init: index 2 on :LabelOne(propertyTwo) is POPULATING" ), logMatch.debug( "IndexingService.init: index 3 on :LabelTwo(propertyTwo) is FAILED" ) @@ -426,7 +428,7 @@ public void shouldLogIndexStateOnStart() throws Exception IndexingService indexingService = IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, storeView, mockLookup, - asList( onlineIndex, populatingIndex, failedIndex ), logProvider, IndexingService.NO_MONITOR, + asList( onlineIndex, populatingIndex, failedIndex ), internalLogProvider, userLogProvider, IndexingService.NO_MONITOR, schemaState ); when( provider.getInitialState( onlineIndex ) ) @@ -444,14 +446,14 @@ public void shouldLogIndexStateOnStart() throws Exception when(mockLookup.propertyKeyGetName( 2 )).thenReturn( "propertyTwo" ); when( storeView.indexSample( anyLong(), any( DoubleLongRegister.class ) ) ).thenReturn( newDoubleLongRegister( 32L, 32L ) ); - logProvider.clear(); + internalLogProvider.clear(); // when indexingService.start(); // then verify( provider ).getPopulationFailure( failedIndex ); - logProvider.assertAtLeastOnce( + internalLogProvider.assertAtLeastOnce( logMatch.debug( "IndexingService.start: index 1 on :LabelOne(propertyOne) is ONLINE" ), logMatch.debug( "IndexingService.start: index 2 on :LabelOne(propertyTwo) is POPULATING" ), logMatch.debug( "IndexingService.start: index 3 on :LabelTwo(propertyTwo) is FAILED" ) @@ -482,16 +484,16 @@ public void shouldNotLogWhenNoDeprecatedIndexesOnInit() throws IOException IndexingService indexingService = IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, storeView, mockLookup, - Collections.singletonList( nativeBtree10Index ), logProvider, IndexingService.NO_MONITOR, + Collections.singletonList( nativeBtree10Index ),internalLogProvider, userLogProvider, IndexingService.NO_MONITOR, schemaState ); // when indexingService.init(); // then - logProvider.assertNoMessagesContaining( "IndexingService.init: Deprecated index providers in use:" ); - logProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ); - logProvider.assertNoMessagesContaining( fulltextDescriptor.name() ); + onBothLogProviders( logProvider -> logProvider.assertNoMessagesContaining( "IndexingService.init: Deprecated index providers in use:" ) ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ) ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( fulltextDescriptor.name() ) ); } @Test @@ -511,26 +513,26 @@ public void shouldNotLogWhenNoDeprecatedIndexesOnStart() throws IOException when( fulltextProvider.getInitialState( fulltextIndex ) ).thenReturn( ONLINE ); Config config = Config.defaults( default_schema_provider, nativeBtree10Descriptor.name() ); - DependencyResolver dependencies = buildIndexDependencies( lucene10Provider, native10Provider, native20Provider, nativeBtree10Provider, fulltextProvider ); + DependencyResolver dependencies = + buildIndexDependencies( lucene10Provider, native10Provider, native20Provider, nativeBtree10Provider, fulltextProvider ); DefaultIndexProviderMap providerMap = new DefaultIndexProviderMap( dependencies, config ); providerMap.init(); TokenNameLookup mockLookup = mock( TokenNameLookup.class ); - IndexingService indexingService = IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, storeView, mockLookup, - Collections.singletonList( nativeBtree10Index ), logProvider, IndexingService.NO_MONITOR, + Collections.singletonList( nativeBtree10Index ), internalLogProvider, userLogProvider, IndexingService.NO_MONITOR, schemaState ); // when indexingService.init(); - logProvider.clear(); + internalLogProvider.clear(); indexingService.start(); // then - logProvider.assertNoMessagesContaining( "IndexingService.start: Deprecated index providers in use:" ); - logProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ); - logProvider.assertNoMessagesContaining( fulltextDescriptor.name() ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( "IndexingService.start: Deprecated index providers in use:" ) ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ) ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( fulltextDescriptor.name() ) ); } @Test @@ -565,21 +567,21 @@ public void shouldLogDeprecatedIndexesOnInit() throws IOException IndexingService indexingService = IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, storeView, mockLookup, - asList( lucene10Index, native10Index, native20Index1, native20Index2, nativeBtree10Index ), logProvider, IndexingService.NO_MONITOR, - schemaState ); + asList( lucene10Index, native10Index, native20Index1, native20Index2, nativeBtree10Index ), internalLogProvider, userLogProvider, + IndexingService.NO_MONITOR, schemaState ); // when indexingService.init(); // then - logProvider.assertContainsExactlyOneMessageMatchingInAnyOrder( + userLogProvider.assertContainsExactlyOneMessageMatchingInAnyOrder( Matchers.containsString( "IndexingService.init: Deprecated index providers in use:" ), Matchers.containsString( lucene10Descriptor.name() + " (1 index)" ), Matchers.containsString( native10Descriptor.name() + " (1 index)" ), Matchers.containsString( native20Descriptor.name() + " (2 indexes)" ) ); - logProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ); - logProvider.assertNoMessagesContaining( fulltextDescriptor.name() ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ) ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( fulltextDescriptor.name() ) ); } @Test @@ -614,23 +616,23 @@ public void shouldLogDeprecatedIndexesOnStart() throws IOException IndexingService indexingService = IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, storeView, mockLookup, - asList( lucene10Index, native10Index, native20Index1, native20Index2, nativeBtree10Index ), logProvider, IndexingService.NO_MONITOR, - schemaState ); + asList( lucene10Index, native10Index, native20Index1, native20Index2, nativeBtree10Index ), internalLogProvider, userLogProvider, + IndexingService.NO_MONITOR, schemaState ); // when indexingService.init(); - logProvider.clear(); + userLogProvider.clear(); indexingService.start(); // then - logProvider.assertContainsExactlyOneMessageMatchingInAnyOrder( + userLogProvider.assertContainsExactlyOneMessageMatchingInAnyOrder( Matchers.containsString( "IndexingService.start: Deprecated index providers in use:" ), Matchers.containsString( lucene10Descriptor.name() + " (1 index)" ), Matchers.containsString( native10Descriptor.name() + " (1 index)" ), Matchers.containsString( native20Descriptor.name() + " (2 indexes)" ) ); - logProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ); - logProvider.assertNoMessagesContaining( fulltextDescriptor.name() ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( nativeBtree10Descriptor.name() ) ); + onBothLogProviders( logProvider -> internalLogProvider.assertNoMessagesContaining( fulltextDescriptor.name() ) ); } @Test @@ -744,7 +746,7 @@ public void shouldLogTriggerSamplingOnAllIndexes() throws Exception indexingService.triggerIndexSampling( mode ); // then - logProvider.assertAtLeastOnce( + internalLogProvider.assertAtLeastOnce( logMatch.info( "Manual trigger for sampling all indexes [" + mode + "]" ) ); } @@ -766,7 +768,7 @@ public void shouldLogTriggerSamplingOnAnIndexes() throws Exception // then String userDescription = descriptor.schema().userDescription( nameLookup ); - logProvider.assertAtLeastOnce( + internalLogProvider.assertAtLeastOnce( logMatch.info( "Manual trigger for sampling index " + userDescription + " [" + mode + "]" ) ); } @@ -1060,10 +1062,10 @@ public void shouldStoreIndexFailureWhenFailingToCreateOnlineAccessorAfterPopulat assertEquals( FAILED, indexing.getIndexProxy( 1 ).getState() ); assertEquals( asList( true, false ), closeArgs.getAllValues() ); assertThat( storedFailure(), containsString( format( "java.io.IOException: Expected failure%n\tat " ) ) ); - logProvider.assertAtLeastOnce( inLog( IndexPopulationJob.class ).error( equalTo( + internalLogProvider.assertAtLeastOnce( inLog( IndexPopulationJob.class ).error( equalTo( "Failed to populate index: [:TheLabel(propertyKey) [provider: {key=quantum-dex, version=25.0}]]" ), causedBy( exception ) ) ); - logProvider.assertNone( inLog( IndexPopulationJob.class ).info( + internalLogProvider.assertNone( inLog( IndexPopulationJob.class ).info( "Index population completed. Index is now online: [%s]", ":TheLabel(propertyKey) [provider: {key=quantum-dex, version=25.0}]" ) ); } @@ -1095,10 +1097,10 @@ public void shouldStoreIndexFailureWhenFailingToCreateOnlineAccessorAfterRecover assertEquals( FAILED, indexing.getIndexProxy( 1 ).getState() ); assertEquals( asList( true, false ), closeArgs.getAllValues() ); assertThat( storedFailure(), containsString( format( "java.io.IOException: Expected failure%n\tat " ) ) ); - logProvider.assertAtLeastOnce( inLog( IndexPopulationJob.class ).error( equalTo( + internalLogProvider.assertAtLeastOnce( inLog( IndexPopulationJob.class ).error( equalTo( "Failed to populate index: [:TheLabel(propertyKey) [provider: {key=quantum-dex, version=25.0}]]" ), causedBy( exception ) ) ); - logProvider.assertNone( inLog( IndexPopulationJob.class ).info( + internalLogProvider.assertNone( inLog( IndexPopulationJob.class ).info( "Index population completed. Index is now online: [%s]", ":TheLabel(propertyKey) [provider: {key=quantum-dex, version=25.0}]" ) ); } @@ -1132,7 +1134,7 @@ public void shouldLogIndexStateOutliersOnInit() throws Exception } life.add( IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, - mock( IndexStoreView.class ), mockLookup, indexes, logProvider, IndexingService.NO_MONITOR, + mock( IndexStoreView.class ), mockLookup, indexes, internalLogProvider, userLogProvider, IndexingService.NO_MONITOR, schemaState ) ); when( mockLookup.propertyKeyGetName( 1 ) ).thenReturn( "prop" ); @@ -1141,12 +1143,12 @@ public void shouldLogIndexStateOutliersOnInit() throws Exception life.init(); // then - logProvider.assertAtLeastOnce( + internalLogProvider.assertAtLeastOnce( logMatch.info( "IndexingService.init: index 1 on :Label1(prop) is POPULATING" ), logMatch.info( "IndexingService.init: index 2 on :Label2(prop) is FAILED" ), logMatch.info( "IndexingService.init: indexes not specifically mentioned above are ONLINE" ) ); - logProvider.assertNone( logMatch.info( "IndexingService.init: index 3 on :Label3(prop) is ONLINE" ) ); + internalLogProvider.assertNone( logMatch.info( "IndexingService.init: index 3 on :Label3(prop) is ONLINE" ) ); } @Test @@ -1180,23 +1182,23 @@ public void shouldLogIndexStateOutliersOnStart() throws Exception IndexingService indexingService = IndexingServiceFactory.createIndexingService( config, mock( JobScheduler.class ), providerMap, storeView, mockLookup, indexes, - logProvider, IndexingService.NO_MONITOR, schemaState ); + internalLogProvider, userLogProvider, IndexingService.NO_MONITOR, schemaState ); when( storeView.indexSample( anyLong(), any( DoubleLongRegister.class ) ) ) .thenReturn( newDoubleLongRegister( 32L, 32L ) ); when( mockLookup.propertyKeyGetName( 1 ) ).thenReturn( "prop" ); // when indexingService.init(); - logProvider.clear(); + internalLogProvider.clear(); indexingService.start(); // then - logProvider.assertAtLeastOnce( + internalLogProvider.assertAtLeastOnce( logMatch.info( "IndexingService.start: index 1 on :Label1(prop) is POPULATING" ), logMatch.info( "IndexingService.start: index 2 on :Label2(prop) is FAILED" ), logMatch.info( "IndexingService.start: indexes not specifically mentioned above are ONLINE" ) ); - logProvider.assertNone( logMatch.info( "IndexingService.start: index 3 on :Label3(prop) is ONLINE" ) ); + internalLogProvider.assertNone( logMatch.info( "IndexingService.start: index 3 on :Label3(prop) is ONLINE" ) ); } @Test @@ -1438,7 +1440,8 @@ private IndexingService newIndexingServiceWithMockedDependencies( IndexPopulator storeView, nameLookup, loop( iterator( rules ) ), - logProvider, + internalLogProvider, + userLogProvider, monitor, schemaState ) ); @@ -1602,7 +1605,7 @@ private IndexingService createIndexServiceWithCustomIndexMap( IndexMapReference indexMapReference, mock( IndexStoreView.class ), Collections.emptyList(), mock( IndexSamplingController.class ), mock( TokenNameLookup.class ), mock( JobScheduler.class ), mock( SchemaState.class ), mock( MultiPopulatorFactory.class ), - logProvider, IndexingService.NO_MONITOR ); + internalLogProvider, userLogProvider, IndexingService.NO_MONITOR ); } private static DependencyResolver buildIndexDependencies( IndexProvider provider ) @@ -1626,4 +1629,10 @@ private IndexProvider mockIndexProviderWithAccessor( IndexProviderDescriptor des .thenReturn( indexAccessor ); return provider; } + + private void onBothLogProviders( Consumer logProviderAction ) + { + logProviderAction.accept( internalLogProvider ); + logProviderAction.accept( userLogProvider ); + } } diff --git a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/OnlineIndexUpdatesTest.java b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/OnlineIndexUpdatesTest.java index 54af082ce669b..19f889429e861 100644 --- a/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/OnlineIndexUpdatesTest.java +++ b/community/kernel/src/test/java/org/neo4j/kernel/impl/transaction/state/OnlineIndexUpdatesTest.java @@ -110,9 +110,9 @@ public void setUp() throws Exception PageCache pageCache = storage.pageCache(); DatabaseLayout databaseLayout = storage.directory().databaseLayout(); Config config = Config.defaults( GraphDatabaseSettings.default_schema_provider, EMPTY.getProviderDescriptor().name() ); - NullLogProvider logProvider = NullLogProvider.getInstance(); + NullLogProvider nullLogProvider = NullLogProvider.getInstance(); StoreFactory storeFactory = new StoreFactory( databaseLayout, config, new DefaultIdGeneratorFactory( storage.fileSystem() ), pageCache, - storage.fileSystem(), logProvider, EmptyVersionContextSupplier.EMPTY ); + storage.fileSystem(), nullLogProvider, EmptyVersionContextSupplier.EMPTY ); neoStores = storeFactory.openAllNeoStores( true ); neoStores.getCounts().start(); @@ -126,8 +126,8 @@ public void setUp() throws Exception DefaultIndexProviderMap providerMap = new DefaultIndexProviderMap( dependencies, config ); life.add( providerMap ); indexingService = IndexingServiceFactory.createIndexingService( config, scheduler, providerMap, - new NeoStoreIndexStoreView( LockService.NO_LOCK_SERVICE, neoStores ), SchemaUtil.idTokenNameLookup, empty(), logProvider, - IndexingService.NO_MONITOR, new DatabaseSchemaState( logProvider ) ); + new NeoStoreIndexStoreView( LockService.NO_LOCK_SERVICE, neoStores ), SchemaUtil.idTokenNameLookup, empty(), nullLogProvider, nullLogProvider, + IndexingService.NO_MONITOR, new DatabaseSchemaState( nullLogProvider ) ); propertyPhysicalToLogicalConverter = new PropertyPhysicalToLogicalConverter( neoStores.getPropertyStore() ); life.add( indexingService ); life.add( scheduler ); diff --git a/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java b/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java index 8cdd4d04f9512..7740b51a89b0f 100644 --- a/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java +++ b/community/kernel/src/test/java/org/neo4j/test/rule/RecordStorageEngineRule.java @@ -115,10 +115,10 @@ private RecordStorageEngine get( FileSystemAbstraction fs, PageCache pageCache, new BufferingIdGeneratorFactory( idGeneratorFactory, IdReuseEligibility.ALWAYS, new CommunityIdTypeConfigurationProvider() ); DefaultIndexProviderMap indexProviderMap = new DefaultIndexProviderMap( dependencies, config ); - NullLogProvider logProvider = NullLogProvider.getInstance(); + NullLogProvider nullLogProvider = NullLogProvider.getInstance(); life.add( indexProviderMap ); return life.add( new ExtendedRecordStorageEngine( databaseLayout, config, pageCache, fs, - logProvider, mockedTokenHolders(), + nullLogProvider, nullLogProvider, mockedTokenHolders(), mock( SchemaState.class ), new StandardConstraintSemantics(), scheduler, mock( TokenNameLookup.class ), new ReentrantLockService(), indexProviderMap, IndexingService.NO_MONITOR, databaseHealth, explicitIndexProviderLookup, indexConfigStore, @@ -192,7 +192,7 @@ private static class ExtendedRecordStorageEngine extends RecordStorageEngine transactionApplierTransformer; ExtendedRecordStorageEngine( DatabaseLayout databaseLayout, Config config, PageCache pageCache, FileSystemAbstraction fs, - LogProvider logProvider, TokenHolders tokenHolders, SchemaState schemaState, + LogProvider logProvider, LogProvider userLogProvider, TokenHolders tokenHolders, SchemaState schemaState, ConstraintSemantics constraintSemantics, JobScheduler scheduler, TokenNameLookup tokenNameLookup, LockService lockService, IndexProviderMap indexProviderMap, IndexingService.Monitor indexingServiceMonitor, DatabaseHealth databaseHealth, @@ -202,10 +202,10 @@ private static class ExtendedRecordStorageEngine extends RecordStorageEngine Function transactionApplierTransformer, Monitors monitors, RecoveryCleanupWorkCollector recoveryCleanupWorkCollector, OperationalMode operationalMode ) { - super( databaseLayout, config, pageCache, fs, logProvider, tokenHolders, schemaState, constraintSemantics, scheduler, tokenNameLookup, - lockService, indexProviderMap, - indexingServiceMonitor, databaseHealth, explicitIndexProviderLookup, indexConfigStore, explicitIndexTransactionOrdering, idGeneratorFactory, - idController, monitors, recoveryCleanupWorkCollector, operationalMode, EmptyVersionContextSupplier.EMPTY ); + super( databaseLayout, config, pageCache, fs, logProvider, userLogProvider, tokenHolders, schemaState, constraintSemantics, scheduler, + tokenNameLookup, lockService, indexProviderMap, indexingServiceMonitor, databaseHealth, explicitIndexProviderLookup, indexConfigStore, + explicitIndexTransactionOrdering, idGeneratorFactory, idController, monitors, recoveryCleanupWorkCollector, operationalMode, + EmptyVersionContextSupplier.EMPTY ); this.transactionApplierTransformer = transactionApplierTransformer; }