better error handling, migrate version key as well
This commit is contained in:
parent
aaf9490c91
commit
3b0b1375f2
@ -79,6 +79,13 @@ impl SimpleMigration for ArchiveV7 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// magic numbers and constants for overlay-recent at v6.
|
||||||
|
// re-written here because it may change in the journaldb module.
|
||||||
|
const V7_LATEST_ERA_KEY: &'static [u8] = &[ b'l', b'a', b's', b't', 0, 0, 0, 0, 0, 0, 0, 0 ];
|
||||||
|
const V7_VERSION_KEY: &'static [u8] = &[ b'j', b'v', b'e', b'r', 0, 0, 0, 0, 0, 0, 0, 0 ];
|
||||||
|
const DB_VERSION: u32 = 0x203;
|
||||||
|
const PADDING : [u8; 10] = [0u8; 10];
|
||||||
|
|
||||||
/// Version for OverlayRecent database.
|
/// Version for OverlayRecent database.
|
||||||
/// more involved than the archive version because of journaling.
|
/// more involved than the archive version because of journaling.
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
@ -91,12 +98,7 @@ impl OverlayRecentV7 {
|
|||||||
// replacing any known migrated keys with their counterparts
|
// replacing any known migrated keys with their counterparts
|
||||||
// and then committing again.
|
// and then committing again.
|
||||||
fn migrate_journal(&self, source: &Database, mut batch: Batch, dest: &mut Database) -> Result<(), Error> {
|
fn migrate_journal(&self, source: &Database, mut batch: Batch, dest: &mut Database) -> Result<(), Error> {
|
||||||
// re-written here because it may change in the journaldb module.
|
if let Some(val) = try!(source.get(V7_LATEST_ERA_KEY).map_err(Error::Custom)) {
|
||||||
const V7_LATEST_ERA_KEY: &'static [u8] = &[ b'l', b'a', b's', b't', 0, 0, 0, 0, 0, 0, 0, 0 ];
|
|
||||||
const PADDING : [u8; 10] = [0u8; 10];
|
|
||||||
|
|
||||||
|
|
||||||
if let Some(val) = source.get(V7_LATEST_ERA_KEY).expect("Low-level database error.") {
|
|
||||||
try!(batch.insert(V7_LATEST_ERA_KEY.into(), val.to_owned(), dest));
|
try!(batch.insert(V7_LATEST_ERA_KEY.into(), val.to_owned(), dest));
|
||||||
|
|
||||||
let mut era = decode::<u64>(&val);
|
let mut era = decode::<u64>(&val);
|
||||||
@ -109,7 +111,7 @@ impl OverlayRecentV7 {
|
|||||||
r.out()
|
r.out()
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(journal_raw) = source.get(&entry_key).expect("Low-level database error.") {
|
if let Some(journal_raw) = try!(source.get(&entry_key).map_err(Error::Custom)) {
|
||||||
let rlp = Rlp::new(&journal_raw);
|
let rlp = Rlp::new(&journal_raw);
|
||||||
let id: H256 = rlp.val_at(0);
|
let id: H256 = rlp.val_at(0);
|
||||||
let mut inserted_keys: Vec<(H256, Bytes)> = Vec::new();
|
let mut inserted_keys: Vec<(H256, Bytes)> = Vec::new();
|
||||||
@ -172,6 +174,14 @@ impl Migration for OverlayRecentV7 {
|
|||||||
fn migrate(&mut self, source: &Database, config: &Config, dest: &mut Database) -> Result<(), Error> {
|
fn migrate(&mut self, source: &Database, config: &Config, dest: &mut Database) -> Result<(), Error> {
|
||||||
let mut batch = Batch::new(config);
|
let mut batch = Batch::new(config);
|
||||||
|
|
||||||
|
// migrate version metadata.
|
||||||
|
match try!(source.get(V7_VERSION_KEY).map_err(Error::Custom)) {
|
||||||
|
Some(ref version) if decode::<u32>(&*version) == DB_VERSION => {
|
||||||
|
try!(batch.insert(V7_VERSION_KEY.into(), version[..].to_owned(), dest));
|
||||||
|
}
|
||||||
|
_ => return Err(Error::MigrationImpossible), // missing or wrong version
|
||||||
|
}
|
||||||
|
|
||||||
for (key, value) in source.iter().filter(|&(ref k, _)| k.len() == 32) {
|
for (key, value) in source.iter().filter(|&(ref k, _)| k.len() == 32) {
|
||||||
let key_h = H256::from_slice(&key[..]);
|
let key_h = H256::from_slice(&key[..]);
|
||||||
if let Ok(new_key) = attempt_migrate(key_h.clone(), &value) {
|
if let Ok(new_key) = attempt_migrate(key_h.clone(), &value) {
|
||||||
|
Loading…
Reference in New Issue
Block a user