Search in sources :

Example 1 with DatabaseMigrater

use of tech.pegasys.teku.cli.util.DatabaseMigrater in project teku by ConsenSys.

the class MigrateDatabaseCommand method run.

// OVERVIEW
// teku folder has a 'beacon' folder
// If the user wants to change the type of database stored in 'beacon',
// they can run this command to accomplish that task.
// While running, a 'beacon.new' folder is created, and we copy data
// from 'beacon' to 'beacon.new'.
// 
// If it completes successfully, we move:
// - 'beacon' -> 'beacon.old'
// - 'beacon.new' -> 'beacon'
// User is then advised to cleanup 'beacon.old' manually
// 
// If the process fails to complete, may be left with 'beacon.new',
// and 'beacon' will have the previous working database in it, so the user
// could start teku again on the old working database.
@Override
public void run() {
    // validate output format
    final Optional<DatabaseVersion> maybeOutputVersion = DatabaseVersion.fromString(toDbVersion);
    if (maybeOutputVersion.isEmpty()) {
        SUB_COMMAND_LOG.exit(2, "Invalid database version specified: " + toDbVersion);
    }
    // and advice given to the user to cleanup 'beacon.old' manually.
    if (Files.isDirectory(dataPath.resolve("beacon.old"))) {
        SUB_COMMAND_LOG.exit(1, "There is an existing folder in " + dataPath.resolve("beacon.old").toFile() + ", review this folder and remove before continuing.");
    }
    dataDirLayout = DataDirLayout.createFrom(DataConfig.builder().dataBasePath(dataPath).beaconDataPath(dataBeaconPath).build());
    // validate source database exists
    final DatabaseVersion sourceDatabaseVersion = confirmAndCheckOriginalDb(maybeOutputVersion.get());
    final DatabaseMigrater dbMigrater = DatabaseMigrater.builder().dataDirLayout(dataDirLayout).network(network).storageMode(dataStorageMode).batchSize(batchSize).statusUpdater(SUB_COMMAND_LOG::display).build();
    try {
        dbMigrater.migrateDatabase(sourceDatabaseVersion, maybeOutputVersion.get());
        SUB_COMMAND_LOG.display("SUCCESS.");
        SUB_COMMAND_LOG.display("The original database is stored in: " + dbMigrater.getMovedOldBeaconFolderPath());
        SUB_COMMAND_LOG.display("This can be removed once you have confirmed the new database works.");
    } catch (DatabaseMigraterError error) {
        SUB_COMMAND_LOG.error("FAILED to migrate database: " + error.getMessage());
        SUB_COMMAND_LOG.display("There is a partially created database at: " + dbMigrater.getNewBeaconFolderPath());
        SUB_COMMAND_LOG.display("This is not in use and could be cleaned up.");
        System.exit(1);
    }
}
Also used : DatabaseMigraterError(tech.pegasys.teku.cli.util.DatabaseMigraterError) DatabaseVersion(tech.pegasys.teku.storage.server.DatabaseVersion) DatabaseMigrater(tech.pegasys.teku.cli.util.DatabaseMigrater)

Aggregations

DatabaseMigrater (tech.pegasys.teku.cli.util.DatabaseMigrater)1 DatabaseMigraterError (tech.pegasys.teku.cli.util.DatabaseMigraterError)1 DatabaseVersion (tech.pegasys.teku.storage.server.DatabaseVersion)1