public NeoStoreDataSource getDataSource( DatabaseLayout databaseLayout, FileSystemAbstraction fs, PageCache pageCache ) { return getDataSource( databaseLayout, fs, pageCache, new Dependencies() ); }
@Override protected void after( boolean successful ) { shutdownAnyRunning(); }
public NeoStoreDataSource getDataSource( DatabaseLayout databaseLayout, FileSystemAbstraction fs, PageCache pageCache, DependencyResolver otherCustomOverriddenDependencies ) shutdownAnyRunning(); Config config = dependency( mutableDependencies, Config.class, deps -> Config.defaults() ); config.augment( default_schema_provider, EMPTY.getProviderDescriptor().name() ); LogService logService = dependency( mutableDependencies, LogService.class, deps -> new SimpleLogService( NullLogProvider.getInstance() ) ); IdGeneratorFactory idGeneratorFactory = dependency( mutableDependencies, IdGeneratorFactory.class, deps -> new DefaultIdGeneratorFactory( fs ) ); IdTypeConfigurationProvider idConfigurationProvider = dependency( mutableDependencies, IdTypeConfigurationProvider.class, deps -> new CommunityIdTypeConfigurationProvider() ); DatabaseHealth databaseHealth = dependency( mutableDependencies, DatabaseHealth.class, deps -> new DatabaseHealth( mock( DatabasePanicEventGenerator.class ), NullLog.getInstance() ) ); SystemNanoClock clock = dependency( mutableDependencies, SystemNanoClock.class, deps -> Clocks.nanoClock() ); TransactionMonitor transactionMonitor = dependency( mutableDependencies, TransactionMonitor.class, deps -> new DatabaseTransactionStats() ); DatabaseAvailabilityGuard databaseAvailabilityGuard = dependency( mutableDependencies, DatabaseAvailabilityGuard.class, deps -> new DatabaseAvailabilityGuard( DEFAULT_DATABASE_NAME, deps.resolveDependency( SystemNanoClock.class ), NullLog.getInstance() ) ); dependency( mutableDependencies, DiagnosticsManager.class, deps -> new DiagnosticsManager( NullLog.getInstance() ) ); dependency( mutableDependencies, IndexProvider.class, deps -> EMPTY );
@Test public void flushOfThePageCacheHappensOnlyOnceDuringShutdown() throws Throwable { PageCache pageCache = spy( pageCacheRule.getPageCache( fs.get() ) ); NeoStoreDataSource ds = dsRule.getDataSource( dir.databaseLayout(), fs.get(), pageCache ); ds.start(); verify( pageCache, never() ).flushAndForce(); verify( pageCache, never() ).flushAndForce( any( IOLimiter.class ) ); ds.stop(); ds.shutdown(); verify( pageCache ).flushAndForce( IOLimiter.UNLIMITED ); }
@Test public void flushOfThePageCacheOnShutdownDoesNotHappenIfTheDbIsUnhealthy() throws Throwable { DatabaseHealth health = mock( DatabaseHealth.class ); when( health.isHealthy() ).thenReturn( false ); PageCache pageCache = spy( pageCacheRule.getPageCache( fs.get() ) ); Dependencies dependencies = new Dependencies(); dependencies.satisfyDependency( health ); NeoStoreDataSource ds = dsRule.getDataSource( dir.databaseLayout(), fs.get(), pageCache, dependencies ); ds.start(); verify( pageCache, never() ).flushAndForce(); ds.stop(); ds.shutdown(); verify( pageCache, never() ).flushAndForce( IOLimiter.UNLIMITED ); }
@Test public void flushOfThePageCacheOnShutdownHappensIfTheDbIsHealthy() throws Throwable { PageCache pageCache = spy( pageCacheRule.getPageCache( fs.get() ) ); NeoStoreDataSource ds = dsRule.getDataSource( dir.databaseLayout(), fs.get(), pageCache ); ds.start(); verify( pageCache, never() ).flushAndForce(); ds.stop(); ds.shutdown(); verify( pageCache ).flushAndForce( IOLimiter.UNLIMITED ); }
@Test public void shouldAlwaysShutdownLifeEvenWhenCheckPointingFails() throws Exception { // Given FileSystemAbstraction fs = this.fs.get(); PageCache pageCache = pageCacheRule.getPageCache( fs ); DatabaseHealth databaseHealth = mock( DatabaseHealth.class ); when( databaseHealth.isHealthy() ).thenReturn( true ); IOException ex = new IOException( "boom!" ); doThrow( ex ).when( databaseHealth ) .assertHealthy( IOException.class ); // <- this is a trick to simulate a failure during checkpointing Dependencies dependencies = new Dependencies(); dependencies.satisfyDependencies( databaseHealth ); NeoStoreDataSource dataSource = dsRule.getDataSource( dir.databaseLayout(), fs, pageCache, dependencies ); dataSource.start(); try { // When dataSource.stop(); fail( "it should have thrown" ); } catch ( LifecycleException e ) { // Then assertEquals( ex, e.getCause() ); } }
@Test public void logModuleSetUpError() { Config config = Config.defaults(); IdGeneratorFactory idGeneratorFactory = mock( IdGeneratorFactory.class ); Throwable openStoresError = new RuntimeException( "Can't set up modules" ); doThrow( openStoresError ).when( idGeneratorFactory ).create( any( File.class ), anyLong(), anyBoolean() ); CommunityIdTypeConfigurationProvider idTypeConfigurationProvider = new CommunityIdTypeConfigurationProvider(); AssertableLogProvider logProvider = new AssertableLogProvider(); SimpleLogService logService = new SimpleLogService( logProvider, logProvider ); PageCache pageCache = pageCacheRule.getPageCache( fs.get() ); Dependencies dependencies = new Dependencies(); dependencies.satisfyDependencies( idGeneratorFactory, idTypeConfigurationProvider, config, logService ); NeoStoreDataSource dataSource = dsRule.getDataSource( dir.databaseLayout(), fs.get(), pageCache, dependencies ); try { dataSource.start(); fail( "Exception expected" ); } catch ( Exception e ) { assertEquals( openStoresError, e ); } logProvider.assertAtLeastOnce( inLog( NeoStoreDataSource.class ).warn( equalTo( "Exception occurred while setting up store modules. Attempting to close things down." ), equalTo( openStoresError ) ) ); }
@Test public void databaseHealthShouldBeHealedOnStart() throws Throwable { NeoStoreDataSource theDataSource = null; try { DatabaseHealth databaseHealth = new DatabaseHealth( mock( DatabasePanicEventGenerator.class ), NullLogProvider.getInstance().getLog( DatabaseHealth.class ) ); Dependencies dependencies = new Dependencies(); dependencies.satisfyDependency( databaseHealth ); theDataSource = dsRule.getDataSource( dir.databaseLayout(), fs.get(), pageCacheRule.getPageCache( fs.get() ), dependencies ); databaseHealth.panic( new Throwable() ); theDataSource.start(); databaseHealth.assertHealthy( Throwable.class ); } finally { if ( theDataSource != null ) { theDataSource.stop(); theDataSource.shutdown(); } } }
private void initializeStores( DatabaseLayout databaseLayout, Map<String,String> additionalConfig ) throws IOException { Dependencies dependencies = new Dependencies(); dependencies.satisfyDependency( Config.defaults( additionalConfig ) ); ds = dsRule.getDataSource( databaseLayout, fs.get(), pageCache, dependencies ); ds.start(); NeoStores neoStores = ds.getDependencyResolver() .resolveDependency( RecordStorageEngine.class ).testAccessNeoStores(); pStore = neoStores.getPropertyStore(); rtStore = neoStores.getRelationshipTypeTokenStore(); relStore = neoStores.getRelationshipStore(); nodeStore = neoStores.getNodeStore(); storageReader = ds.getDependencyResolver().resolveDependency( StorageEngine.class ).newReader(); }