Skip to content
This repository has been archived by the owner on Nov 6, 2020. It is now read-only.

Fix JournalDB era marker #690

Merged
merged 4 commits into from
Mar 13, 2016
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
23 changes: 16 additions & 7 deletions util/src/journaldb/earlymergedb.rs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ pub struct EarlyMergeDB {
overlay: MemoryDB,
backing: Arc<Database>,
refs: Option<Arc<RwLock<HashMap<H256, RefInfo>>>>,
latest_era: u64,
}

// all keys must be at least 12 bytes
Expand All @@ -90,11 +91,13 @@ impl EarlyMergeDB {
backing.put(&VERSION_KEY, &encode(&DB_VERSION)).expect("Error writing version to database");
}

let refs = Some(Arc::new(RwLock::new(EarlyMergeDB::read_refs(&backing))));
let (latest_era, refs) = EarlyMergeDB::read_refs(&backing);
let refs = Some(Arc::new(RwLock::new(refs)));
EarlyMergeDB {
overlay: MemoryDB::new(),
backing: Arc::new(backing),
refs: refs,
latest_era: latest_era,
}
}

Expand Down Expand Up @@ -225,9 +228,9 @@ impl EarlyMergeDB {

#[cfg(test)]
fn can_reconstruct_refs(&self) -> bool {
let reconstructed = Self::read_refs(&self.backing);
let (latest_era, reconstructed) = Self::read_refs(&self.backing);
let refs = self.refs.as_ref().unwrap().write().unwrap();
if *refs != reconstructed {
if *refs != reconstructed || latest_era != self.latest_era {
let clean_refs = refs.iter().filter_map(|(k, v)| if reconstructed.get(k) == Some(v) {None} else {Some((k.clone(), v.clone()))}).collect::<HashMap<_, _>>();
let clean_recon = reconstructed.into_iter().filter_map(|(k, v)| if refs.get(&k) == Some(&v) {None} else {Some((k.clone(), v.clone()))}).collect::<HashMap<_, _>>();
warn!(target: "jdb", "mem: {:?} != log: {:?}", clean_refs, clean_recon);
Expand All @@ -241,10 +244,12 @@ impl EarlyMergeDB {
self.backing.get(&key.bytes()).expect("Low-level database error. Some issue with your hard disk?").map(|v| v.to_vec())
}

fn read_refs(db: &Database) -> HashMap<H256, RefInfo> {
fn read_refs(db: &Database) -> (u64, HashMap<H256, RefInfo>) {
let mut refs = HashMap::new();
let mut latest_era = 0u64;
if let Some(val) = db.get(&LATEST_ERA_KEY).expect("Low-level database error.") {
let mut era = decode::<u64>(&val);
latest_era = decode::<u64>(&val);
let mut era = latest_era;
loop {
let mut index = 0usize;
while let Some(rlp_data) = db.get({
Expand All @@ -265,7 +270,7 @@ impl EarlyMergeDB {
era -= 1;
}
}
refs
(latest_era, refs)
}
}

Expand Down Expand Up @@ -320,6 +325,7 @@ impl JournalDB for EarlyMergeDB {
overlay: MemoryDB::new(),
backing: self.backing.clone(),
refs: self.refs.clone(),
latest_era: self.latest_era,
})
}

Expand Down Expand Up @@ -435,7 +441,10 @@ impl JournalDB for EarlyMergeDB {
trace!(target: "jdb.ops", " Deletes: {:?}", removes);
}
try!(batch.put(&last, r.as_raw()));
try!(batch.put(&LATEST_ERA_KEY, &encode(&now)));
if now >= self.latest_era {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not just >?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can't use 0 as special value with >. Changed to Option

try!(batch.put(&LATEST_ERA_KEY, &encode(&now)));
self.latest_era = now;
}
}

// apply old commits' details
Expand Down