different migrations based on pruning
This commit is contained in:
parent
e151fbb071
commit
a7103e2870
@ -2,4 +2,4 @@
|
||||
|
||||
mod v7;
|
||||
|
||||
pub use self::v7::ToV7;
|
||||
pub use self::v7::ArchiveV7;
|
@ -3,10 +3,10 @@ use util::migration::SimpleMigration;
|
||||
use util::sha3::Hashable;
|
||||
|
||||
/// This migration migrates the state db to use an accountdb which ensures uniqueness
|
||||
/// using an address' hash as opposed to the address itself.
|
||||
pub struct ToV7;
|
||||
/// using an address' hash as opposed to the address itself. Works only for ArchiveDB.
|
||||
pub struct ArchiveV7;
|
||||
|
||||
impl SimpleMigration for ToV7 {
|
||||
impl SimpleMigration for ArchiveV7 {
|
||||
fn version(&self) -> u32 {
|
||||
7
|
||||
}
|
||||
|
@ -280,7 +280,7 @@ impl Configuration {
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn find_best_db(&self, spec: &Spec) -> Option<journaldb::Algorithm> {
|
||||
fn find_best_db(&self, spec: &Spec) -> Option<journaldb::Algorithm> {
|
||||
let mut ret = None;
|
||||
let mut latest_era = None;
|
||||
let jdb_types = [journaldb::Algorithm::Archive, journaldb::Algorithm::EarlyMerge, journaldb::Algorithm::OverlayRecent, journaldb::Algorithm::RefCounted];
|
||||
@ -299,6 +299,17 @@ impl Configuration {
|
||||
ret
|
||||
}
|
||||
|
||||
pub fn pruning_algorithm(&self, spec: &Spec) -> journaldb::Algorithm {
|
||||
match self.args.flag_pruning.as_str() {
|
||||
"archive" => journaldb::Algorithm::Archive,
|
||||
"light" => journaldb::Algorithm::EarlyMerge,
|
||||
"fast" => journaldb::Algorithm::OverlayRecent,
|
||||
"basic" => journaldb::Algorithm::RefCounted,
|
||||
"auto" => self.find_best_db(spec).unwrap_or(journaldb::Algorithm::OverlayRecent),
|
||||
_ => { die!("Invalid pruning method given."); }
|
||||
}
|
||||
}
|
||||
|
||||
pub fn client_config(&self, spec: &Spec) -> ClientConfig {
|
||||
let mut client_config = ClientConfig::default();
|
||||
|
||||
@ -324,14 +335,7 @@ impl Configuration {
|
||||
// forced trace db cache size if provided
|
||||
client_config.tracing.db_cache_size = self.args.flag_db_cache_size.and_then(|cs| Some(cs / 4));
|
||||
|
||||
client_config.pruning = match self.args.flag_pruning.as_str() {
|
||||
"archive" => journaldb::Algorithm::Archive,
|
||||
"light" => journaldb::Algorithm::EarlyMerge,
|
||||
"fast" => journaldb::Algorithm::OverlayRecent,
|
||||
"basic" => journaldb::Algorithm::RefCounted,
|
||||
"auto" => self.find_best_db(spec).unwrap_or(journaldb::Algorithm::OverlayRecent),
|
||||
_ => { die!("Invalid pruning method given."); }
|
||||
};
|
||||
client_config.pruning = self.pruning_algorithm(spec);
|
||||
|
||||
if self.args.flag_fat_db {
|
||||
if let journaldb::Algorithm::Archive = client_config.pruning {
|
||||
|
@ -22,7 +22,7 @@ use std::process::exit;
|
||||
|
||||
#[macro_export]
|
||||
macro_rules! die {
|
||||
($($arg:tt)*) => (die_with_message(&format!("{}", format_args!($($arg)*))));
|
||||
($($arg:tt)*) => (::die::die_with_message(&format!("{}", format_args!($($arg)*))));
|
||||
}
|
||||
|
||||
pub fn die_with_error(module: &'static str, e: ethcore::error::Error) -> ! {
|
||||
|
@ -173,7 +173,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);
|
||||
let result = migrate(&db_path, client_config.pruning);
|
||||
if let Err(err) = result {
|
||||
die_with_message(&format!("{}", err));
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ use std::fs::File;
|
||||
use std::io::{Read, Write, Error as IoError, ErrorKind};
|
||||
use std::path::{Path, PathBuf};
|
||||
use std::fmt::{Display, Formatter, Error as FmtError};
|
||||
use util::journaldb::Algorithm;
|
||||
use util::migration::{Manager as MigrationManager, Config as MigrationConfig, Error as MigrationError};
|
||||
use ethcore::migrations;
|
||||
|
||||
@ -153,9 +154,12 @@ fn extras_database_migrations() -> Result<MigrationManager, Error> {
|
||||
}
|
||||
|
||||
/// Migrations on the state database.
|
||||
fn state_database_migrations() -> Result<MigrationManager, Error> {
|
||||
fn state_database_migrations(pruning: Algorithm) -> Result<MigrationManager, Error> {
|
||||
let mut manager = MigrationManager::new(default_migration_settings());
|
||||
try!(manager.add_migration(migrations::state::ToV7).map_err(|_| Error::MigrationImpossible));
|
||||
match pruning {
|
||||
Algorithm::Archive => try!(manager.add_migration(migrations::state::ArchiveV7).map_err(|_| Error::MigrationImpossible)),
|
||||
_ => die!("Unsupported pruning method for migration. Delete DB and resync"),
|
||||
}
|
||||
Ok(manager)
|
||||
}
|
||||
|
||||
@ -194,7 +198,7 @@ fn exists(path: &Path) -> bool {
|
||||
}
|
||||
|
||||
/// Migrates the database.
|
||||
pub fn migrate(path: &Path) -> Result<(), Error> {
|
||||
pub fn migrate(path: &Path, pruning: Algorithm) -> Result<(), Error> {
|
||||
// read version file.
|
||||
let version = try!(current_version(path));
|
||||
|
||||
@ -204,7 +208,7 @@ pub fn migrate(path: &Path) -> Result<(), Error> {
|
||||
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())));
|
||||
try!(migrate_database(version, state_database_path(path), try!(state_database_migrations(pruning))));
|
||||
println!("Migration finished");
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,6 @@ use std::collections::BTreeMap;
|
||||
use std::str::FromStr;
|
||||
use std::sync::Arc;
|
||||
|
||||
use die::*;
|
||||
use ethsync::EthSync;
|
||||
use ethcore::miner::{Miner, ExternalMiner};
|
||||
use ethcore::client::Client;
|
||||
|
Loading…
Reference in New Issue
Block a user