public static void assertRecoveryIsNotRequired( FileSystemAbstraction fs, PageCache pageCache, Config config, DatabaseLayout databaseLayout, Monitors monitors ) throws RecoveryRequiredException, IOException { if ( new RecoveryRequiredChecker( fs, pageCache, config, monitors ).isRecoveryRequiredAt( databaseLayout ) ) { throw new RecoveryRequiredException(); } } }
private RecoveryRequiredChecker getRecoveryChecker( FileSystemAbstraction fileSystem, PageCache pageCache, Config config ) { return new RecoveryRequiredChecker( fileSystem, pageCache, config, monitors ); }
private void assertRecovered( DatabaseLayout databaseLayout, Config config, FileSystemAbstraction fileSystem, PageCache pageCache ) throws ConsistencyCheckIncompleteException { try { assertRecoveryIsNotRequired( fileSystem, pageCache, config, databaseLayout, new Monitors() ); } catch ( RecoveryRequiredException | IOException e ) { throw new ConsistencyCheckIncompleteException( e ); } }
private void checkDbState( DatabaseLayout databaseLayout, Config tuningConfiguration ) throws ToolFailureException { try ( JobScheduler jobScheduler = createInitialisedScheduler(); PageCache pageCache = ConfigurableStandalonePageCacheFactory.createPageCache( fs, tuningConfiguration, jobScheduler ) ) { assertRecoveryIsNotRequired( fs, pageCache, tuningConfiguration, databaseLayout, new Monitors() ); } catch ( RecoveryRequiredException rre ) { throw new ToolFailureException( rre.getMessage() ); } catch ( Exception e ) { systemError.printf( "Failure when checking for recovery state: '%s', continuing as normal.%n", e ); } }
private boolean isUnclean( FileSystemAbstraction fileSystem ) throws IOException { PageCache pageCache = pageCacheRule.getPageCache( fileSystem ); RecoveryRequiredChecker requiredChecker = new RecoveryRequiredChecker( fileSystem, pageCache, Config.defaults(), monitors ); return requiredChecker.isRecoveryRequiredAt( testDirectory.databaseLayout() ); } }
@Test public void shouldWantToRecoverBrokenStore() throws Exception { try ( FileSystemAbstraction fileSystemAbstraction = createAndCrashWithDefaultConfig() ) { PageCache pageCache = pageCacheRule.getPageCache( fileSystemAbstraction ); RecoveryRequiredChecker recoverer = getRecoveryCheckerWithDefaultConfig( fileSystemAbstraction, pageCache ); assertThat( recoverer.isRecoveryRequiredAt( databaseLayout ), is( true ) ); } }
private void recoverBrokenStoreWithConfig( Config config ) throws IOException { try ( FileSystemAbstraction fileSystemAbstraction = createSomeDataAndCrash( storeDir, fileSystem, config ) ) { PageCache pageCache = pageCacheRule.getPageCache( fileSystemAbstraction ); RecoveryRequiredChecker recoverer = getRecoveryChecker( fileSystemAbstraction, pageCache, config ); assertThat( recoverer.isRecoveryRequiredAt( databaseLayout ), is( true ) ); new TestGraphDatabaseFactory() .setFileSystem( fileSystemAbstraction ) .newEmbeddedDatabaseBuilder( storeDir ) .setConfig( config.getRaw() ) .newGraphDatabase() .shutdown(); assertThat( recoverer.isRecoveryRequiredAt( databaseLayout ), is( false ) ); } }
@Test public void shouldNotWantToRecoverIntactStore() throws Exception { PageCache pageCache = pageCacheRule.getPageCache( fileSystem ); RecoveryRequiredChecker recoverer = getRecoveryCheckerWithDefaultConfig( fileSystem, pageCache ); assertThat( recoverer.isRecoveryRequiredAt( databaseLayout ), is( false ) ); }
@Test( expected = RecoveryRequiredException.class ) public void shouldThrowIfBrokenStore() throws IOException, RecoveryRequiredException { try ( FileSystemAbstraction fileSystemAbstraction = createAndCrashWithDefaultConfig() ) { PageCache pageCache = pageCacheRule.getPageCache( fileSystemAbstraction ); RecoveryRequiredChecker.assertRecoveryIsNotRequired( fileSystemAbstraction, pageCache, Config.defaults(), databaseLayout, new Monitors() ); fail(); } }
@Test public void shouldHandleWritesProperlyAfterRecovery() throws Exception { // Given EphemeralFileSystemAbstraction fs = fsRule.get(); GraphDatabaseService db = newDB( fs ); long node1 = createNode( db ); // And given the power goes out try ( EphemeralFileSystemAbstraction crashedFs = fs.snapshot() ) { db.shutdown(); db = newDB( crashedFs ); long node2 = createNode( db ); db.shutdown(); // Then the logical log should be in sync File logFile = testDirectory.databaseLayout().file( TransactionLogFiles.DEFAULT_NAME + ".0" ); assertThat( logEntries( crashedFs, logFile ), containsExactly( // Tx before recovery startEntry( -1, -1 ), commandEntry( node1, NodeCommand.class ), commandEntry( StatementConstants.ANY_LABEL, NodeCountsCommand.class ), commitEntry( 2 ), // Tx after recovery startEntry( -1, -1 ), commandEntry( node2, NodeCommand.class ), commandEntry( StatementConstants.ANY_LABEL, NodeCountsCommand.class ), commitEntry( 3 ), // checkpoint checkPoint( new LogPosition( 0, 250 ) ) ) ); } }
@Test public void shouldBeAbleToRecoverBrokenStoreWithLogsInSeparateRelativeLocation() throws Exception { File customTransactionLogsLocation = new File( storeDir, "tx-logs" ); Config config = Config.defaults( logical_logs_location, customTransactionLogsLocation.getName() ); recoverBrokenStoreWithConfig( config ); }
private FileSystemAbstraction createAndCrashWithDefaultConfig() { return createSomeDataAndCrash( storeDir, fileSystem, Config.defaults() ); }
private RecoveryRequiredChecker getRecoveryCheckerWithDefaultConfig( FileSystemAbstraction fileSystem, PageCache pageCache ) { return getRecoveryChecker( fileSystem, pageCache, Config.defaults() ); }
public static void assertRecoveryIsNotRequired( FileSystemAbstraction fs, PageCache pageCache, Config config, DatabaseLayout databaseLayout, Monitors monitors ) throws RecoveryRequiredException, IOException { if ( new RecoveryRequiredChecker( fs, pageCache, config, monitors ).isRecoveryRequiredAt( databaseLayout ) ) { throw new RecoveryRequiredException(); } } }
private static void checkDbState( DatabaseLayout databaseLayout, Config additionalConfiguration ) throws CommandFailed { try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); JobScheduler jobScheduler = createInitialisedScheduler(); PageCache pageCache = ConfigurableStandalonePageCacheFactory.createPageCache( fileSystem, additionalConfiguration, jobScheduler ) ) { RecoveryRequiredChecker.assertRecoveryIsNotRequired( fileSystem, pageCache, additionalConfiguration, databaseLayout, new Monitors() ); } catch ( RecoveryRequiredException rre ) { throw new CommandFailed( rre.getMessage() ); } catch ( Exception e ) { throw new CommandFailed( "Failure when checking for recovery state: '%s'." + e.getMessage(), e ); } }
@Test public void shouldBeAbleToRecoverBrokenStore() throws Exception { try ( FileSystemAbstraction fileSystemAbstraction = createAndCrashWithDefaultConfig() ) { PageCache pageCache = pageCacheRule.getPageCache( fileSystemAbstraction ); RecoveryRequiredChecker recoverer = getRecoveryCheckerWithDefaultConfig( fileSystemAbstraction, pageCache ); assertThat( recoverer.isRecoveryRequiredAt( databaseLayout ), is( true ) ); new TestGraphDatabaseFactory().setFileSystem( fileSystemAbstraction ).newImpermanentDatabase( storeDir ).shutdown(); assertThat( recoverer.isRecoveryRequiredAt( databaseLayout ), is( false ) ); } }
CoreBootstrapper( File storeDir, PageCache pageCache, FileSystemAbstraction fs, Config config, LogProvider logProvider, Monitors monitors ) { this.storeDir = storeDir; this.pageCache = pageCache; this.fs = fs; this.config = config; this.logProvider = logProvider; this.log = logProvider.getLog( getClass() ); this.recoveryRequiredChecker = new RecoveryRequiredChecker( fs, pageCache, config, monitors ); }
@Test public void shouldNotThrowIfIntactStore() throws RecoveryRequiredException, IOException { PageCache pageCache = pageCacheRule.getPageCache( fileSystem ); RecoveryRequiredChecker.assertRecoveryIsNotRequired( fileSystem, pageCache, Config.defaults(), databaseLayout, new Monitors() ); }
@Test public void shouldBeAbleToRecoverBrokenStoreWithLogsInSeparateAbsoluteLocation() throws Exception { File customTransactionLogsLocation = testDirectory.directory( "tx-logs" ); Config config = Config.defaults( logical_logs_location, customTransactionLogsLocation.getAbsolutePath() ); recoverBrokenStoreWithConfig( config ); }
private static void checkDbState( DatabaseLayout databaseLayout, Config additionalConfiguration ) throws CommandFailed { try ( FileSystemAbstraction fileSystem = new DefaultFileSystemAbstraction(); JobScheduler jobScheduler = createInitialisedScheduler(); PageCache pageCache = ConfigurableStandalonePageCacheFactory .createPageCache( fileSystem, additionalConfiguration, jobScheduler ) ) { assertRecoveryIsNotRequired( fileSystem, pageCache, additionalConfiguration, databaseLayout, new Monitors() ); } catch ( RecoveryRequiredException rre ) { throw new CommandFailed( rre.getMessage() ); } catch ( Exception e ) { throw new CommandFailed( "Failure when checking for recovery state: '%s'." + e.getMessage(), e ); } }