diff --git a/substrate/core/client/db/src/lib.rs b/substrate/core/client/db/src/lib.rs index afa28efeb3..b36d3ade4a 100644 --- a/substrate/core/client/db/src/lib.rs +++ b/substrate/core/client/db/src/lib.rs @@ -113,7 +113,7 @@ pub fn new_client( } mod columns { - pub const META: Option = Some(0); + pub const META: Option = ::utils::COLUMN_META; pub const STATE: Option = Some(1); pub const STATE_META: Option = Some(2); pub const HASH_LOOKUP: Option = Some(3); @@ -150,7 +150,7 @@ pub struct BlockchainDb { impl BlockchainDb { fn new(db: Arc) -> Result { - let meta = read_meta::(&*db, columns::META)?; + let meta = read_meta::(&*db, columns::META, columns::HEADER)?; let leaves = LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?; Ok(BlockchainDb { db, @@ -397,7 +397,7 @@ impl Backend { /// /// The pruning window is how old a block must be before the state is pruned. pub fn new(config: DatabaseSettings, canonicalization_delay: u64) -> Result { - let db = open_database(&config, "full")?; + let db = open_database(&config, columns::META, "full")?; Backend::from_kvdb(db as Arc<_>, config.pruning, canonicalization_delay) } diff --git a/substrate/core/client/db/src/light.rs b/substrate/core/client/db/src/light.rs index 8131ec135b..cf24499f6b 100644 --- a/substrate/core/client/db/src/light.rs +++ b/substrate/core/client/db/src/light.rs @@ -71,7 +71,7 @@ impl LightStorage { /// Create new storage with given settings. pub fn new(config: DatabaseSettings) -> ClientResult { - let db = open_database(&config, "light")?; + let db = open_database(&config, columns::META, "light")?; Self::from_kvdb(db as Arc<_>) } @@ -92,7 +92,7 @@ impl LightStorage columns::HEADER, columns::AUTHORITIES )?; - let meta = RwLock::new(read_meta::(&*db, columns::META)?); + let meta = RwLock::new(read_meta::(&*db, columns::META, columns::HEADER)?); let leaves = RwLock::new(LeafSet::read_from_db(&*db, columns::META, meta_keys::LEAF_PREFIX)?); Ok(LightStorage { diff --git a/substrate/core/client/db/src/utils.rs b/substrate/core/client/db/src/utils.rs index ac9f5e336c..9065b3e620 100644 --- a/substrate/core/client/db/src/utils.rs +++ b/substrate/core/client/db/src/utils.rs @@ -100,14 +100,14 @@ pub fn db_err(err: io::Error) -> client::error::Error { } /// Open RocksDB database. -pub fn open_database(config: &DatabaseSettings, db_type: &str) -> client::error::Result> { +pub fn open_database(config: &DatabaseSettings, col_meta: Option, db_type: &str) -> client::error::Result> { let mut db_config = DatabaseConfig::with_columns(Some(NUM_COLUMNS)); db_config.memory_budget = config.cache_size; let path = config.path.to_str().ok_or_else(|| client::error::ErrorKind::Backend("Invalid database path".into()))?; let db = Database::open(&db_config, &path).map_err(db_err)?; // check database type - match db.get(COLUMN_META, meta_keys::TYPE).map_err(db_err)? { + match db.get(col_meta, meta_keys::TYPE).map_err(db_err)? { Some(stored_type) => { if db_type.as_bytes() != &*stored_type { return Err(client::error::ErrorKind::Backend( @@ -116,7 +116,7 @@ pub fn open_database(config: &DatabaseSettings, db_type: &str) -> client::error: }, None => { let mut transaction = DBTransaction::new(); - transaction.put(COLUMN_META, meta_keys::TYPE, db_type.as_bytes()); + transaction.put(col_meta, meta_keys::TYPE, db_type.as_bytes()); db.write(transaction).map_err(db_err)?; }, } @@ -175,14 +175,14 @@ pub fn read_header( } /// Read meta from the database. -pub fn read_meta(db: &KeyValueDB, col_header: Option) -> Result< +pub fn read_meta(db: &KeyValueDB, col_meta: Option, col_header: Option) -> Result< Meta<<::Header as HeaderT>::Number, Block::Hash>, client::error::Error, > where Block: BlockT, { - let genesis_hash: Block::Hash = match db.get(COLUMN_META, meta_keys::GENESIS_HASH).map_err(db_err)? { + let genesis_hash: Block::Hash = match db.get(col_meta, meta_keys::GENESIS_HASH).map_err(db_err)? { Some(h) => match Decode::decode(&mut &h[..]) { Some(h) => h, None => return Err(client::error::ErrorKind::Backend("Error decoding genesis hash".into()).into()), @@ -197,7 +197,7 @@ pub fn read_meta(db: &KeyValueDB, col_header: Option) -> Result< }; let load_meta_block = |desc, key| -> Result<_, client::error::Error> { - if let Some(Some(header)) = db.get(COLUMN_META, key).and_then(|id| + if let Some(Some(header)) = db.get(col_meta, key).and_then(|id| match id { Some(id) => db.get(col_header, &id).map(|h| h.map(|b| Block::Header::decode(&mut &b[..]))), None => Ok(None),