From a53b47e11ad105f56fc54e77726ddf9cfa26da04 Mon Sep 17 00:00:00 2001 From: Arkadiy Paronyan Date: Thu, 28 Jun 2018 17:30:24 +0200 Subject: [PATCH] State pruning (#216) * Started work on state db * Updated for a new hash type * Pruning and tests * Generalize on the block hash/key type * Integrate with the client backend * Merge w master * CLI options * Updated for light client refactoring * Used IntoIterator * Fixed invalid input hadling --- polkadot/cli/src/cli.yml | 5 +++++ polkadot/cli/src/error.rs | 5 +++++ polkadot/cli/src/lib.rs | 7 +++++++ polkadot/service/src/config.rs | 4 ++++ polkadot/service/src/lib.rs | 3 ++- 5 files changed, 23 insertions(+), 1 deletion(-) diff --git a/polkadot/cli/src/cli.yml b/polkadot/cli/src/cli.yml index 49ccd36d5d..c63f59993b 100644 --- a/polkadot/cli/src/cli.yml +++ b/polkadot/cli/src/cli.yml @@ -75,6 +75,11 @@ args: value_name: CHAIN_SPEC help: Specify the chain specification (one of dev, local or poc-2) takes_value: true + - pruning: + long: pruning + value_name: PRUNING_MODE + help: Specify the pruning mode. (a number of blocks to keep or "archive"). Default is 256. + takes_value: true - name: long: name value_name: NAME diff --git a/polkadot/cli/src/error.rs b/polkadot/cli/src/error.rs index d7f6afca49..d7c690276c 100644 --- a/polkadot/cli/src/error.rs +++ b/polkadot/cli/src/error.rs @@ -28,5 +28,10 @@ error_chain! { Client(client::error::Error, client::error::ErrorKind) #[doc="Client error"]; } errors { + /// Input error. + Input(m: String) { + description("Invalid input"), + display("{}", m), + } } } diff --git a/polkadot/cli/src/lib.rs b/polkadot/cli/src/lib.rs index ac4f266b94..577535035c 100644 --- a/polkadot/cli/src/lib.rs +++ b/polkadot/cli/src/lib.rs @@ -83,6 +83,7 @@ use polkadot_primitives::Block; use futures::sync::mpsc; use futures::{Sink, Future, Stream}; use tokio_core::reactor; +use service::PruningMode; const DEFAULT_TELEMETRY_URL: &str = "ws://telemetry.polkadot.io:1024"; @@ -189,6 +190,12 @@ pub fn run(args: I) -> error::Result<()> where .into(); config.database_path = db_path(&base_path).to_string_lossy().into(); + config.pruning = match matches.value_of("pruning") { + Some("archive") => PruningMode::ArchiveAll, + None => PruningMode::keep_blocks(256), + Some(s) => PruningMode::keep_blocks(s.parse() + .map_err(|_| error::ErrorKind::Input("Invalid pruning mode specified".to_owned()))?), + }; let (mut genesis_storage, boot_nodes) = PresetConfig::from_spec(chain_spec) .map(PresetConfig::deconstruct) diff --git a/polkadot/service/src/config.rs b/polkadot/service/src/config.rs index c6dff5a584..0631f1819c 100644 --- a/polkadot/service/src/config.rs +++ b/polkadot/service/src/config.rs @@ -20,6 +20,7 @@ use transaction_pool; use runtime_primitives::MakeStorage; pub use network::Role; pub use network::NetworkConfiguration; +pub use client_db::PruningMode; /// Service configuration. pub struct Configuration { @@ -33,6 +34,8 @@ pub struct Configuration { pub keystore_path: String, /// Path to the database. pub database_path: String, + /// Pruning settings. + pub pruning: PruningMode, /// Additional key seeds. pub keys: Vec, /// The name of the chain. @@ -58,6 +61,7 @@ impl Default for Configuration { genesis_storage: Box::new(Default::default), telemetry: Default::default(), name: "Anonymous".into(), + pruning: PruningMode::ArchiveAll, } } } diff --git a/polkadot/service/src/lib.rs b/polkadot/service/src/lib.rs index 230a9ae587..90dd96a329 100644 --- a/polkadot/service/src/lib.rs +++ b/polkadot/service/src/lib.rs @@ -68,7 +68,7 @@ use exit_future::Signal; pub use self::error::{ErrorKind, Error}; pub use self::components::{Components, FullComponents, LightComponents}; -pub use config::{Configuration, Role}; +pub use config::{Configuration, Role, PruningMode}; /// Polkadot service. pub struct Service { @@ -118,6 +118,7 @@ impl Service let db_settings = client_db::DatabaseSettings { cache_size: None, path: config.database_path.into(), + pruning: config.pruning, }; let (client, on_demand) = components.build_client(db_settings, executor, config.genesis_storage)?;