diff --git a/parity/main.rs b/parity/main.rs index 1566aed73..4cb61197a 100644 --- a/parity/main.rs +++ b/parity/main.rs @@ -180,7 +180,7 @@ fn execute_upgrades(conf: &Configuration, spec: &Spec, client_config: &ClientCon let db_path = get_db_path(Path::new(&conf.path()), client_config.pruning, spec.genesis_header().hash()); let result = migrate(&db_path, client_config.pruning); if let Err(err) = result { - die_with_message(&format!("{}", err)); + die_with_message(&format!("{} DB path: {}", err, db_path.to_string_lossy())); } } diff --git a/parity/migration.rs b/parity/migration.rs index ff0a6b0ee..40cc369e3 100644 --- a/parity/migration.rs +++ b/parity/migration.rs @@ -37,11 +37,15 @@ const VERSION_FILE_NAME: &'static str = "db_version"; pub enum Error { /// Returned when current version cannot be read or guessed. UnknownDatabaseVersion, - /// Returned when migration is not possible. + /// Migration does not support existing pruning algorithm. + UnsuportedPruningMethod, + /// Existing DB is newer than the known one. + FutureDBVersion, + /// Migration is not possible. MigrationImpossible, - /// Returned when migration unexpectadly failed. + /// Migration unexpectadly failed. MigrationFailed, - /// Returned when migration was completed succesfully, + /// Migration was completed succesfully, /// but there was a problem with io. Io(IoError), } @@ -50,9 +54,11 @@ impl Display for Error { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { let out = match *self { Error::UnknownDatabaseVersion => "Current database version cannot be read".into(), - Error::MigrationImpossible => format!("Migration to version {} is not possible", CURRENT_VERSION), - Error::MigrationFailed => "Migration unexpectedly failed".into(), - Error::Io(ref err) => format!("Unexpected io error: {}", err), + Error::UnsuportedPruningMethod => "Unsupported pruning method for database migration. Delete DB and resync.".into(), + Error::FutureDBVersion => "Database was created with newer client version. Upgrade your client or delete DB and resync.".into(), + Error::MigrationImpossible => format!("Database migration to version {} is not possible.", CURRENT_VERSION), + Error::MigrationFailed => "Database migration unexpectedly failed".into(), + Error::Io(ref err) => format!("Unexpected io error on DB migration: {}.", err), }; write!(f, "{}", out) @@ -159,7 +165,7 @@ fn state_database_migrations(pruning: Algorithm) -> Result manager.add_migration(migrations::state::ArchiveV7::default()), Algorithm::OverlayRecent => manager.add_migration(migrations::state::OverlayRecentV7::default()), - _ => die!("Unsupported pruning method for migration. Delete DB and resync"), + _ => return Err(Error::UnsuportedPruningMethod), }; try!(res.map_err(|_| Error::MigrationImpossible)); @@ -207,12 +213,14 @@ pub fn migrate(path: &Path, pruning: Algorithm) -> Result<(), Error> { // migrate the databases. // main db directory may already exists, so let's check if we have blocks dir - if version != CURRENT_VERSION && exists(&blocks_database_path(path)) { + if version < CURRENT_VERSION && exists(&blocks_database_path(path)) { println!("Migrating database from version {} to {}", version, CURRENT_VERSION); try!(migrate_database(version, blocks_database_path(path), try!(blocks_database_migrations()))); try!(migrate_database(version, extras_database_path(path), try!(extras_database_migrations()))); try!(migrate_database(version, state_database_path(path), try!(state_database_migrations(pruning)))); println!("Migration finished"); + } else if version > CURRENT_VERSION { + return Err(Error::FutureDBVersion); } // update version file.