// Copyright 2015-2017 Parity Technologies (UK) Ltd. // This file is part of Parity. // Parity is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Parity is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Parity. If not, see . use std::str::FromStr; use std::path::Path; use std::fmt::{Display, Formatter, Error as FmtError}; use mode::Mode as IpcMode; use verification::{VerifierType, QueueConfig}; use util::{journaldb, CompactionProfile}; pub use std::time::Duration; pub use blockchain::Config as BlockChainConfig; pub use trace::Config as TraceConfig; pub use evm::VMType; /// Client state db compaction profile #[derive(Debug, PartialEq, Clone)] pub enum DatabaseCompactionProfile { /// Try to determine compaction profile automatically Auto, /// SSD compaction profile SSD, /// HDD or other slow storage io compaction profile HDD, } impl Default for DatabaseCompactionProfile { fn default() -> Self { DatabaseCompactionProfile::Auto } } impl DatabaseCompactionProfile { /// Returns corresponding compaction profile. pub fn compaction_profile(&self, db_path: &Path) -> CompactionProfile { match *self { DatabaseCompactionProfile::Auto => CompactionProfile::auto(db_path), DatabaseCompactionProfile::SSD => CompactionProfile::ssd(), DatabaseCompactionProfile::HDD => CompactionProfile::hdd(), } } } impl FromStr for DatabaseCompactionProfile { type Err = String; fn from_str(s: &str) -> Result { match s { "auto" => Ok(DatabaseCompactionProfile::Auto), "ssd" => Ok(DatabaseCompactionProfile::SSD), "hdd" => Ok(DatabaseCompactionProfile::HDD), _ => Err("Invalid compaction profile given. Expected default/hdd/ssd.".into()), } } } /// Operating mode for the client. #[derive(Debug, Eq, PartialEq, Clone)] pub enum Mode { /// Always on. Active, /// Goes offline after RLP is inactive for some (given) time, but /// comes back online after a while of inactivity. Passive(Duration, Duration), /// Goes offline after RLP is inactive for some (given) time and /// stays inactive. Dark(Duration), /// Always off. Off, } impl Default for Mode { fn default() -> Self { Mode::Active } } impl Display for Mode { fn fmt(&self, f: &mut Formatter) -> Result<(), FmtError> { match *self { Mode::Active => write!(f, "active"), Mode::Passive(..) => write!(f, "passive"), Mode::Dark(..) => write!(f, "dark"), Mode::Off => write!(f, "offline"), } } } impl Into for Mode { fn into(self) -> IpcMode { match self { Mode::Off => IpcMode::Off, Mode::Dark(timeout) => IpcMode::Dark(timeout.as_secs()), Mode::Passive(timeout, alarm) => IpcMode::Passive(timeout.as_secs(), alarm.as_secs()), Mode::Active => IpcMode::Active, } } } impl From for Mode { fn from(mode: IpcMode) -> Self { match mode { IpcMode::Off => Mode::Off, IpcMode::Dark(timeout) => Mode::Dark(Duration::from_secs(timeout)), IpcMode::Passive(timeout, alarm) => Mode::Passive(Duration::from_secs(timeout), Duration::from_secs(alarm)), IpcMode::Active => Mode::Active, } } } /// Client configuration. Includes configs for all sub-systems. #[derive(Debug, PartialEq, Default)] pub struct ClientConfig { /// Block queue configuration. pub queue: QueueConfig, /// Blockchain configuration. pub blockchain: BlockChainConfig, /// Trace configuration. pub tracing: TraceConfig, /// VM type. pub vm_type: VMType, /// Fat DB enabled? pub fat_db: bool, /// The JournalDB ("pruning") algorithm to use. pub pruning: journaldb::Algorithm, /// The name of the client instance. pub name: String, /// RocksDB state column cache-size if not default pub db_cache_size: Option, /// State db compaction profile pub db_compaction: DatabaseCompactionProfile, /// Should db have WAL enabled? pub db_wal: bool, /// Operating mode pub mode: Mode, /// The chain spec name pub spec_name: String, /// Type of block verifier used by client. pub verifier_type: VerifierType, /// State db cache-size. pub state_cache_size: usize, /// EVM jump-tables cache size. pub jump_table_size: usize, /// Minimum state pruning history size. pub history: u64, /// Ideal memory usage for state pruning history. pub history_mem: usize, /// Check seal valididity on block import pub check_seal: bool, } #[cfg(test)] mod test { use super::{DatabaseCompactionProfile, Mode}; #[test] fn test_default_compaction_profile() { assert_eq!(DatabaseCompactionProfile::default(), DatabaseCompactionProfile::Auto); } #[test] fn test_parsing_compaction_profile() { assert_eq!(DatabaseCompactionProfile::Auto, "auto".parse().unwrap()); assert_eq!(DatabaseCompactionProfile::SSD, "ssd".parse().unwrap()); assert_eq!(DatabaseCompactionProfile::HDD, "hdd".parse().unwrap()); } #[test] fn test_mode_default() { assert_eq!(Mode::default(), Mode::Active); } }