@@ -78,7 +78,7 @@ impl HashDB for ArchiveDB {
|
||||
ret.insert(h, 1);
|
||||
}
|
||||
|
||||
for (key, refs) in self.overlay.keys().into_iter() {
|
||||
for (key, refs) in self.overlay.keys() {
|
||||
let refs = *ret.get(&key).unwrap_or(&0) + refs;
|
||||
ret.insert(key, refs);
|
||||
}
|
||||
@@ -152,7 +152,7 @@ impl JournalDB for ArchiveDB {
|
||||
let mut inserts = 0usize;
|
||||
let mut deletes = 0usize;
|
||||
|
||||
for i in self.overlay.drain().into_iter() {
|
||||
for i in self.overlay.drain() {
|
||||
let (key, (value, rc)) = i;
|
||||
if rc > 0 {
|
||||
batch.put(self.column, &key, &value);
|
||||
@@ -164,7 +164,7 @@ impl JournalDB for ArchiveDB {
|
||||
}
|
||||
}
|
||||
|
||||
for (mut key, value) in self.overlay.drain_aux().into_iter() {
|
||||
for (mut key, value) in self.overlay.drain_aux() {
|
||||
key.push(AUX_FLAG);
|
||||
batch.put(self.column, &key, &value);
|
||||
}
|
||||
@@ -185,7 +185,7 @@ impl JournalDB for ArchiveDB {
|
||||
let mut inserts = 0usize;
|
||||
let mut deletes = 0usize;
|
||||
|
||||
for i in self.overlay.drain().into_iter() {
|
||||
for i in self.overlay.drain() {
|
||||
let (key, (value, rc)) = i;
|
||||
if rc > 0 {
|
||||
if try!(self.backing.get(self.column, &key)).is_some() {
|
||||
@@ -204,7 +204,7 @@ impl JournalDB for ArchiveDB {
|
||||
}
|
||||
}
|
||||
|
||||
for (mut key, value) in self.overlay.drain_aux().into_iter() {
|
||||
for (mut key, value) in self.overlay.drain_aux() {
|
||||
key.push(AUX_FLAG);
|
||||
batch.put(self.column, &key, &value);
|
||||
}
|
||||
|
||||
@@ -63,9 +63,11 @@ enum RemoveFrom {
|
||||
/// the removals actually take effect.
|
||||
///
|
||||
/// journal format:
|
||||
/// ```
|
||||
/// [era, 0] => [ id, [insert_0, ...], [remove_0, ...] ]
|
||||
/// [era, 1] => [ id, [insert_0, ...], [remove_0, ...] ]
|
||||
/// [era, n] => [ ... ]
|
||||
/// ```
|
||||
///
|
||||
/// When we make a new commit, we make a journal of all blocks in the recent history and record
|
||||
/// all keys that were inserted and deleted. The journal is ordered by era; multiple commits can
|
||||
@@ -80,6 +82,7 @@ enum RemoveFrom {
|
||||
/// which includes an original key, if any.
|
||||
///
|
||||
/// The semantics of the `counter` are:
|
||||
/// ```
|
||||
/// insert key k:
|
||||
/// counter already contains k: count += 1
|
||||
/// counter doesn't contain k:
|
||||
@@ -91,9 +94,11 @@ enum RemoveFrom {
|
||||
/// count == 1: remove counter
|
||||
/// count == 0: remove key from backing db
|
||||
/// counter doesn't contain k: remove key from backing db
|
||||
/// ```
|
||||
///
|
||||
/// Practically, this means that for each commit block turning from recent to ancient we do the
|
||||
/// following:
|
||||
/// ```
|
||||
/// is_canonical:
|
||||
/// inserts: Ignored (left alone in the backing database).
|
||||
/// deletes: Enacted; however, recent history queue is checked for ongoing references. This is
|
||||
@@ -102,8 +107,9 @@ enum RemoveFrom {
|
||||
/// inserts: Reverted; however, recent history queue is checked for ongoing references. This is
|
||||
/// reduced as a preference to deletion from the backing database.
|
||||
/// deletes: Ignored (they were never inserted).
|
||||
/// ```
|
||||
///
|
||||
/// TODO: store_reclaim_period
|
||||
/// TODO: `store_reclaim_period`
|
||||
pub struct EarlyMergeDB {
|
||||
overlay: MemoryDB,
|
||||
backing: Arc<Database>,
|
||||
@@ -310,7 +316,7 @@ impl HashDB for EarlyMergeDB {
|
||||
ret.insert(h, 1);
|
||||
}
|
||||
|
||||
for (key, refs) in self.overlay.keys().into_iter() {
|
||||
for (key, refs) in self.overlay.keys() {
|
||||
let refs = *ret.get(&key).unwrap_or(&0) + refs;
|
||||
ret.insert(key, refs);
|
||||
}
|
||||
|
||||
@@ -379,7 +379,7 @@ impl HashDB for OverlayRecentDB {
|
||||
ret.insert(h, 1);
|
||||
}
|
||||
|
||||
for (key, refs) in self.transaction_overlay.keys().into_iter() {
|
||||
for (key, refs) in self.transaction_overlay.keys() {
|
||||
let refs = *ret.get(&key).unwrap_or(&0) + refs;
|
||||
ret.insert(key, refs);
|
||||
}
|
||||
|
||||
@@ -36,12 +36,14 @@ use std::env;
|
||||
/// the removals actually take effect.
|
||||
///
|
||||
/// journal format:
|
||||
/// ```
|
||||
/// [era, 0] => [ id, [insert_0, ...], [remove_0, ...] ]
|
||||
/// [era, 1] => [ id, [insert_0, ...], [remove_0, ...] ]
|
||||
/// [era, n] => [ ... ]
|
||||
/// ```
|
||||
///
|
||||
/// when we make a new commit, we journal the inserts and removes.
|
||||
/// for each end_era that we journaled that we are no passing by,
|
||||
/// for each `end_era` that we journaled that we are no passing by,
|
||||
/// we remove all of its removes assuming it is canonical and all
|
||||
/// of its inserts otherwise.
|
||||
// TODO: store last_era, reclaim_period.
|
||||
|
||||
@@ -231,7 +231,7 @@ impl Manager {
|
||||
trace!(target: "migration", "Total migrations to execute for version {}: {}", version, migrations.len());
|
||||
if migrations.is_empty() { return Err(Error::MigrationImpossible) };
|
||||
|
||||
let columns = migrations.iter().nth(0).and_then(|m| m.pre_columns());
|
||||
let columns = migrations.get(0).and_then(|m| m.pre_columns());
|
||||
|
||||
trace!(target: "migration", "Expecting database to contain {:?} columns", columns);
|
||||
let mut db_config = DatabaseConfig {
|
||||
|
||||
@@ -66,7 +66,7 @@ impl OverlayDB {
|
||||
pub fn commit_to_batch(&mut self, batch: &mut DBTransaction) -> Result<u32, UtilError> {
|
||||
let mut ret = 0u32;
|
||||
let mut deletes = 0usize;
|
||||
for i in self.overlay.drain().into_iter() {
|
||||
for i in self.overlay.drain() {
|
||||
let (key, (value, rc)) = i;
|
||||
if rc != 0 {
|
||||
match self.payload(&key) {
|
||||
@@ -133,7 +133,7 @@ impl HashDB for OverlayDB {
|
||||
ret.insert(h, r as i32);
|
||||
}
|
||||
|
||||
for (key, refs) in self.overlay.keys().into_iter() {
|
||||
for (key, refs) in self.overlay.keys() {
|
||||
let refs = *ret.get(&key).unwrap_or(&0) + refs;
|
||||
ret.insert(key, refs);
|
||||
}
|
||||
|
||||
@@ -84,7 +84,7 @@ impl Journal {
|
||||
pub fn apply(self, db: &mut HashDB) -> Score {
|
||||
trace!("applying {:?} changes", self.0.len());
|
||||
let mut ret = Score{inserts: 0, removes: 0};
|
||||
for d in self.0.into_iter() {
|
||||
for d in self.0 {
|
||||
match d {
|
||||
Operation::Delete(h) => {
|
||||
trace!("TrieDBMut::apply --- {:?}", &h);
|
||||
|
||||
@@ -87,7 +87,7 @@ impl<'db> TrieDB<'db> {
|
||||
/// Convert a vector of hashes to a hashmap of hash to occurrences.
|
||||
pub fn to_map(hashes: Vec<H256>) -> HashMap<H256, u32> {
|
||||
let mut r: HashMap<H256, u32> = HashMap::new();
|
||||
for h in hashes.into_iter() {
|
||||
for h in hashes {
|
||||
*r.entry(h).or_insert(0) += 1;
|
||||
}
|
||||
r
|
||||
@@ -97,7 +97,7 @@ impl<'db> TrieDB<'db> {
|
||||
/// trie.
|
||||
pub fn db_items_remaining(&self) -> super::Result<HashMap<H256, i32>> {
|
||||
let mut ret = self.db.keys();
|
||||
for (k, v) in Self::to_map(try!(self.keys())).into_iter() {
|
||||
for (k, v) in Self::to_map(try!(self.keys())) {
|
||||
let keycount = *ret.get(&k).unwrap_or(&0);
|
||||
match keycount <= v as i32 {
|
||||
true => ret.remove(&k),
|
||||
|
||||
Reference in New Issue
Block a user