Mercurial > lbo > hg > leveldb-rs
changeset 399:5679d04a98c9
db_impl/version*: Bring back prev_log_number for LevelDB compatibility
author | Lewin Bormann <lbo@spheniscida.de> |
---|---|
date | Tue, 10 Oct 2017 21:15:44 +0200 |
parents | 20ababef4504 |
children | d12b13664ad6 |
files | src/db_impl.rs src/version_edit.rs src/version_set.rs |
diffstat | 3 files changed, 44 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/db_impl.rs Tue Oct 10 07:49:01 2017 +0000 +++ b/src/db_impl.rs Tue Oct 10 21:15:44 2017 +0200 @@ -169,7 +169,8 @@ for file in &filenames { if let Ok((num, typ)) = parse_file_name(&file) { expected.remove(&num); - if typ == FileType::Log && num >= self.vset.borrow().log_num { + if typ == FileType::Log && + (num >= self.vset.borrow().log_num || num == self.vset.borrow().prev_log_num) { log_files.push(num); } }
--- a/src/version_edit.rs Tue Oct 10 07:49:01 2017 +0000 +++ b/src/version_edit.rs Tue Oct 10 21:15:44 2017 +0200 @@ -21,7 +21,8 @@ LastSequence = 4, CompactPointer = 5, DeletedFile = 6, - NewFile = 7, // sic! + NewFile = 7, + PrevLogNumber = 9, // sic! } fn tag_to_enum(t: u32) -> Option<EditTag> { @@ -33,6 +34,7 @@ 5 => Some(EditTag::CompactPointer), 6 => Some(EditTag::DeletedFile), 7 => Some(EditTag::NewFile), + 9 => Some(EditTag::PrevLogNumber), _ => None, } } @@ -59,6 +61,7 @@ pub struct VersionEdit { comparator: Option<String>, pub log_number: Option<FileNum>, + pub prev_log_number: Option<FileNum>, pub next_file_number: Option<FileNum>, pub last_seq: Option<SequenceNumber>, @@ -72,6 +75,7 @@ VersionEdit { comparator: None, log_number: None, + prev_log_number: None, next_file_number: None, last_seq: None, compaction_ptrs: Vec::with_capacity(8), @@ -100,6 +104,10 @@ self.log_number = Some(num) } + pub fn set_prev_log_num(&mut self, num: u64) { + self.prev_log_number = Some(num); + } + pub fn set_last_seq(&mut self, num: u64) { self.last_seq = Some(num) } @@ -132,6 +140,11 @@ buf.write_varint(lognum).unwrap(); } + if let Some(prevlognum) = self.prev_log_number { + buf.write_varint(EditTag::PrevLogNumber as u32).unwrap(); + buf.write_varint(prevlognum).unwrap(); + } + if let Some(nfn) = self.next_file_number { buf.write_varint(EditTag::NextFileNumber as u32).unwrap(); buf.write_varint(nfn).unwrap(); @@ -194,6 +207,14 @@ } } + EditTag::PrevLogNumber => { + if let Ok(ln) = reader.read_varint() { + ve.prev_log_number = Some(ln); + } else { + return err(StatusCode::IOError, "Couldn't read prevlognumber"); + } + } + EditTag::NextFileNumber => { if let Ok(nfn) = reader.read_varint() { ve.next_file_number = Some(nfn); @@ -262,7 +283,8 @@ } } } else { - return err(StatusCode::Corruption, "Invalid tag number"); + return err(StatusCode::Corruption, + &format!("Invalid tag number {}", tag)); } }
--- a/src/version_set.rs Tue Oct 10 07:49:01 2017 +0000 +++ b/src/version_set.rs Tue Oct 10 21:15:44 2017 +0200 @@ -172,6 +172,7 @@ pub manifest_num: u64, pub last_seq: u64, pub log_num: u64, + pub prev_log_num: u64, current: Option<Shared<Version>>, compaction_ptrs: [Vec<u8>; NUM_LEVELS], @@ -194,6 +195,7 @@ manifest_num: 0, last_seq: 0, log_num: 0, + prev_log_num: 0, current: Some(v), compaction_ptrs: Default::default(), @@ -462,6 +464,9 @@ assert!(edit.log_number.unwrap() >= self.log_num); assert!(edit.log_number.unwrap() < self.next_file_num); } + if edit.prev_log_number.is_none() { + edit.set_prev_log_num(self.prev_log_num); + } edit.set_next_file(self.next_file_num); edit.set_last_seq(self.last_seq); @@ -543,6 +548,7 @@ true); let mut log_number = None; + let mut prev_log_number = None; let mut next_file_number = None; let mut last_seq = None; @@ -562,6 +568,9 @@ if let Some(ls) = edit.last_seq { last_seq = Some(ls); } + if let Some(pln) = edit.prev_log_number { + prev_log_number = Some(pln); + } } if let Some(ln) = log_number { @@ -583,6 +592,12 @@ return err(StatusCode::Corruption, "no last-sequence entry in descriptor"); } + if let Some(pln) = prev_log_number { + self.prev_log_num = pln; + self.mark_file_number_used(prev_log_number.unwrap()); + } else { + self.prev_log_num = 0; + } } let mut v = Version::new(self.cache.clone(), self.opt.cmp.clone()); @@ -591,10 +606,12 @@ self.add_version(v); self.manifest_num = self.next_file_num - 1; log!(self.opt.log, - "Recovered manifest with next_file={} manifest_num={} log_num={} last_seq={}", + "Recovered manifest with next_file={} manifest_num={} log_num={} prev_log_num={} \ + last_seq={}", self.next_file_num, self.manifest_num, self.log_num, + self.prev_log_num, self.last_seq); // A new manifest needs to be written only if we don't reuse the existing one.