Unverified Commit 2f868cb7 authored by Huachao Huang's avatar Huachao Huang Committed by GitHub

*: add bottommost level compaction (#212)

Expose the bottommost level compaction option to make it more flexible.
parent 9a1c83c5
...@@ -138,6 +138,7 @@ using rocksdb::SstFileMetaData; ...@@ -138,6 +138,7 @@ using rocksdb::SstFileMetaData;
using rocksdb::CompactionOptions; using rocksdb::CompactionOptions;
using rocksdb::PerfLevel; using rocksdb::PerfLevel;
using rocksdb::PerfContext; using rocksdb::PerfContext;
using rocksdb::BottommostLevelCompaction;
using std::shared_ptr; using std::shared_ptr;
...@@ -3033,6 +3034,12 @@ void crocksdb_compactoptions_set_max_subcompactions( ...@@ -3033,6 +3034,12 @@ void crocksdb_compactoptions_set_max_subcompactions(
opt->rep.max_subcompactions = v; opt->rep.max_subcompactions = v;
} }
void crocksdb_compactoptions_set_bottommost_level_compaction(
crocksdb_compactoptions_t* opt,
int v) {
opt->rep.bottommost_level_compaction = static_cast<BottommostLevelCompaction>(v);
}
crocksdb_flushoptions_t* crocksdb_flushoptions_create() { crocksdb_flushoptions_t* crocksdb_flushoptions_create() {
return new crocksdb_flushoptions_t; return new crocksdb_flushoptions_t;
} }
......
...@@ -1234,6 +1234,8 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_compactoptions_set_target_level( ...@@ -1234,6 +1234,8 @@ extern C_ROCKSDB_LIBRARY_API void crocksdb_compactoptions_set_target_level(
crocksdb_compactoptions_t*, int); crocksdb_compactoptions_t*, int);
extern C_ROCKSDB_LIBRARY_API void extern C_ROCKSDB_LIBRARY_API void
crocksdb_compactoptions_set_max_subcompactions(crocksdb_compactoptions_t*, int); crocksdb_compactoptions_set_max_subcompactions(crocksdb_compactoptions_t*, int);
extern C_ROCKSDB_LIBRARY_API void
crocksdb_compactoptions_set_bottommost_level_compaction(crocksdb_compactoptions_t*, int);
/* Flush options */ /* Flush options */
......
...@@ -677,7 +677,7 @@ Compaction* CompactionPicker::CompactRange( ...@@ -677,7 +677,7 @@ Compaction* CompactionPicker::CompactRange(
mutable_cf_options.max_compaction_bytes, output_path_id, mutable_cf_options.max_compaction_bytes, output_path_id,
GetCompressionType(ioptions_, vstorage, mutable_cf_options, output_level, GetCompressionType(ioptions_, vstorage, mutable_cf_options, output_level,
vstorage->base_level()), vstorage->base_level()),
/* max_subcompactions */ 0, std::move(grandparents), max_subcompactions, std::move(grandparents),
/* is manual compaction */ true); /* is manual compaction */ true);
TEST_SYNC_POINT_CALLBACK("CompactionPicker::CompactRange:Return", compaction); TEST_SYNC_POINT_CALLBACK("CompactionPicker::CompactRange:Return", compaction);
......
...@@ -292,6 +292,18 @@ pub enum DBTableProperty { ...@@ -292,6 +292,18 @@ pub enum DBTableProperty {
CompressionName = 17, CompressionName = 17,
} }
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[repr(C)]
pub enum DBBottommostLevelCompaction {
// Skip bottommost level compaction
Skip = 0,
// Compact bottommost level if there is a compaction filter
// This is the default option
IfHaveCompactionFilter = 1,
// Force bottommost level compaction
Force = 2,
}
pub fn error_message(ptr: *mut c_char) -> String { pub fn error_message(ptr: *mut c_char) -> String {
let c_str = unsafe { CStr::from_ptr(ptr) }; let c_str = unsafe { CStr::from_ptr(ptr) };
let s = format!("{}", c_str.to_string_lossy()); let s = format!("{}", c_str.to_string_lossy());
...@@ -1021,6 +1033,10 @@ extern "C" { ...@@ -1021,6 +1033,10 @@ extern "C" {
pub fn crocksdb_compactoptions_set_change_level(opt: *mut DBCompactOptions, v: bool); pub fn crocksdb_compactoptions_set_change_level(opt: *mut DBCompactOptions, v: bool);
pub fn crocksdb_compactoptions_set_target_level(opt: *mut DBCompactOptions, v: i32); pub fn crocksdb_compactoptions_set_target_level(opt: *mut DBCompactOptions, v: i32);
pub fn crocksdb_compactoptions_set_max_subcompactions(opt: *mut DBCompactOptions, v: i32); pub fn crocksdb_compactoptions_set_max_subcompactions(opt: *mut DBCompactOptions, v: i32);
pub fn crocksdb_compactoptions_set_bottommost_level_compaction(
opt: *mut DBCompactOptions,
v: DBBottommostLevelCompaction,
);
pub fn crocksdb_fifo_compaction_options_create() -> *mut DBFifoCompactionOptions; pub fn crocksdb_fifo_compaction_options_create() -> *mut DBFifoCompactionOptions;
pub fn crocksdb_fifo_compaction_options_set_max_table_files_size( pub fn crocksdb_fifo_compaction_options_set_max_table_files_size(
......
...@@ -37,8 +37,9 @@ mod table_properties_collector_factory; ...@@ -37,8 +37,9 @@ mod table_properties_collector_factory;
pub use compaction_filter::CompactionFilter; pub use compaction_filter::CompactionFilter;
pub use event_listener::{CompactionJobInfo, EventListener, FlushJobInfo, IngestionInfo}; pub use event_listener::{CompactionJobInfo, EventListener, FlushJobInfo, IngestionInfo};
pub use librocksdb_sys::{self as crocksdb_ffi, new_bloom_filter, CompactionPriority, pub use librocksdb_sys::{self as crocksdb_ffi, new_bloom_filter, CompactionPriority,
DBCompactionStyle, DBCompressionType, DBEntryType, DBInfoLogLevel, DBBottommostLevelCompaction, DBCompactionStyle, DBCompressionType,
DBRecoveryMode, DBStatisticsHistogramType, DBStatisticsTickerType}; DBEntryType, DBInfoLogLevel, DBRecoveryMode, DBStatisticsHistogramType,
DBStatisticsTickerType};
pub use merge_operator::MergeOperands; pub use merge_operator::MergeOperands;
pub use metadata::{ColumnFamilyMetaData, LevelMetaData, SstFileMetaData}; pub use metadata::{ColumnFamilyMetaData, LevelMetaData, SstFileMetaData};
pub use perf_context::{get_perf_level, set_perf_level, PerfContext, PerfLevel}; pub use perf_context::{get_perf_level, set_perf_level, PerfContext, PerfLevel};
......
...@@ -15,11 +15,11 @@ ...@@ -15,11 +15,11 @@
use compaction_filter::{new_compaction_filter, CompactionFilter, CompactionFilterHandle}; use compaction_filter::{new_compaction_filter, CompactionFilter, CompactionFilterHandle};
use comparator::{self, compare_callback, ComparatorCallback}; use comparator::{self, compare_callback, ComparatorCallback};
use crocksdb_ffi::{self, DBBlockBasedTableOptions, DBCompactOptions, DBCompactionOptions, use crocksdb_ffi::{self, DBBlockBasedTableOptions, DBBottommostLevelCompaction, DBCompactOptions,
DBCompressionType, DBFifoCompactionOptions, DBFlushOptions, DBInfoLogLevel, DBCompactionOptions, DBCompressionType, DBFifoCompactionOptions,
DBInstance, DBRateLimiter, DBReadOptions, DBRecoveryMode, DBRestoreOptions, DBFlushOptions, DBInfoLogLevel, DBInstance, DBRateLimiter, DBReadOptions,
DBSnapshot, DBStatisticsHistogramType, DBStatisticsTickerType, DBWriteOptions, DBRecoveryMode, DBRestoreOptions, DBSnapshot, DBStatisticsHistogramType,
Options}; DBStatisticsTickerType, DBWriteOptions, Options};
use event_listener::{new_event_listener, EventListener}; use event_listener::{new_event_listener, EventListener};
use libc::{self, c_double, c_int, c_uchar, c_void, size_t}; use libc::{self, c_double, c_int, c_uchar, c_void, size_t};
use merge_operator::MergeFn; use merge_operator::MergeFn;
...@@ -487,6 +487,12 @@ impl CompactOptions { ...@@ -487,6 +487,12 @@ impl CompactOptions {
crocksdb_ffi::crocksdb_compactoptions_set_max_subcompactions(self.inner, v); crocksdb_ffi::crocksdb_compactoptions_set_max_subcompactions(self.inner, v);
} }
} }
pub fn set_bottommost_level_compaction(&mut self, v: DBBottommostLevelCompaction) {
unsafe {
crocksdb_ffi::crocksdb_compactoptions_set_bottommost_level_compaction(self.inner, v);
}
}
} }
impl Drop for CompactOptions { impl Drop for CompactOptions {
......
...@@ -11,7 +11,8 @@ ...@@ -11,7 +11,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use rocksdb::{ColumnFamilyOptions, CompactOptions, DBOptions, Range, Writable, DB}; use rocksdb::{ColumnFamilyOptions, CompactOptions, DBBottommostLevelCompaction, DBOptions, Range,
Writable, DB};
use tempdir::TempDir; use tempdir::TempDir;
#[test] #[test]
...@@ -78,3 +79,52 @@ fn test_compact_range_change_level() { ...@@ -78,3 +79,52 @@ fn test_compact_range_change_level() {
let name = format!("rocksdb.num-files-at-level{}", compact_level); let name = format!("rocksdb.num-files-at-level{}", compact_level);
assert_eq!(db.get_property_int(&name).unwrap(), samples.len() as u64); assert_eq!(db.get_property_int(&name).unwrap(), samples.len() as u64);
} }
#[test]
fn test_compact_range_bottommost_level_compaction() {
let path = TempDir::new("test_compact_range_bottommost_level_compaction").expect("");
let mut opts = DBOptions::new();
opts.create_if_missing(true);
let db = DB::open(opts, path.path().to_str().unwrap()).unwrap();
db.put(&[0], &[0]).unwrap();
db.flush(true).unwrap();
// Compact to bottommost level
let cf_handle = db.cf_handle("default").unwrap();
let cf_opts = db.get_options_cf(cf_handle);
let bottommost_level = (cf_opts.get_num_levels() - 1) as i32;
let mut compact_opts = CompactOptions::new();
compact_opts.set_change_level(true);
compact_opts.set_target_level(bottommost_level);
db.compact_range_cf_opt(cf_handle, &compact_opts, None, None);
let bottommost_files = db.get_column_family_meta_data(cf_handle)
.get_levels()
.last()
.unwrap()
.get_files();
assert_eq!(bottommost_files.len(), 1);
let bottommost_filename = bottommost_files[0].get_name();
// Skip bottommost level compaction
compact_opts.set_bottommost_level_compaction(DBBottommostLevelCompaction::Skip);
db.compact_range_cf_opt(cf_handle, &compact_opts, None, None);
let bottommost_files = db.get_column_family_meta_data(cf_handle)
.get_levels()
.last()
.unwrap()
.get_files();
assert_eq!(bottommost_files.len(), 1);
assert_eq!(bottommost_filename, bottommost_files[0].get_name());
// Force bottommost level compaction
compact_opts.set_bottommost_level_compaction(DBBottommostLevelCompaction::Force);
db.compact_range_cf_opt(cf_handle, &compact_opts, None, None);
let bottommost_files = db.get_column_family_meta_data(cf_handle)
.get_levels()
.last()
.unwrap()
.get_files();
assert_eq!(bottommost_files.len(), 1);
assert_ne!(bottommost_filename, bottommost_files[0].get_name());
}
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