changeset 312:e2e8ce2a9434

db_impl tests: Add test utils for creating a filled database and triggering compactions.
author Lewin Bormann <lbo@spheniscida.de>
date Thu, 28 Sep 2017 20:44:14 +0200
parents dbecbde2d8a2
children e2a7eae0ce57
files src/db_impl.rs
diffstat 1 files changed, 75 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/src/db_impl.rs	Thu Sep 28 20:43:53 2017 +0200
+++ b/src/db_impl.rs	Thu Sep 28 20:44:14 2017 +0200
@@ -1051,6 +1051,81 @@
         }
     }
 
+    // compaction tests //
+
+    /// build_db creates a database filled with the tables created by make_version().
+    fn build_db() -> DB {
+        let name = "db";
+        let (v, opt) = make_version();
+        let mut ve = VersionEdit::new();
+        ve.set_comparator_name(opt.cmp.id());
+        ve.set_log_num(0);
+        // 9 files + 1 manifest we write below.
+        ve.set_next_file(11);
+        // 26 entries in these tables.
+        ve.set_last_seq(26);
+
+        for l in 0..NUM_LEVELS {
+            for f in &v.files[l] {
+                ve.add_file(l, f.borrow().clone());
+            }
+        }
+
+        let manifest = manifest_file_name(name, 11);
+        let manifest_file = opt.env.open_writable_file(Path::new(&manifest)).unwrap();
+        let mut lw = LogWriter::new(manifest_file);
+        lw.add_record(&ve.encode()).unwrap();
+        lw.flush().unwrap();
+        set_current_file(&opt.env, name, 11).unwrap();
+
+        DB::open(name, opt).unwrap()
+    }
+
+    /// set_file_to_compact ensures that the specified table file will be compacted next.
+    fn set_file_to_compact(db: &mut DB, num: FileNum) {
+        let vset = db.vset.current();
+        let mut v = vset.borrow_mut();
+
+        let mut ftc = None;
+        for l in 0..NUM_LEVELS {
+            for f in &v.files[l] {
+                if f.borrow().num == num {
+                    ftc = Some((f.clone(), l));
+                }
+            }
+        }
+        if let Some((f, l)) = ftc {
+            v.file_to_compact = Some(f);
+            v.file_to_compact_lvl = l;
+        } else {
+            panic!("file number not found");
+        }
+    }
+
+    #[allow(unused_variables)]
+    #[test]
+    fn test_db_impl_build_db_sanity() {
+        let db = build_db();
+        let env = &db.opt.env;
+        let name = &db.name;
+
+        assert!(env.exists(Path::new(&log_file_name(name, 12))).unwrap());
+    }
+
+    #[test]
+    fn test_db_impl_compact_single_file() {
+        let mut db = build_db();
+        set_file_to_compact(&mut db, 4);
+        db.maybe_do_compaction().unwrap();
+
+        let env = &db.opt.env;
+        let name = &db.name;
+        assert!(!env.exists(Path::new(&table_file_name(name, 3))).unwrap());
+        assert!(!env.exists(Path::new(&table_file_name(name, 4))).unwrap());
+        assert!(!env.exists(Path::new(&table_file_name(name, 5))).unwrap());
+        assert!(env.exists(Path::new(&table_file_name(name, 13))).unwrap());
+    }
+
     #[test]
     fn test_db_impl_memtable_compaction() {
         let mut opt = options::for_test();