private void migrateStore( DatabaseLayout dbDirectoryLayout, DatabaseLayout migrationLayout, File migrationStateFile ) { // One or more participants would like to do migration progressMonitor.started( participants.size() ); MigrationStatus migrationStatus = MigrationStatus.readMigrationStatus( fileSystem, migrationStateFile ); String versionToMigrateFrom = null; // We don't need to migrate if we're at the phase where we have migrated successfully // and it's just a matter of moving over the files to the storeDir. if ( MigrationStatus.migrating.isNeededFor( migrationStatus ) ) { versionToMigrateFrom = upgradableDatabase.checkUpgradable( dbDirectoryLayout ).storeVersion(); cleanMigrationDirectory( migrationLayout.databaseDirectory() ); MigrationStatus.migrating.setMigrationStatus( fileSystem, migrationStateFile, versionToMigrateFrom ); migrateToIsolatedDirectory( dbDirectoryLayout, migrationLayout, versionToMigrateFrom ); MigrationStatus.moving.setMigrationStatus( fileSystem, migrationStateFile, versionToMigrateFrom ); } if ( MigrationStatus.moving.isNeededFor( migrationStatus ) ) { versionToMigrateFrom = MigrationStatus.moving.maybeReadInfo( fileSystem, migrationStateFile, versionToMigrateFrom ); moveMigratedFilesToStoreDirectory( participants, migrationLayout, dbDirectoryLayout, versionToMigrateFrom, upgradableDatabase.currentVersion() ); } cleanup( participants, migrationLayout ); progressMonitor.completed(); }
private static Pair<String, String> readFromFile( FileSystemAbstraction fs, File file, MigrationStatus expectedSate ) { try ( BufferedReader reader = new BufferedReader( fs.openAsReader( file, StandardCharsets.UTF_8 ) ) ) { String state = reader.readLine().trim(); if ( expectedSate != null && !expectedSate.name().equals( state ) ) { throw new IllegalStateException( "Not in the expected state, expected=" + expectedSate.name() + ", actual=" + state ); } String info = reader.readLine().trim(); return Pair.of( state, info ); } catch ( FileNotFoundException e ) { return null; } catch ( IOException e ) { throw new RuntimeException( e ); } }
public static MigrationStatus readMigrationStatus( FileSystemAbstraction fs, File stateFile ) { Pair<String,String> data = readFromFile( fs, stateFile, null ); if ( data == null ) { return null; } return MigrationStatus.valueOf( data.first() ); }
public String maybeReadInfo( FileSystemAbstraction fs, File stateFile, String currentInfo ) { if ( currentInfo != null ) { return currentInfo; } Pair<String,String> data = readFromFile( fs, stateFile, this ); return data == null ? null : data.other(); }
public static MigrationStatus readMigrationStatus( FileSystemAbstraction fs, File stateFile ) { Pair<String,String> data = readFromFile( fs, stateFile, null ); if ( data == null ) { return null; } return MigrationStatus.valueOf( data.first() ); }
public String maybeReadInfo( FileSystemAbstraction fs, File stateFile, String currentInfo ) { if ( currentInfo != null ) { return currentInfo; } Pair<String,String> data = readFromFile( fs, stateFile, this ); return data == null ? null : data.other(); }
private void migrateStore( DatabaseLayout dbDirectoryLayout, DatabaseLayout migrationLayout, File migrationStateFile ) { // One or more participants would like to do migration progressMonitor.started( participants.size() ); MigrationStatus migrationStatus = MigrationStatus.readMigrationStatus( fileSystem, migrationStateFile ); String versionToMigrateFrom = null; // We don't need to migrate if we're at the phase where we have migrated successfully // and it's just a matter of moving over the files to the storeDir. if ( MigrationStatus.migrating.isNeededFor( migrationStatus ) ) { versionToMigrateFrom = upgradableDatabase.checkUpgradable( dbDirectoryLayout ).storeVersion(); cleanMigrationDirectory( migrationLayout.databaseDirectory() ); MigrationStatus.migrating.setMigrationStatus( fileSystem, migrationStateFile, versionToMigrateFrom ); migrateToIsolatedDirectory( dbDirectoryLayout, migrationLayout, versionToMigrateFrom ); MigrationStatus.moving.setMigrationStatus( fileSystem, migrationStateFile, versionToMigrateFrom ); } if ( MigrationStatus.moving.isNeededFor( migrationStatus ) ) { versionToMigrateFrom = MigrationStatus.moving.maybeReadInfo( fileSystem, migrationStateFile, versionToMigrateFrom ); moveMigratedFilesToStoreDirectory( participants, migrationLayout, dbDirectoryLayout, versionToMigrateFrom, upgradableDatabase.currentVersion() ); } cleanup( participants, migrationLayout ); progressMonitor.completed(); }
public void setMigrationStatus( FileSystemAbstraction fs, File stateFile, String info ) { if ( fs.fileExists( stateFile ) ) { try { fs.truncate( stateFile, 0 ); } catch ( IOException e ) { throw new RuntimeException( e ); } } try ( Writer writer = fs.openAsWriter( stateFile, StandardCharsets.UTF_8, false ) ) { writer.write( name() ); writer.write( '\n' ); writer.write( info ); writer.flush(); } catch ( IOException e ) { throw new RuntimeException( e ); } } }
private static Pair<String, String> readFromFile( FileSystemAbstraction fs, File file, MigrationStatus expectedSate ) { try ( BufferedReader reader = new BufferedReader( fs.openAsReader( file, StandardCharsets.UTF_8 ) ) ) { String state = reader.readLine().trim(); if ( expectedSate != null && !expectedSate.name().equals( state ) ) { throw new IllegalStateException( "Not in the expected state, expected=" + expectedSate.name() + ", actual=" + state ); } String info = reader.readLine().trim(); return Pair.of( state, info ); } catch ( FileNotFoundException e ) { return null; } catch ( IOException e ) { throw new RuntimeException( e ); } }
public void setMigrationStatus( FileSystemAbstraction fs, File stateFile, String info ) { if ( fs.fileExists( stateFile ) ) { try { fs.truncate( stateFile, 0 ); } catch ( IOException e ) { throw new RuntimeException( e ); } } try ( Writer writer = fs.openAsWriter( stateFile, StandardCharsets.UTF_8, false ) ) { writer.write( name() ); writer.write( '\n' ); writer.write( info ); writer.flush(); } catch ( IOException e ) { throw new RuntimeException( e ); } } }