changeset 281:fe30cd47b37d

version_set: Implement read_current_file
author Lewin Bormann <lbo@spheniscida.de>
date Mon, 25 Sep 2017 20:30:46 +0200
parents 71dbb70bc4e4
children 90db3ae63a17
files src/version_set.rs
diffstat 1 files changed, 22 insertions(+), 24 deletions(-) [+]
line wrap: on
line diff
--- a/src/version_set.rs	Sun Sep 24 14:16:50 2017 +0200
+++ b/src/version_set.rs	Mon Sep 25 20:30:46 2017 +0200
@@ -238,7 +238,7 @@
         }
     }
 
-    fn mark_file_number_used(&mut self, n: FileNum) {
+    pub fn mark_file_number_used(&mut self, n: FileNum) {
         if self.next_file_num <= n {
             self.next_file_num = n + 1;
         }
@@ -524,23 +524,12 @@
 
     /// recover recovers the state of a LevelDB instance from the files on disk. If recover()
     /// returns true, proceed with calling log_and_apply().
-    fn recover(&mut self) -> Result<bool> {
+    pub fn recover(&mut self) -> Result<bool> {
         assert!(self.current.is_some());
 
-        let mut current = String::new();
-        {
-            let mut f =
-                self.opt.env.open_sequential_file(Path::new(&current_file_name(&self.dbname)))?;
-            f.read_to_string(&mut current)?;
-        }
-        if current.is_empty() || !current.ends_with('\n') {
-            return err(StatusCode::Corruption,
-                       "current file is empty or has no newline");
-        }
-        {
-            let len = current.len();
-            current.truncate(len - 1);
-        }
+        let mut current = read_current_file(&self.opt.env, &self.dbname)?;
+        let len = current.len();
+        current.truncate(len - 1);
 
         let descfilename = format!("{}/{}", self.dbname, current);
         let mut builder = Builder::new();
@@ -548,9 +537,7 @@
             let mut descfile = self.opt.env.open_sequential_file(Path::new(&descfilename))?;
             let mut logreader = LogReader::new(&mut descfile,
                                                // checksum=
-                                               true,
-                                               // offset=
-                                               0);
+                                               true);
 
             let mut log_number = None;
             let mut next_file_number = None;
@@ -593,8 +580,6 @@
                 return err(StatusCode::Corruption,
                            "no last-sequence entry in descriptor");
             }
-
-            self.mark_file_number_used(1);
         }
 
         let mut v = Version::new(self.cache.clone(), self.opt.cmp.clone());
@@ -608,6 +593,9 @@
 
     /// reuse_manifest checks whether the current manifest can be reused.
     fn reuse_manifest(&mut self, current_manifest_path: &str, current_manifest_base: &str) -> bool {
+        if !self.opt.reuse_manifest {
+            return false;
+        }
         // The original doesn't reuse manifests; we do.
         if let Ok((num, typ)) = parse_file_name(current_manifest_base) {
             if typ != FileType::Descriptor {
@@ -630,7 +618,6 @@
                 return true;
             } else {
                 log!(self.opt.log, "reuse_manifest: {}", s.err().unwrap());
-                return false;
             }
         }
         false
@@ -770,7 +757,7 @@
     format!("MANIFEST-{:06}", file_num)
 }
 
-fn manifest_file_name(dbname: &str, file_num: FileNum) -> String {
+pub fn manifest_file_name(dbname: &str, file_num: FileNum) -> String {
     format!("{}/{}", dbname, manifest_name(file_num))
 }
 
@@ -782,7 +769,18 @@
     format!("{}/CURRENT", dbname)
 }
 
-fn set_current_file(env: &Box<Env>, dbname: &str, manifest_file_num: FileNum) -> Result<()> {
+pub fn read_current_file(env: &Box<Env>, dbname: &str) -> Result<String> {
+    let mut current = String::new();
+    let mut f = env.open_sequential_file(Path::new(&current_file_name(dbname)))?;
+    f.read_to_string(&mut current)?;
+    if current.is_empty() || !current.ends_with('\n') {
+        return err(StatusCode::Corruption,
+                   "current file is empty or has no newline");
+    }
+    Ok(current)
+}
+
+pub fn set_current_file(env: &Box<Env>, dbname: &str, manifest_file_num: FileNum) -> Result<()> {
     let manifest_base = manifest_name(manifest_file_num);
     let tempfile = temp_file_name(dbname, manifest_file_num);
     {