Mercurial > lbo > hg > leveldb-rs
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(¤t_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(¤t_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); {