Unverified Commit e2e4ac24 authored by Huachao Huang's avatar Huachao Huang Committed by GitHub

metadata: fix lifetime (#222)

parent f7205e63
...@@ -32,7 +32,7 @@ impl ColumnFamilyMetaData { ...@@ -32,7 +32,7 @@ impl ColumnFamilyMetaData {
let n = crocksdb_ffi::crocksdb_column_family_meta_data_level_count(self.inner); let n = crocksdb_ffi::crocksdb_column_family_meta_data_level_count(self.inner);
for i in 0..n { for i in 0..n {
let data = crocksdb_ffi::crocksdb_column_family_meta_data_level_data(self.inner, i); let data = crocksdb_ffi::crocksdb_column_family_meta_data_level_data(self.inner, i);
levels.push(LevelMetaData { inner: data }); levels.push(LevelMetaData::from_ptr(data, self));
} }
} }
levels levels
...@@ -47,29 +47,45 @@ impl Drop for ColumnFamilyMetaData { ...@@ -47,29 +47,45 @@ impl Drop for ColumnFamilyMetaData {
} }
} }
pub struct LevelMetaData { pub struct LevelMetaData<'a> {
inner: *const DBLevelMetaData, inner: *const DBLevelMetaData,
_mark: &'a ColumnFamilyMetaData,
} }
impl LevelMetaData { impl<'a> LevelMetaData<'a> {
pub fn get_files(&self) -> Vec<SstFileMetaData> { pub fn from_ptr(
inner: *const DBLevelMetaData,
_mark: &'a ColumnFamilyMetaData,
) -> LevelMetaData {
LevelMetaData { inner, _mark }
}
pub fn get_files(&self) -> Vec<SstFileMetaData<'a>> {
let mut files = Vec::new(); let mut files = Vec::new();
unsafe { unsafe {
let n = crocksdb_ffi::crocksdb_level_meta_data_file_count(self.inner); let n = crocksdb_ffi::crocksdb_level_meta_data_file_count(self.inner);
for i in 0..n { for i in 0..n {
let data = crocksdb_ffi::crocksdb_level_meta_data_file_data(self.inner, i); let data = crocksdb_ffi::crocksdb_level_meta_data_file_data(self.inner, i);
files.push(SstFileMetaData { inner: data }); files.push(SstFileMetaData::from_ptr(data, self._mark));
} }
} }
files files
} }
} }
pub struct SstFileMetaData { pub struct SstFileMetaData<'a> {
inner: *const DBSstFileMetaData, inner: *const DBSstFileMetaData,
_mark: &'a ColumnFamilyMetaData,
} }
impl SstFileMetaData { impl<'a> SstFileMetaData<'a> {
pub fn from_ptr(
inner: *const DBSstFileMetaData,
_mark: &'a ColumnFamilyMetaData,
) -> SstFileMetaData {
SstFileMetaData { inner, _mark }
}
pub fn get_size(&self) -> usize { pub fn get_size(&self) -> usize {
unsafe { crocksdb_ffi::crocksdb_sst_file_meta_data_size(self.inner) } unsafe { crocksdb_ffi::crocksdb_sst_file_meta_data_size(self.inner) }
} }
......
...@@ -2454,8 +2454,7 @@ mod test { ...@@ -2454,8 +2454,7 @@ mod test {
db1.put(b"k2", b"v2").unwrap(); db1.put(b"k2", b"v2").unwrap();
db1.flush(true).unwrap(); db1.flush(true).unwrap();
db1.compact_range(None, None); db1.compact_range(None, None);
}) }).unwrap();
.unwrap();
// Wait until all currently running background processes finish. // Wait until all currently running background processes finish.
db.pause_bg_work(); db.pause_bg_work();
assert_eq!( assert_eq!(
......
...@@ -101,35 +101,24 @@ fn test_compact_range_bottommost_level_compaction() { ...@@ -101,35 +101,24 @@ fn test_compact_range_bottommost_level_compaction() {
compact_opts.set_target_level(bottommost_level); compact_opts.set_target_level(bottommost_level);
db.compact_range_cf_opt(cf_handle, &compact_opts, None, None); db.compact_range_cf_opt(cf_handle, &compact_opts, None, None);
let bottommost_files = db let metadata = db.get_column_family_meta_data(cf_handle);
.get_column_family_meta_data(cf_handle) let bottommost_files = metadata.get_levels().last().unwrap().get_files();
.get_levels()
.last()
.unwrap()
.get_files();
assert_eq!(bottommost_files.len(), 1); assert_eq!(bottommost_files.len(), 1);
let bottommost_filename = bottommost_files[0].get_name(); let bottommost_filename = bottommost_files[0].get_name();
// Skip bottommost level compaction // Skip bottommost level compaction
compact_opts.set_bottommost_level_compaction(DBBottommostLevelCompaction::Skip); compact_opts.set_bottommost_level_compaction(DBBottommostLevelCompaction::Skip);
db.compact_range_cf_opt(cf_handle, &compact_opts, None, None); db.compact_range_cf_opt(cf_handle, &compact_opts, None, None);
let bottommost_files = db let metadata = db.get_column_family_meta_data(cf_handle);
.get_column_family_meta_data(cf_handle) let bottommost_files = metadata.get_levels().last().unwrap().get_files();
.get_levels()
.last()
.unwrap()
.get_files();
assert_eq!(bottommost_files.len(), 1); assert_eq!(bottommost_files.len(), 1);
assert_eq!(bottommost_filename, bottommost_files[0].get_name()); assert_eq!(bottommost_filename, bottommost_files[0].get_name());
// Force bottommost level compaction // Force bottommost level compaction
compact_opts.set_bottommost_level_compaction(DBBottommostLevelCompaction::Force); compact_opts.set_bottommost_level_compaction(DBBottommostLevelCompaction::Force);
db.compact_range_cf_opt(cf_handle, &compact_opts, None, None); db.compact_range_cf_opt(cf_handle, &compact_opts, None, None);
let bottommost_files = db let metadata = db.get_column_family_meta_data(cf_handle);
.get_column_family_meta_data(cf_handle) let bottommost_files = metadata.get_levels().last().unwrap().get_files();
.get_levels()
.last()
.unwrap()
.get_files();
assert_eq!(bottommost_files.len(), 1); assert_eq!(bottommost_files.len(), 1);
assert_ne!(bottommost_filename, bottommost_files[0].get_name()); assert_ne!(bottommost_filename, bottommost_files[0].get_name());
} }
...@@ -52,8 +52,7 @@ fn test_compaction_filter() { ...@@ -52,8 +52,7 @@ fn test_compaction_filter() {
drop_called: drop_called.clone(), drop_called: drop_called.clone(),
filtered_kvs: filtered_kvs.clone(), filtered_kvs: filtered_kvs.clone(),
}), }),
) ).unwrap();
.unwrap();
let mut opts = DBOptions::new(); let mut opts = DBOptions::new();
opts.create_if_missing(true); opts.create_if_missing(true);
let db = DB::open_cf( let db = DB::open_cf(
...@@ -92,8 +91,7 @@ fn test_compaction_filter() { ...@@ -92,8 +91,7 @@ fn test_compaction_filter() {
drop_called: drop_called.clone(), drop_called: drop_called.clone(),
filtered_kvs: filtered_kvs.clone(), filtered_kvs: filtered_kvs.clone(),
}), }),
) ).unwrap();
.unwrap();
assert!(drop_called.load(Ordering::Relaxed)); assert!(drop_called.load(Ordering::Relaxed));
drop_called.store(false, Ordering::Relaxed); drop_called.store(false, Ordering::Relaxed);
{ {
......
...@@ -640,8 +640,7 @@ fn test_delete_range_prefix_bloom_case_1() { ...@@ -640,8 +640,7 @@ fn test_delete_range_prefix_bloom_case_1() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -715,8 +714,7 @@ fn test_delete_range_prefix_bloom_case_2() { ...@@ -715,8 +714,7 @@ fn test_delete_range_prefix_bloom_case_2() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -771,8 +769,7 @@ fn test_delete_range_prefix_bloom_case_2() { ...@@ -771,8 +769,7 @@ fn test_delete_range_prefix_bloom_case_2() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -808,8 +805,7 @@ fn test_delete_range_prefix_bloom_case_3() { ...@@ -808,8 +805,7 @@ fn test_delete_range_prefix_bloom_case_3() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -853,8 +849,7 @@ fn test_delete_range_prefix_bloom_case_3() { ...@@ -853,8 +849,7 @@ fn test_delete_range_prefix_bloom_case_3() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -904,8 +899,7 @@ fn test_delete_range_prefix_bloom_case_4() { ...@@ -904,8 +899,7 @@ fn test_delete_range_prefix_bloom_case_4() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -949,8 +943,7 @@ fn test_delete_range_prefix_bloom_case_4() { ...@@ -949,8 +943,7 @@ fn test_delete_range_prefix_bloom_case_4() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -1001,8 +994,7 @@ fn test_delete_range_prefix_bloom_case_5() { ...@@ -1001,8 +994,7 @@ fn test_delete_range_prefix_bloom_case_5() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -1044,8 +1036,7 @@ fn test_delete_range_prefix_bloom_case_5() { ...@@ -1044,8 +1036,7 @@ fn test_delete_range_prefix_bloom_case_5() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let db2 = DB::open_cf(opts, path_str, vec![(cf, cf_opts)]).unwrap(); let db2 = DB::open_cf(opts, path_str, vec![(cf, cf_opts)]).unwrap();
...@@ -1093,8 +1084,7 @@ fn test_delete_range_prefix_bloom_case_6() { ...@@ -1093,8 +1084,7 @@ fn test_delete_range_prefix_bloom_case_6() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -1138,8 +1128,7 @@ fn test_delete_range_prefix_bloom_case_6() { ...@@ -1138,8 +1128,7 @@ fn test_delete_range_prefix_bloom_case_6() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let db2 = DB::open_cf(opts, path_str, vec![(cf, cf_opts)]).unwrap(); let db2 = DB::open_cf(opts, path_str, vec![(cf, cf_opts)]).unwrap();
...@@ -1211,8 +1200,7 @@ fn test_delete_range_prefix_bloom_compact_case() { ...@@ -1211,8 +1200,7 @@ fn test_delete_range_prefix_bloom_compact_case() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let cf = "default"; let cf = "default";
...@@ -1256,8 +1244,7 @@ fn test_delete_range_prefix_bloom_compact_case() { ...@@ -1256,8 +1244,7 @@ fn test_delete_range_prefix_bloom_compact_case() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixSliceTransform", "FixedSuffixSliceTransform",
Box::new(FixedSuffixSliceTransform::new(3)), Box::new(FixedSuffixSliceTransform::new(3)),
) ).unwrap_or_else(|err| panic!(format!("{:?}", err)));
.unwrap_or_else(|err| panic!(format!("{:?}", err)));
// Create prefix bloom filter for memtable. // Create prefix bloom filter for memtable.
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let db2 = DB::open_cf(opts, path_str, vec![(cf, cf_opts)]).unwrap(); let db2 = DB::open_cf(opts, path_str, vec![(cf, cf_opts)]).unwrap();
......
...@@ -300,8 +300,7 @@ fn test_total_order_seek() { ...@@ -300,8 +300,7 @@ fn test_total_order_seek() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedPrefixTransform", "FixedPrefixTransform",
Box::new(FixedPrefixTransform { prefix_len: 2 }), Box::new(FixedPrefixTransform { prefix_len: 2 }),
) ).unwrap();
.unwrap();
// also create prefix bloom for memtable // also create prefix bloom for memtable
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
...@@ -387,8 +386,7 @@ fn test_fixed_suffix_seek() { ...@@ -387,8 +386,7 @@ fn test_fixed_suffix_seek() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedSuffixTransform", "FixedSuffixTransform",
Box::new(FixedSuffixTransform { suffix_len: 2 }), Box::new(FixedSuffixTransform { suffix_len: 2 }),
) ).unwrap();
.unwrap();
let db = DB::open_cf( let db = DB::open_cf(
opts, opts,
......
...@@ -62,8 +62,7 @@ fn test_prefix_extractor_compatibility() { ...@@ -62,8 +62,7 @@ fn test_prefix_extractor_compatibility() {
.set_prefix_extractor( .set_prefix_extractor(
"FixedPrefixTransform", "FixedPrefixTransform",
Box::new(FixedPrefixTransform { prefix_len: 2 }), Box::new(FixedPrefixTransform { prefix_len: 2 }),
) ).unwrap();
.unwrap();
// also create prefix bloom for memtable // also create prefix bloom for memtable
cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64); cf_opts.set_memtable_prefix_bloom_size_ratio(0.1 as f64);
let db = DB::open_cf( let db = DB::open_cf(
......
...@@ -123,8 +123,7 @@ fn test_memtable_insert_hint_prefix_extractor() { ...@@ -123,8 +123,7 @@ fn test_memtable_insert_hint_prefix_extractor() {
.set_memtable_insert_hint_prefix_extractor( .set_memtable_insert_hint_prefix_extractor(
"FixedPrefixTransform", "FixedPrefixTransform",
Box::new(FixedPrefixTransform { prefix_len: 2 }), Box::new(FixedPrefixTransform { prefix_len: 2 }),
) ).unwrap();
.unwrap();
let db = DB::open_cf( let db = DB::open_cf(
opts, opts,
path.path().to_str().unwrap(), path.path().to_str().unwrap(),
......
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