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.