Unverified Commit 9cbbf5f8 authored by Huachao Huang's avatar Huachao Huang Committed by GitHub

add delete files in range with delete range test (#128)

parent f01a1b22
......@@ -33,3 +33,4 @@ path = "librocksdb_sys"
[dev-dependencies]
byteorder = "1.0.0"
rand = "0.3"
......@@ -2,6 +2,7 @@ extern crate byteorder;
extern crate crc;
extern crate rocksdb;
extern crate tempdir;
extern crate rand;
mod test_iterator;
mod test_multithreaded;
......
......@@ -11,6 +11,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
use rand::{self, Rng};
use rocksdb::*;
use tempdir::TempDir;
......@@ -100,3 +101,69 @@ fn test_delete_files_in_range_with_snap() {
// sst2 has been dropped.
assert_eq!(count, 6);
}
#[test]
fn test_delete_files_in_range_with_delete_range() {
// Regression test for https://github.com/facebook/rocksdb/issues/2833.
let path = TempDir::new("_rocksdb_test_delete_files_in_range_with_delete_range").expect("");
let path_str = path.path().to_str().unwrap();
let sst_size = 1 << 10;
let value_size = 8 << 10;
let mut opts = DBOptions::new();
opts.create_if_missing(true);
let mut cf_opts = ColumnFamilyOptions::new();
cf_opts.set_target_file_size_base(sst_size);
cf_opts.set_level_zero_file_num_compaction_trigger(10);
let db = DB::open_cf(opts, path_str, vec![("default", cf_opts)]).unwrap();
// Flush 5 files in level 0.
// File i will contain keys i and i+1.
for i in 0..5 {
let k1 = format!("{}", i);
let k2 = format!("{}", i + 1);
let mut v = vec![0; value_size];
rand::thread_rng().fill_bytes(&mut v);
db.put(k1.as_bytes(), v.as_slice()).unwrap();
db.put(k2.as_bytes(), v.as_slice()).unwrap();
db.flush(true).unwrap();
}
// Hold a snapshot to prevent the following delete range from dropping keys above.
let snapshot = db.snapshot();
db.delete_range(b"0", b"6").unwrap();
db.flush(true).unwrap();
// After this, we will have 3 files in level 1.
// File i will contain keys i and i+1, and the delete range [0, 6).
db.compact_range(None, None);
drop(snapshot);
// Before the fix, the file in the middle with keys 2 and 3 will be deleted,
// which can be a problem when we compact later. After the fix, no file will
// be deleted since they have an overlapped delete range [0, 6).
db.delete_file_in_range(b"1", b"4").unwrap();
// Flush a file with keys 4 and 5 to level 0.
for i in 4..5 {
let k1 = format!("{}", i);
let k2 = format!("{}", i + 1);
let mut v = vec![0; value_size];
rand::thread_rng().fill_bytes(&mut v);
db.put(k1.as_bytes(), v.as_slice()).unwrap();
db.put(k2.as_bytes(), v.as_slice()).unwrap();
db.flush(true).unwrap();
}
// After this, the delete range [0, 6) will drop all entries before it, so
// we should have only keys 4 and 5.
db.compact_range(None, None);
let mut it = db.iter();
it.seek(SeekKey::Start);
assert!(it.valid());
assert_eq!(it.key(), b"4");
assert!(it.next());
assert_eq!(it.key(), b"5");
assert!(!it.next());
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment