move column family constants into db module (#1955)
This commit is contained in:
parent
8159d743ef
commit
9adf77581c
@ -29,8 +29,7 @@ use blockchain::best_block::BestBlock;
|
|||||||
use types::tree_route::TreeRoute;
|
use types::tree_route::TreeRoute;
|
||||||
use blockchain::update::ExtrasUpdate;
|
use blockchain::update::ExtrasUpdate;
|
||||||
use blockchain::{CacheSize, ImportRoute, Config};
|
use blockchain::{CacheSize, ImportRoute, Config};
|
||||||
use db::{Writable, Readable, CacheUpdatePolicy};
|
use db::{self, Writable, Readable, CacheUpdatePolicy};
|
||||||
use client::{DB_COL_EXTRA, DB_COL_HEADERS, DB_COL_BODIES};
|
|
||||||
use cache_manager::CacheManager;
|
use cache_manager::CacheManager;
|
||||||
|
|
||||||
const LOG_BLOOMS_LEVELS: usize = 3;
|
const LOG_BLOOMS_LEVELS: usize = 3;
|
||||||
@ -133,7 +132,7 @@ enum CacheID {
|
|||||||
impl bc::group::BloomGroupDatabase for BlockChain {
|
impl bc::group::BloomGroupDatabase for BlockChain {
|
||||||
fn blooms_at(&self, position: &bc::group::GroupPosition) -> Option<bc::group::BloomGroup> {
|
fn blooms_at(&self, position: &bc::group::GroupPosition) -> Option<bc::group::BloomGroup> {
|
||||||
let position = LogGroupPosition::from(position.clone());
|
let position = LogGroupPosition::from(position.clone());
|
||||||
let result = self.db.read_with_cache(DB_COL_EXTRA, &self.blocks_blooms, &position).map(Into::into);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.blocks_blooms, &position).map(Into::into);
|
||||||
self.cache_man.lock().note_used(CacheID::BlocksBlooms(position));
|
self.cache_man.lock().note_used(CacheID::BlocksBlooms(position));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@ -172,7 +171,7 @@ impl BlockProvider for BlockChain {
|
|||||||
/// Returns true if the given block is known
|
/// Returns true if the given block is known
|
||||||
/// (though not necessarily a part of the canon chain).
|
/// (though not necessarily a part of the canon chain).
|
||||||
fn is_known(&self, hash: &H256) -> bool {
|
fn is_known(&self, hash: &H256) -> bool {
|
||||||
self.db.exists_with_cache(DB_COL_EXTRA, &self.block_details, hash)
|
self.db.exists_with_cache(db::COL_EXTRA, &self.block_details, hash)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get raw block data
|
/// Get raw block data
|
||||||
@ -209,7 +208,7 @@ impl BlockProvider for BlockChain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read from DB and populate cache
|
// Read from DB and populate cache
|
||||||
let opt = self.db.get(DB_COL_HEADERS, hash)
|
let opt = self.db.get(db::COL_HEADERS, hash)
|
||||||
.expect("Low level database error. Some issue with disk?");
|
.expect("Low level database error. Some issue with disk?");
|
||||||
|
|
||||||
let result = match opt {
|
let result = match opt {
|
||||||
@ -245,7 +244,7 @@ impl BlockProvider for BlockChain {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Read from DB and populate cache
|
// Read from DB and populate cache
|
||||||
let opt = self.db.get(DB_COL_BODIES, hash)
|
let opt = self.db.get(db::COL_BODIES, hash)
|
||||||
.expect("Low level database error. Some issue with disk?");
|
.expect("Low level database error. Some issue with disk?");
|
||||||
|
|
||||||
let result = match opt {
|
let result = match opt {
|
||||||
@ -265,28 +264,28 @@ impl BlockProvider for BlockChain {
|
|||||||
|
|
||||||
/// Get the familial details concerning a block.
|
/// Get the familial details concerning a block.
|
||||||
fn block_details(&self, hash: &H256) -> Option<BlockDetails> {
|
fn block_details(&self, hash: &H256) -> Option<BlockDetails> {
|
||||||
let result = self.db.read_with_cache(DB_COL_EXTRA, &self.block_details, hash);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_details, hash);
|
||||||
self.cache_man.lock().note_used(CacheID::BlockDetails(hash.clone()));
|
self.cache_man.lock().note_used(CacheID::BlockDetails(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the hash of given block's number.
|
/// Get the hash of given block's number.
|
||||||
fn block_hash(&self, index: BlockNumber) -> Option<H256> {
|
fn block_hash(&self, index: BlockNumber) -> Option<H256> {
|
||||||
let result = self.db.read_with_cache(DB_COL_EXTRA, &self.block_hashes, &index);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_hashes, &index);
|
||||||
self.cache_man.lock().note_used(CacheID::BlockHashes(index));
|
self.cache_man.lock().note_used(CacheID::BlockHashes(index));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the address of transaction with given hash.
|
/// Get the address of transaction with given hash.
|
||||||
fn transaction_address(&self, hash: &H256) -> Option<TransactionAddress> {
|
fn transaction_address(&self, hash: &H256) -> Option<TransactionAddress> {
|
||||||
let result = self.db.read_with_cache(DB_COL_EXTRA, &self.transaction_addresses, hash);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.transaction_addresses, hash);
|
||||||
self.cache_man.lock().note_used(CacheID::TransactionAddresses(hash.clone()));
|
self.cache_man.lock().note_used(CacheID::TransactionAddresses(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get receipts of block with given hash.
|
/// Get receipts of block with given hash.
|
||||||
fn block_receipts(&self, hash: &H256) -> Option<BlockReceipts> {
|
fn block_receipts(&self, hash: &H256) -> Option<BlockReceipts> {
|
||||||
let result = self.db.read_with_cache(DB_COL_EXTRA, &self.block_receipts, hash);
|
let result = self.db.read_with_cache(db::COL_EXTRA, &self.block_receipts, hash);
|
||||||
self.cache_man.lock().note_used(CacheID::BlockReceipts(hash.clone()));
|
self.cache_man.lock().note_used(CacheID::BlockReceipts(hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@ -347,7 +346,7 @@ impl BlockChain {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// load best block
|
// load best block
|
||||||
let best_block_hash = match bc.db.get(DB_COL_EXTRA, b"best").unwrap() {
|
let best_block_hash = match bc.db.get(db::COL_EXTRA, b"best").unwrap() {
|
||||||
Some(best) => {
|
Some(best) => {
|
||||||
H256::from_slice(&best)
|
H256::from_slice(&best)
|
||||||
}
|
}
|
||||||
@ -366,12 +365,12 @@ impl BlockChain {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let batch = DBTransaction::new(&db);
|
let batch = DBTransaction::new(&db);
|
||||||
batch.put(DB_COL_HEADERS, &hash, block.header_rlp().as_raw());
|
batch.put(db::COL_HEADERS, &hash, block.header_rlp().as_raw());
|
||||||
batch.put(DB_COL_BODIES, &hash, &Self::block_to_body(genesis));
|
batch.put(db::COL_BODIES, &hash, &Self::block_to_body(genesis));
|
||||||
|
|
||||||
batch.write(DB_COL_EXTRA, &hash, &details);
|
batch.write(db::COL_EXTRA, &hash, &details);
|
||||||
batch.write(DB_COL_EXTRA, &header.number(), &hash);
|
batch.write(db::COL_EXTRA, &header.number(), &hash);
|
||||||
batch.put(DB_COL_EXTRA, b"best", &hash);
|
batch.put(db::COL_EXTRA, b"best", &hash);
|
||||||
bc.db.write(batch).expect("Low level database error. Some issue with disk?");
|
bc.db.write(batch).expect("Low level database error. Some issue with disk?");
|
||||||
hash
|
hash
|
||||||
}
|
}
|
||||||
@ -399,7 +398,7 @@ impl BlockChain {
|
|||||||
/// Returns true if the given parent block has given child
|
/// Returns true if the given parent block has given child
|
||||||
/// (though not necessarily a part of the canon chain).
|
/// (though not necessarily a part of the canon chain).
|
||||||
fn is_known_child(&self, parent: &H256, hash: &H256) -> bool {
|
fn is_known_child(&self, parent: &H256, hash: &H256) -> bool {
|
||||||
self.db.read_with_cache(DB_COL_EXTRA, &self.block_details, parent).map_or(false, |d| d.children.contains(hash))
|
self.db.read_with_cache(db::COL_EXTRA, &self.block_details, parent).map_or(false, |d| d.children.contains(hash))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Rewind to a previous block
|
/// Rewind to a previous block
|
||||||
@ -408,22 +407,22 @@ impl BlockChain {
|
|||||||
use db::Key;
|
use db::Key;
|
||||||
let batch = self.db.transaction();
|
let batch = self.db.transaction();
|
||||||
// track back to the best block we have in the blocks database
|
// track back to the best block we have in the blocks database
|
||||||
if let Some(best_block_hash) = self.db.get(DB_COL_EXTRA, b"best").unwrap() {
|
if let Some(best_block_hash) = self.db.get(db::COL_EXTRA, b"best").unwrap() {
|
||||||
let best_block_hash = H256::from_slice(&best_block_hash);
|
let best_block_hash = H256::from_slice(&best_block_hash);
|
||||||
if best_block_hash == self.genesis_hash() {
|
if best_block_hash == self.genesis_hash() {
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
if let Some(extras) = self.db.read(DB_COL_EXTRA, &best_block_hash) as Option<BlockDetails> {
|
if let Some(extras) = self.db.read(db::COL_EXTRA, &best_block_hash) as Option<BlockDetails> {
|
||||||
type DetailsKey = Key<BlockDetails, Target=H264>;
|
type DetailsKey = Key<BlockDetails, Target=H264>;
|
||||||
batch.delete(DB_COL_EXTRA, &(DetailsKey::key(&best_block_hash)));
|
batch.delete(db::COL_EXTRA, &(DetailsKey::key(&best_block_hash)));
|
||||||
let hash = extras.parent;
|
let hash = extras.parent;
|
||||||
let range = extras.number as bc::Number .. extras.number as bc::Number;
|
let range = extras.number as bc::Number .. extras.number as bc::Number;
|
||||||
let chain = bc::group::BloomGroupChain::new(self.blooms_config, self);
|
let chain = bc::group::BloomGroupChain::new(self.blooms_config, self);
|
||||||
let changes = chain.replace(&range, vec![]);
|
let changes = chain.replace(&range, vec![]);
|
||||||
for (k, v) in changes.into_iter() {
|
for (k, v) in changes.into_iter() {
|
||||||
batch.write(DB_COL_EXTRA, &LogGroupPosition::from(k), &BloomGroup::from(v));
|
batch.write(db::COL_EXTRA, &LogGroupPosition::from(k), &BloomGroup::from(v));
|
||||||
}
|
}
|
||||||
batch.put(DB_COL_EXTRA, b"best", &hash);
|
batch.put(db::COL_EXTRA, b"best", &hash);
|
||||||
|
|
||||||
let best_block_total_difficulty = self.block_details(&hash).unwrap().total_difficulty;
|
let best_block_total_difficulty = self.block_details(&hash).unwrap().total_difficulty;
|
||||||
let best_block_rlp = self.block(&hash).unwrap();
|
let best_block_rlp = self.block(&hash).unwrap();
|
||||||
@ -436,9 +435,9 @@ impl BlockChain {
|
|||||||
block: best_block_rlp,
|
block: best_block_rlp,
|
||||||
};
|
};
|
||||||
// update parent extras
|
// update parent extras
|
||||||
if let Some(mut details) = self.db.read(DB_COL_EXTRA, &hash) as Option<BlockDetails> {
|
if let Some(mut details) = self.db.read(db::COL_EXTRA, &hash) as Option<BlockDetails> {
|
||||||
details.children.clear();
|
details.children.clear();
|
||||||
batch.write(DB_COL_EXTRA, &hash, &details);
|
batch.write(db::COL_EXTRA, &hash, &details);
|
||||||
}
|
}
|
||||||
self.db.write(batch).expect("Writing to db failed");
|
self.db.write(batch).expect("Writing to db failed");
|
||||||
self.block_details.write().clear();
|
self.block_details.write().clear();
|
||||||
@ -566,8 +565,8 @@ impl BlockChain {
|
|||||||
let compressed_body = UntrustedRlp::new(&Self::block_to_body(bytes)).compress(RlpType::Blocks);
|
let compressed_body = UntrustedRlp::new(&Self::block_to_body(bytes)).compress(RlpType::Blocks);
|
||||||
|
|
||||||
// store block in db
|
// store block in db
|
||||||
batch.put(DB_COL_HEADERS, &hash, &compressed_header);
|
batch.put(db::COL_HEADERS, &hash, &compressed_header);
|
||||||
batch.put(DB_COL_BODIES, &hash, &compressed_body);
|
batch.put(db::COL_BODIES, &hash, &compressed_body);
|
||||||
|
|
||||||
let maybe_parent = self.block_details(&header.parent_hash());
|
let maybe_parent = self.block_details(&header.parent_hash());
|
||||||
|
|
||||||
@ -645,7 +644,7 @@ impl BlockChain {
|
|||||||
|
|
||||||
|
|
||||||
let mut write_details = self.block_details.write();
|
let mut write_details = self.block_details.write();
|
||||||
batch.extend_with_cache(DB_COL_EXTRA, &mut *write_details, update, CacheUpdatePolicy::Overwrite);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_details, update, CacheUpdatePolicy::Overwrite);
|
||||||
|
|
||||||
self.cache_man.lock().note_used(CacheID::BlockDetails(block_hash));
|
self.cache_man.lock().note_used(CacheID::BlockDetails(block_hash));
|
||||||
|
|
||||||
@ -669,8 +668,8 @@ impl BlockChain {
|
|||||||
assert!(self.pending_best_block.read().is_none());
|
assert!(self.pending_best_block.read().is_none());
|
||||||
|
|
||||||
// store block in db
|
// store block in db
|
||||||
batch.put_compressed(DB_COL_HEADERS, &hash, block.header_rlp().as_raw().to_vec());
|
batch.put_compressed(db::COL_HEADERS, &hash, block.header_rlp().as_raw().to_vec());
|
||||||
batch.put_compressed(DB_COL_BODIES, &hash, Self::block_to_body(bytes));
|
batch.put_compressed(db::COL_BODIES, &hash, Self::block_to_body(bytes));
|
||||||
|
|
||||||
let info = self.block_info(&header);
|
let info = self.block_info(&header);
|
||||||
|
|
||||||
@ -742,7 +741,7 @@ impl BlockChain {
|
|||||||
let block_hashes: Vec<_> = update.block_details.keys().cloned().collect();
|
let block_hashes: Vec<_> = update.block_details.keys().cloned().collect();
|
||||||
|
|
||||||
let mut write_details = self.block_details.write();
|
let mut write_details = self.block_details.write();
|
||||||
batch.extend_with_cache(DB_COL_EXTRA, &mut *write_details, update.block_details, CacheUpdatePolicy::Overwrite);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_details, update.block_details, CacheUpdatePolicy::Overwrite);
|
||||||
|
|
||||||
let mut cache_man = self.cache_man.lock();
|
let mut cache_man = self.cache_man.lock();
|
||||||
for hash in block_hashes {
|
for hash in block_hashes {
|
||||||
@ -752,12 +751,12 @@ impl BlockChain {
|
|||||||
|
|
||||||
{
|
{
|
||||||
let mut write_receipts = self.block_receipts.write();
|
let mut write_receipts = self.block_receipts.write();
|
||||||
batch.extend_with_cache(DB_COL_EXTRA, &mut *write_receipts, update.block_receipts, CacheUpdatePolicy::Remove);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_receipts, update.block_receipts, CacheUpdatePolicy::Remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
let mut write_blocks_blooms = self.blocks_blooms.write();
|
let mut write_blocks_blooms = self.blocks_blooms.write();
|
||||||
batch.extend_with_cache(DB_COL_EXTRA, &mut *write_blocks_blooms, update.blocks_blooms, CacheUpdatePolicy::Remove);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_blocks_blooms, update.blocks_blooms, CacheUpdatePolicy::Remove);
|
||||||
}
|
}
|
||||||
|
|
||||||
// These cached values must be updated last with all three locks taken to avoid
|
// These cached values must be updated last with all three locks taken to avoid
|
||||||
@ -768,7 +767,7 @@ impl BlockChain {
|
|||||||
match update.info.location {
|
match update.info.location {
|
||||||
BlockLocation::Branch => (),
|
BlockLocation::Branch => (),
|
||||||
_ => if is_best {
|
_ => if is_best {
|
||||||
batch.put(DB_COL_EXTRA, b"best", &update.info.hash);
|
batch.put(db::COL_EXTRA, b"best", &update.info.hash);
|
||||||
*best_block = Some(BestBlock {
|
*best_block = Some(BestBlock {
|
||||||
hash: update.info.hash,
|
hash: update.info.hash,
|
||||||
number: update.info.number,
|
number: update.info.number,
|
||||||
@ -780,8 +779,8 @@ impl BlockChain {
|
|||||||
let mut write_hashes = self.pending_block_hashes.write();
|
let mut write_hashes = self.pending_block_hashes.write();
|
||||||
let mut write_txs = self.pending_transaction_addresses.write();
|
let mut write_txs = self.pending_transaction_addresses.write();
|
||||||
|
|
||||||
batch.extend_with_cache(DB_COL_EXTRA, &mut *write_hashes, update.block_hashes, CacheUpdatePolicy::Overwrite);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_hashes, update.block_hashes, CacheUpdatePolicy::Overwrite);
|
||||||
batch.extend_with_cache(DB_COL_EXTRA, &mut *write_txs, update.transactions_addresses, CacheUpdatePolicy::Overwrite);
|
batch.extend_with_cache(db::COL_EXTRA, &mut *write_txs, update.transactions_addresses, CacheUpdatePolicy::Overwrite);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1078,10 +1077,9 @@ mod tests {
|
|||||||
use devtools::*;
|
use devtools::*;
|
||||||
use blockchain::generator::{ChainGenerator, ChainIterator, BlockFinalizer};
|
use blockchain::generator::{ChainGenerator, ChainIterator, BlockFinalizer};
|
||||||
use views::BlockView;
|
use views::BlockView;
|
||||||
use client;
|
|
||||||
|
|
||||||
fn new_db(path: &str) -> Arc<Database> {
|
fn new_db(path: &str) -> Arc<Database> {
|
||||||
Arc::new(Database::open(&DatabaseConfig::with_columns(client::DB_NO_OF_COLUMNS), path).unwrap())
|
Arc::new(Database::open(&DatabaseConfig::with_columns(::db::NUM_COLUMNS), path).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -143,20 +143,6 @@ pub struct Client {
|
|||||||
|
|
||||||
const HISTORY: u64 = 1200;
|
const HISTORY: u64 = 1200;
|
||||||
|
|
||||||
// database columns
|
|
||||||
/// Column for State
|
|
||||||
pub const DB_COL_STATE: Option<u32> = Some(0);
|
|
||||||
/// Column for Block headers
|
|
||||||
pub const DB_COL_HEADERS: Option<u32> = Some(1);
|
|
||||||
/// Column for Block bodies
|
|
||||||
pub const DB_COL_BODIES: Option<u32> = Some(2);
|
|
||||||
/// Column for Extras
|
|
||||||
pub const DB_COL_EXTRA: Option<u32> = Some(3);
|
|
||||||
/// Column for Traces
|
|
||||||
pub const DB_COL_TRACE: Option<u32> = Some(4);
|
|
||||||
/// Number of columns in DB
|
|
||||||
pub const DB_NO_OF_COLUMNS: Option<u32> = Some(5);
|
|
||||||
|
|
||||||
/// Append a path element to the given path and return the string.
|
/// Append a path element to the given path and return the string.
|
||||||
pub fn append_path<P>(path: P, item: &str) -> String where P: AsRef<Path> {
|
pub fn append_path<P>(path: P, item: &str) -> String where P: AsRef<Path> {
|
||||||
let mut p = path.as_ref().to_path_buf();
|
let mut p = path.as_ref().to_path_buf();
|
||||||
@ -175,7 +161,7 @@ impl Client {
|
|||||||
) -> Result<Arc<Client>, ClientError> {
|
) -> Result<Arc<Client>, ClientError> {
|
||||||
let path = path.to_path_buf();
|
let path = path.to_path_buf();
|
||||||
let gb = spec.genesis_block();
|
let gb = spec.genesis_block();
|
||||||
let mut db_config = DatabaseConfig::with_columns(DB_NO_OF_COLUMNS);
|
let mut db_config = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
||||||
db_config.cache_size = config.db_cache_size;
|
db_config.cache_size = config.db_cache_size;
|
||||||
db_config.compaction = config.db_compaction.compaction_profile();
|
db_config.compaction = config.db_compaction.compaction_profile();
|
||||||
db_config.wal = config.db_wal;
|
db_config.wal = config.db_wal;
|
||||||
@ -184,7 +170,7 @@ impl Client {
|
|||||||
let chain = Arc::new(BlockChain::new(config.blockchain, &gb, db.clone()));
|
let chain = Arc::new(BlockChain::new(config.blockchain, &gb, db.clone()));
|
||||||
let tracedb = Arc::new(try!(TraceDB::new(config.tracing, db.clone(), chain.clone())));
|
let tracedb = Arc::new(try!(TraceDB::new(config.tracing, db.clone(), chain.clone())));
|
||||||
|
|
||||||
let mut state_db = journaldb::new(db.clone(), config.pruning, DB_COL_STATE);
|
let mut state_db = journaldb::new(db.clone(), config.pruning, ::db::COL_STATE);
|
||||||
if state_db.is_empty() && try!(spec.ensure_db_good(state_db.as_hashdb_mut())) {
|
if state_db.is_empty() && try!(spec.ensure_db_good(state_db.as_hashdb_mut())) {
|
||||||
let batch = DBTransaction::new(&db);
|
let batch = DBTransaction::new(&db);
|
||||||
try!(state_db.commit(&batch, 0, &spec.genesis_header().hash(), None));
|
try!(state_db.commit(&batch, 0, &spec.genesis_header().hash(), None));
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
// You should have received a copy of the GNU General Public License
|
// You should have received a copy of the GNU General Public License
|
||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
//! Extras db utils.
|
//! Database utilities and definitions.
|
||||||
|
|
||||||
use std::ops::Deref;
|
use std::ops::Deref;
|
||||||
use std::hash::Hash;
|
use std::hash::Hash;
|
||||||
@ -22,18 +22,38 @@ use std::collections::HashMap;
|
|||||||
use util::{DBTransaction, Database, RwLock};
|
use util::{DBTransaction, Database, RwLock};
|
||||||
use util::rlp::{encode, Encodable, decode, Decodable};
|
use util::rlp::{encode, Encodable, decode, Decodable};
|
||||||
|
|
||||||
|
// database columns
|
||||||
|
/// Column for State
|
||||||
|
pub const COL_STATE: Option<u32> = Some(0);
|
||||||
|
/// Column for Block headers
|
||||||
|
pub const COL_HEADERS: Option<u32> = Some(1);
|
||||||
|
/// Column for Block bodies
|
||||||
|
pub const COL_BODIES: Option<u32> = Some(2);
|
||||||
|
/// Column for Extras
|
||||||
|
pub const COL_EXTRA: Option<u32> = Some(3);
|
||||||
|
/// Column for Traces
|
||||||
|
pub const COL_TRACE: Option<u32> = Some(4);
|
||||||
|
/// Number of columns in DB
|
||||||
|
pub const NUM_COLUMNS: Option<u32> = Some(5);
|
||||||
|
|
||||||
|
/// Modes for updating caches.
|
||||||
#[derive(Clone, Copy)]
|
#[derive(Clone, Copy)]
|
||||||
pub enum CacheUpdatePolicy {
|
pub enum CacheUpdatePolicy {
|
||||||
|
/// Overwrite entries.
|
||||||
Overwrite,
|
Overwrite,
|
||||||
|
/// Remove entries.
|
||||||
Remove,
|
Remove,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A cache for arbitrary key-value pairs.
|
||||||
pub trait Cache<K, V> {
|
pub trait Cache<K, V> {
|
||||||
|
/// Insert an entry into the cache and get the old value.
|
||||||
fn insert(&mut self, k: K, v: V) -> Option<V>;
|
fn insert(&mut self, k: K, v: V) -> Option<V>;
|
||||||
|
|
||||||
|
/// Remove an entry from the cache, getting the old value if it existed.
|
||||||
fn remove(&mut self, k: &K) -> Option<V>;
|
fn remove(&mut self, k: &K) -> Option<V>;
|
||||||
|
|
||||||
|
/// Query the cache for a key's associated value.
|
||||||
fn get(&self, k: &K) -> Option<&V>;
|
fn get(&self, k: &K) -> Option<&V>;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,6 +73,7 @@ impl<K, V> Cache<K, V> for HashMap<K, V> where K: Hash + Eq {
|
|||||||
|
|
||||||
/// Should be used to get database key associated with given value.
|
/// Should be used to get database key associated with given value.
|
||||||
pub trait Key<T> {
|
pub trait Key<T> {
|
||||||
|
/// The db key associated with this value.
|
||||||
type Target: Deref<Target = [u8]>;
|
type Target: Deref<Target = [u8]>;
|
||||||
|
|
||||||
/// Returns db key.
|
/// Returns db key.
|
||||||
|
@ -122,11 +122,11 @@ pub mod migrations;
|
|||||||
pub mod miner;
|
pub mod miner;
|
||||||
pub mod snapshot;
|
pub mod snapshot;
|
||||||
pub mod action_params;
|
pub mod action_params;
|
||||||
|
pub mod db;
|
||||||
#[macro_use] pub mod evm;
|
#[macro_use] pub mod evm;
|
||||||
|
|
||||||
mod cache_manager;
|
mod cache_manager;
|
||||||
mod blooms;
|
mod blooms;
|
||||||
mod db;
|
|
||||||
mod common;
|
mod common;
|
||||||
mod basic_types;
|
mod basic_types;
|
||||||
mod env_info;
|
mod env_info;
|
||||||
|
@ -408,7 +408,7 @@ impl StateRebuilder {
|
|||||||
/// Create a new state rebuilder to write into the given backing DB.
|
/// Create a new state rebuilder to write into the given backing DB.
|
||||||
pub fn new(db: Arc<Database>, pruning: Algorithm) -> Self {
|
pub fn new(db: Arc<Database>, pruning: Algorithm) -> Self {
|
||||||
StateRebuilder {
|
StateRebuilder {
|
||||||
db: journaldb::new(db.clone(), pruning, ::client::DB_COL_STATE),
|
db: journaldb::new(db.clone(), pruning, ::db::COL_STATE),
|
||||||
state_root: SHA3_NULL_RLP,
|
state_root: SHA3_NULL_RLP,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -99,7 +99,7 @@ struct Restoration {
|
|||||||
impl Restoration {
|
impl Restoration {
|
||||||
// make a new restoration, building databases in the given path.
|
// make a new restoration, building databases in the given path.
|
||||||
fn new(manifest: &ManifestData, pruning: Algorithm, path: &Path, gb: &[u8]) -> Result<Self, Error> {
|
fn new(manifest: &ManifestData, pruning: Algorithm, path: &Path, gb: &[u8]) -> Result<Self, Error> {
|
||||||
let cfg = DatabaseConfig::with_columns(::client::DB_NO_OF_COLUMNS);
|
let cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
||||||
let raw_db = Arc::new(try!(Database::open(&cfg, &*path.to_string_lossy())
|
let raw_db = Arc::new(try!(Database::open(&cfg, &*path.to_string_lossy())
|
||||||
.map_err(UtilError::SimpleString)));
|
.map_err(UtilError::SimpleString)));
|
||||||
|
|
||||||
|
@ -32,7 +32,7 @@ fn chunk_and_restore(amount: u64) {
|
|||||||
let mut canon_chain = ChainGenerator::default();
|
let mut canon_chain = ChainGenerator::default();
|
||||||
let mut finalizer = BlockFinalizer::default();
|
let mut finalizer = BlockFinalizer::default();
|
||||||
let genesis = canon_chain.generate(&mut finalizer).unwrap();
|
let genesis = canon_chain.generate(&mut finalizer).unwrap();
|
||||||
let db_cfg = DatabaseConfig::with_columns(::client::DB_NO_OF_COLUMNS);
|
let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
||||||
|
|
||||||
let orig_path = RandomTempPath::create_dir();
|
let orig_path = RandomTempPath::create_dir();
|
||||||
let new_path = RandomTempPath::create_dir();
|
let new_path = RandomTempPath::create_dir();
|
||||||
|
@ -35,7 +35,7 @@ fn snap_and_restore() {
|
|||||||
let mut producer = StateProducer::new();
|
let mut producer = StateProducer::new();
|
||||||
let mut rng = rand::thread_rng();
|
let mut rng = rand::thread_rng();
|
||||||
let mut old_db = MemoryDB::new();
|
let mut old_db = MemoryDB::new();
|
||||||
let db_cfg = DatabaseConfig::with_columns(::client::DB_NO_OF_COLUMNS);
|
let db_cfg = DatabaseConfig::with_columns(::db::NUM_COLUMNS);
|
||||||
|
|
||||||
for _ in 0..150 {
|
for _ in 0..150 {
|
||||||
producer.tick(&mut rng, &mut old_db);
|
producer.tick(&mut rng, &mut old_db);
|
||||||
@ -76,7 +76,7 @@ fn snap_and_restore() {
|
|||||||
new_db
|
new_db
|
||||||
};
|
};
|
||||||
|
|
||||||
let new_db = journaldb::new(db, Algorithm::Archive, ::client::DB_COL_STATE);
|
let new_db = journaldb::new(db, Algorithm::Archive, ::db::COL_STATE);
|
||||||
|
|
||||||
compare_dbs(&old_db, new_db.as_hashdb());
|
compare_dbs(&old_db, new_db.as_hashdb());
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
// along with Parity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
use io::*;
|
use io::*;
|
||||||
use client::{self, BlockChainClient, Client, ClientConfig};
|
use client::{BlockChainClient, Client, ClientConfig};
|
||||||
use common::*;
|
use common::*;
|
||||||
use spec::*;
|
use spec::*;
|
||||||
use block::{OpenBlock, Drain};
|
use block::{OpenBlock, Drain};
|
||||||
@ -250,7 +250,7 @@ pub fn get_test_client_with_blocks(blocks: Vec<Bytes>) -> GuardedTempResult<Arc<
|
|||||||
|
|
||||||
fn new_db(path: &str) -> Arc<Database> {
|
fn new_db(path: &str) -> Arc<Database> {
|
||||||
Arc::new(
|
Arc::new(
|
||||||
Database::open(&DatabaseConfig::with_columns(client::DB_NO_OF_COLUMNS), path)
|
Database::open(&DatabaseConfig::with_columns(::db::NUM_COLUMNS), path)
|
||||||
.expect("Opening database for tests should always work.")
|
.expect("Opening database for tests should always work.")
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -23,10 +23,9 @@ use bloomchain::group::{BloomGroupDatabase, BloomGroupChain, GroupPosition, Bloo
|
|||||||
use util::{H256, H264, Database, DBTransaction, RwLock, HeapSizeOf};
|
use util::{H256, H264, Database, DBTransaction, RwLock, HeapSizeOf};
|
||||||
use header::BlockNumber;
|
use header::BlockNumber;
|
||||||
use trace::{LocalizedTrace, Config, Switch, Filter, Database as TraceDatabase, ImportRequest, DatabaseExtras, Error};
|
use trace::{LocalizedTrace, Config, Switch, Filter, Database as TraceDatabase, ImportRequest, DatabaseExtras, Error};
|
||||||
use db::{Key, Writable, Readable, CacheUpdatePolicy};
|
use db::{self, Key, Writable, Readable, CacheUpdatePolicy};
|
||||||
use blooms;
|
use blooms;
|
||||||
use super::flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces};
|
use super::flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces};
|
||||||
use client::DB_COL_TRACE;
|
|
||||||
use cache_manager::CacheManager;
|
use cache_manager::CacheManager;
|
||||||
|
|
||||||
const TRACE_DB_VER: &'static [u8] = b"1.0";
|
const TRACE_DB_VER: &'static [u8] = b"1.0";
|
||||||
@ -119,7 +118,7 @@ pub struct TraceDB<T> where T: DatabaseExtras {
|
|||||||
impl<T> BloomGroupDatabase for TraceDB<T> where T: DatabaseExtras {
|
impl<T> BloomGroupDatabase for TraceDB<T> where T: DatabaseExtras {
|
||||||
fn blooms_at(&self, position: &GroupPosition) -> Option<BloomGroup> {
|
fn blooms_at(&self, position: &GroupPosition) -> Option<BloomGroup> {
|
||||||
let position = TraceGroupPosition::from(position.clone());
|
let position = TraceGroupPosition::from(position.clone());
|
||||||
let result = self.tracesdb.read_with_cache(DB_COL_TRACE, &self.blooms, &position).map(Into::into);
|
let result = self.tracesdb.read_with_cache(db::COL_TRACE, &self.blooms, &position).map(Into::into);
|
||||||
self.note_used(CacheID::Bloom(position));
|
self.note_used(CacheID::Bloom(position));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@ -129,7 +128,7 @@ impl<T> TraceDB<T> where T: DatabaseExtras {
|
|||||||
/// Creates new instance of `TraceDB`.
|
/// Creates new instance of `TraceDB`.
|
||||||
pub fn new(config: Config, tracesdb: Arc<Database>, extras: Arc<T>) -> Result<Self, Error> {
|
pub fn new(config: Config, tracesdb: Arc<Database>, extras: Arc<T>) -> Result<Self, Error> {
|
||||||
// check if in previously tracing was enabled
|
// check if in previously tracing was enabled
|
||||||
let old_tracing = match tracesdb.get(DB_COL_TRACE, b"enabled").unwrap() {
|
let old_tracing = match tracesdb.get(db::COL_TRACE, b"enabled").unwrap() {
|
||||||
Some(ref value) if value as &[u8] == &[0x1] => Switch::On,
|
Some(ref value) if value as &[u8] == &[0x1] => Switch::On,
|
||||||
Some(ref value) if value as &[u8] == &[0x0] => Switch::Off,
|
Some(ref value) if value as &[u8] == &[0x0] => Switch::Off,
|
||||||
Some(_) => { panic!("tracesdb is corrupted") },
|
Some(_) => { panic!("tracesdb is corrupted") },
|
||||||
@ -144,8 +143,8 @@ impl<T> TraceDB<T> where T: DatabaseExtras {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let batch = DBTransaction::new(&tracesdb);
|
let batch = DBTransaction::new(&tracesdb);
|
||||||
batch.put(DB_COL_TRACE, b"enabled", &encoded_tracing);
|
batch.put(db::COL_TRACE, b"enabled", &encoded_tracing);
|
||||||
batch.put(DB_COL_TRACE, b"version", TRACE_DB_VER);
|
batch.put(db::COL_TRACE, b"version", TRACE_DB_VER);
|
||||||
tracesdb.write(batch).unwrap();
|
tracesdb.write(batch).unwrap();
|
||||||
|
|
||||||
let db = TraceDB {
|
let db = TraceDB {
|
||||||
@ -197,7 +196,7 @@ impl<T> TraceDB<T> where T: DatabaseExtras {
|
|||||||
|
|
||||||
/// Returns traces for block with hash.
|
/// Returns traces for block with hash.
|
||||||
fn traces(&self, block_hash: &H256) -> Option<FlatBlockTraces> {
|
fn traces(&self, block_hash: &H256) -> Option<FlatBlockTraces> {
|
||||||
let result = self.tracesdb.read_with_cache(DB_COL_TRACE, &self.traces, block_hash);
|
let result = self.tracesdb.read_with_cache(db::COL_TRACE, &self.traces, block_hash);
|
||||||
self.note_used(CacheID::Trace(block_hash.clone()));
|
self.note_used(CacheID::Trace(block_hash.clone()));
|
||||||
result
|
result
|
||||||
}
|
}
|
||||||
@ -273,7 +272,7 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
|
|||||||
let mut traces = self.traces.write();
|
let mut traces = self.traces.write();
|
||||||
// it's important to use overwrite here,
|
// it's important to use overwrite here,
|
||||||
// cause this value might be queried by hash later
|
// cause this value might be queried by hash later
|
||||||
batch.write_with_cache(DB_COL_TRACE, &mut *traces, request.block_hash, request.traces, CacheUpdatePolicy::Overwrite);
|
batch.write_with_cache(db::COL_TRACE, &mut *traces, request.block_hash, request.traces, CacheUpdatePolicy::Overwrite);
|
||||||
// note_used must be called after locking traces to avoid cache/traces deadlock on garbage collection
|
// note_used must be called after locking traces to avoid cache/traces deadlock on garbage collection
|
||||||
self.note_used(CacheID::Trace(request.block_hash.clone()));
|
self.note_used(CacheID::Trace(request.block_hash.clone()));
|
||||||
}
|
}
|
||||||
@ -302,7 +301,7 @@ impl<T> TraceDatabase for TraceDB<T> where T: DatabaseExtras {
|
|||||||
|
|
||||||
let blooms_keys: Vec<_> = blooms_to_insert.keys().cloned().collect();
|
let blooms_keys: Vec<_> = blooms_to_insert.keys().cloned().collect();
|
||||||
let mut blooms = self.blooms.write();
|
let mut blooms = self.blooms.write();
|
||||||
batch.extend_with_cache(DB_COL_TRACE, &mut *blooms, blooms_to_insert, CacheUpdatePolicy::Remove);
|
batch.extend_with_cache(db::COL_TRACE, &mut *blooms, blooms_to_insert, CacheUpdatePolicy::Remove);
|
||||||
// note_used must be called after locking blooms to avoid cache/traces deadlock on garbage collection
|
// note_used must be called after locking blooms to avoid cache/traces deadlock on garbage collection
|
||||||
for key in blooms_keys.into_iter() {
|
for key in blooms_keys.into_iter() {
|
||||||
self.note_used(CacheID::Bloom(key));
|
self.note_used(CacheID::Bloom(key));
|
||||||
@ -417,7 +416,6 @@ mod tests {
|
|||||||
use trace::{Filter, LocalizedTrace, AddressesFilter};
|
use trace::{Filter, LocalizedTrace, AddressesFilter};
|
||||||
use trace::trace::{Call, Action, Res};
|
use trace::trace::{Call, Action, Res};
|
||||||
use trace::flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces};
|
use trace::flat::{FlatTrace, FlatBlockTraces, FlatTransactionTraces};
|
||||||
use client::DB_NO_OF_COLUMNS;
|
|
||||||
use types::executed::CallType;
|
use types::executed::CallType;
|
||||||
|
|
||||||
struct NoopExtras;
|
struct NoopExtras;
|
||||||
@ -459,7 +457,7 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn new_db(path: &str) -> Arc<Database> {
|
fn new_db(path: &str) -> Arc<Database> {
|
||||||
Arc::new(Database::open(&DatabaseConfig::with_columns(DB_NO_OF_COLUMNS), path).unwrap())
|
Arc::new(Database::open(&DatabaseConfig::with_columns(::db::NUM_COLUMNS), path).unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
@ -588,7 +586,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn test_import() {
|
fn test_import() {
|
||||||
let temp = RandomTempPath::new();
|
let temp = RandomTempPath::new();
|
||||||
let db = Arc::new(Database::open(&DatabaseConfig::with_columns(DB_NO_OF_COLUMNS), temp.as_str()).unwrap());
|
let db = Arc::new(Database::open(&DatabaseConfig::with_columns(::db::NUM_COLUMNS), temp.as_str()).unwrap());
|
||||||
let mut config = Config::default();
|
let mut config = Config::default();
|
||||||
config.enabled = Switch::On;
|
config.enabled = Switch::On;
|
||||||
let block_0 = H256::from(0xa1);
|
let block_0 = H256::from(0xa1);
|
||||||
|
@ -23,7 +23,7 @@ use util::journaldb::Algorithm;
|
|||||||
use util::migration::{Manager as MigrationManager, Config as MigrationConfig, Error as MigrationError, Migration};
|
use util::migration::{Manager as MigrationManager, Config as MigrationConfig, Error as MigrationError, Migration};
|
||||||
use util::kvdb::{CompactionProfile, Database, DatabaseConfig};
|
use util::kvdb::{CompactionProfile, Database, DatabaseConfig};
|
||||||
use ethcore::migrations;
|
use ethcore::migrations;
|
||||||
use ethcore::client;
|
use ethcore::db;
|
||||||
use ethcore::migrations::Extract;
|
use ethcore::migrations::Extract;
|
||||||
|
|
||||||
/// Database is assumed to be at default version, when no version file is found.
|
/// Database is assumed to be at default version, when no version file is found.
|
||||||
@ -240,11 +240,11 @@ pub fn migrate(path: &Path, pruning: Algorithm, compaction_profile: CompactionPr
|
|||||||
let db_path = consolidated_database_path(path);
|
let db_path = consolidated_database_path(path);
|
||||||
// Remove the database dir (it shouldn't exist anyway, but it might when migration was interrupted)
|
// Remove the database dir (it shouldn't exist anyway, but it might when migration was interrupted)
|
||||||
let _ = fs::remove_dir_all(db_path.clone());
|
let _ = fs::remove_dir_all(db_path.clone());
|
||||||
try!(consolidate_database(legacy::blocks_database_path(path), db_path.clone(), client::DB_COL_HEADERS, Extract::Header, &compaction_profile));
|
try!(consolidate_database(legacy::blocks_database_path(path), db_path.clone(), db::COL_HEADERS, Extract::Header, &compaction_profile));
|
||||||
try!(consolidate_database(legacy::blocks_database_path(path), db_path.clone(), client::DB_COL_BODIES, Extract::Body, &compaction_profile));
|
try!(consolidate_database(legacy::blocks_database_path(path), db_path.clone(), db::COL_BODIES, Extract::Body, &compaction_profile));
|
||||||
try!(consolidate_database(legacy::extras_database_path(path), db_path.clone(), client::DB_COL_EXTRA, Extract::All, &compaction_profile));
|
try!(consolidate_database(legacy::extras_database_path(path), db_path.clone(), db::COL_EXTRA, Extract::All, &compaction_profile));
|
||||||
try!(consolidate_database(legacy::state_database_path(path), db_path.clone(), client::DB_COL_STATE, Extract::All, &compaction_profile));
|
try!(consolidate_database(legacy::state_database_path(path), db_path.clone(), db::COL_STATE, Extract::All, &compaction_profile));
|
||||||
try!(consolidate_database(legacy::trace_database_path(path), db_path.clone(), client::DB_COL_TRACE, Extract::All, &compaction_profile));
|
try!(consolidate_database(legacy::trace_database_path(path), db_path.clone(), db::COL_TRACE, Extract::All, &compaction_profile));
|
||||||
let _ = fs::remove_dir_all(legacy::blocks_database_path(path));
|
let _ = fs::remove_dir_all(legacy::blocks_database_path(path));
|
||||||
let _ = fs::remove_dir_all(legacy::extras_database_path(path));
|
let _ = fs::remove_dir_all(legacy::extras_database_path(path));
|
||||||
let _ = fs::remove_dir_all(legacy::state_database_path(path));
|
let _ = fs::remove_dir_all(legacy::state_database_path(path));
|
||||||
|
Loading…
Reference in New Issue
Block a user