@ -19,95 +19,106 @@ class CountingLogger : public Logger {
class CompactionPickerTest {
public :
const Comparator * ucmp ;
InternalKeyComparator icmp ;
Options options ;
ImmutableCFOptions ioptions ;
MutableCFOptions mutable_cf_options ;
const Comparator * ucmp_ ;
InternalKeyComparator icmp_ ;
Options options_ ;
ImmutableCFOptions ioptions_ ;
MutableCFOptions mutable_cf_options_ ;
LevelCompactionPicker level_compaction_picker ;
std : : string cf_name ;
CountingLogger logger ;
LogBuffer log_buffer ;
VersionStorageInfo vstorage ;
uint32_t file_num ;
CompactionOptionsFIFO fifo_options ;
std : : vector < uint64_t > size_being_compacted ;
std : : string cf_name_ ;
CountingLogger logger_ ;
LogBuffer log_buffer_ ;
uint32_t file_num_ ;
CompactionOptionsFIFO fifo_options_ ;
std : : vector < uint64_t > size_being_compacted_ ;
std : : unique_ptr < VersionStorageInfo > vstorage_ ;
std : : vector < std : : unique_ptr < FileMetaData > > files_ ;
CompactionPickerTest ( )
: ucmp ( BytewiseComparator ( ) ) ,
icmp ( ucmp ) ,
ioptions ( options ) ,
mutable_cf_options ( options , ioptions ) ,
level_compaction_picker ( ioptions , & icmp ) ,
cf_name ( " dummy " ) ,
log_buffer ( InfoLogLevel : : INFO_LEVEL , & logger ) ,
vstorage ( & icmp , ucmp , options . num_levels , kCompactionStyleLevel ,
nullptr ) ,
file_num ( 1 ) {
fifo_options . max_table_files_size = 1 ;
mutable_cf_options . RefreshDerivedOptions ( ioptions ) ;
size_being_compacted . resize ( options . num_levels ) ;
: ucmp_ ( BytewiseComparator ( ) ) ,
icmp_ ( ucmp_ ) ,
ioptions_ ( options_ ) ,
mutable_cf_options_ ( options_ , ioptions_ ) ,
level_compaction_picker ( ioptions_ , & icmp_ ) ,
cf_name_ ( " dummy " ) ,
log_buffer_ ( InfoLogLevel : : INFO_LEVEL , & logger_ ) ,
file_num_ ( 1 ) ,
vstorage_ ( nullptr ) {
fifo_options_ . max_table_files_size = 1 ;
mutable_cf_options_ . RefreshDerivedOptions ( ioptions_ ) ;
size_being_compacted_ . resize ( options_ . num_levels ) ;
}
~ CompactionPickerTest ( ) {
for ( int i = 0 ; i < vstorage . num_levels ( ) ; i + + ) {
for ( auto * f : vstorage . LevelFiles ( i ) ) {
delete f ;
}
void NewVersionStorage ( int num_levels , CompactionStyle style ) {
DeleteVersionStorage ( ) ;
options_ . num_levels = num_levels ;
vstorage_ . reset ( new VersionStorageInfo (
& icmp_ , ucmp_ , options_ . num_levels , style , nullptr ) ) ;
}
void DeleteVersionStorage ( ) {
vstorage_ . reset ( ) ;
files_ . clear ( ) ;
}
void Add ( int level , uint32_t file_number , const char * smallest ,
const char * largest , uint64_t file_size = 0 , uint32_t path_id = 0 ,
SequenceNumber smallest_seq = 100 ,
SequenceNumber largest_seq = 100 ) {
assert ( level < vstorage . num_levels ( ) ) ;
assert ( level < vstorage_ - > num_levels ( ) ) ;
FileMetaData * f = new FileMetaData ;
f - > fd = FileDescriptor ( file_number , path_id , file_size ) ;
f - > smallest = InternalKey ( smallest , smallest_seq , kTypeValue ) ;
f - > largest = InternalKey ( largest , largest_seq , kTypeValue ) ;
f - > compensated_file_size = file_size ;
f - > refs = 0 ;
vstorage . MaybeAddFile ( level , f ) ;
vstorage_ - > AddFile ( level , f ) ;
files_ . emplace_back ( f ) ;
}
void UpdateVersionStorageInfo ( ) {
vstorage . ComputeCompactionScore ( mutable_cf_options , fifo_options ,
size_being_compacted ) ;
vstorage . UpdateFilesBySize ( ) ;
vstorage . UpdateNumNonEmptyLevels ( ) ;
vstorage . GenerateFileIndexer ( ) ;
vstorage . GenerateLevelFilesBrief ( ) ;
vstorage . SetFinalized ( ) ;
vstorage_ - > ComputeCompactionScore ( mutable_cf_options_ , fifo_options_ ,
size_being_compacted_ ) ;
vstorage_ - > UpdateFilesBySize ( ) ;
vstorage_ - > UpdateNumNonEmptyLevels ( ) ;
vstorage_ - > GenerateFileIndexer ( ) ;
vstorage_ - > GenerateLevelFilesBrief ( ) ;
vstorage_ - > SetFinalized ( ) ;
}
} ;
TEST ( CompactionPickerTest , Empty ) {
NewVersionStorage ( 6 , kCompactionStyleLevel ) ;
UpdateVersionStorageInfo ( ) ;
std : : unique_ptr < Compaction > compaction ( level_compaction_picker . PickCompaction (
cf_name , mutable_cf_options , & vstorage , & log_buffer ) ) ;
cf_name_ , mutable_cf_options_ , vstorage_ . get ( ) , & log_buffer_ ) ) ;
ASSERT_TRUE ( compaction . get ( ) = = nullptr ) ;
}
TEST ( CompactionPickerTest , Single ) {
mutable_cf_options . level0_file_num_compaction_trigger = 2 ;
NewVersionStorage ( 6 , kCompactionStyleLevel ) ;
mutable_cf_options_ . level0_file_num_compaction_trigger = 2 ;
Add ( 0 , 1U , " p " , " q " ) ;
UpdateVersionStorageInfo ( ) ;
std : : unique_ptr < Compaction > compaction ( level_compaction_picker . PickCompaction (
cf_name , mutable_cf_options , & vstorage , & log_buffer ) ) ;
cf_name_ , mutable_cf_options_ , vstorage_ . get ( ) , & log_buffer_ ) ) ;
ASSERT_TRUE ( compaction . get ( ) = = nullptr ) ;
}
TEST ( CompactionPickerTest , Level0Trigger ) {
mutable_cf_options . level0_file_num_compaction_trigger = 2 ;
NewVersionStorage ( 6 , kCompactionStyleLevel ) ;
mutable_cf_options_ . level0_file_num_compaction_trigger = 2 ;
Add ( 0 , 1U , " 150 " , " 200 " ) ;
Add ( 0 , 2U , " 200 " , " 250 " ) ;
UpdateVersionStorageInfo ( ) ;
std : : unique_ptr < Compaction > compaction ( level_compaction_picker . PickCompaction (
cf_name , mutable_cf_options , & vstorage , & log_buffer ) ) ;
cf_name_ , mutable_cf_options_ , vstorage_ . get ( ) , & log_buffer_ ) ) ;
ASSERT_TRUE ( compaction . get ( ) ! = nullptr ) ;
ASSERT_EQ ( 2U , compaction - > num_input_files ( 0 ) ) ;
ASSERT_EQ ( 1U , compaction - > input ( 0 , 0 ) - > fd . GetNumber ( ) ) ;
@ -115,17 +126,19 @@ TEST(CompactionPickerTest, Level0Trigger) {
}
TEST ( CompactionPickerTest , Level1Trigger ) {
NewVersionStorage ( 6 , kCompactionStyleLevel ) ;
Add ( 1 , 66U , " 150 " , " 200 " , 1000000000U ) ;
UpdateVersionStorageInfo ( ) ;
std : : unique_ptr < Compaction > compaction ( level_compaction_picker . PickCompaction (
cf_name , mutable_cf_options , & vstorage , & log_buffer ) ) ;
cf_name_ , mutable_cf_options_ , vstorage_ . get ( ) , & log_buffer_ ) ) ;
ASSERT_TRUE ( compaction . get ( ) ! = nullptr ) ;
ASSERT_EQ ( 1U , compaction - > num_input_files ( 0 ) ) ;
ASSERT_EQ ( 66U , compaction - > input ( 0 , 0 ) - > fd . GetNumber ( ) ) ;
}
TEST ( CompactionPickerTest , Level1Trigger2 ) {
NewVersionStorage ( 6 , kCompactionStyleLevel ) ;
Add ( 1 , 66U , " 150 " , " 200 " , 1000000001U ) ;
Add ( 1 , 88U , " 201 " , " 300 " , 1000000000U ) ;
Add ( 2 , 6U , " 150 " , " 179 " , 1000000000U ) ;
@ -134,7 +147,7 @@ TEST(CompactionPickerTest, Level1Trigger2) {
UpdateVersionStorageInfo ( ) ;
std : : unique_ptr < Compaction > compaction ( level_compaction_picker . PickCompaction (
cf_name , mutable_cf_options , & vstorage , & log_buffer ) ) ;
cf_name_ , mutable_cf_options_ , vstorage_ . get ( ) , & log_buffer_ ) ) ;
ASSERT_TRUE ( compaction . get ( ) ! = nullptr ) ;
ASSERT_EQ ( 1U , compaction - > num_input_files ( 0 ) ) ;
ASSERT_EQ ( 2U , compaction - > num_input_files ( 1 ) ) ;
@ -144,8 +157,9 @@ TEST(CompactionPickerTest, Level1Trigger2) {
}
TEST ( CompactionPickerTest , LevelMaxScore ) {
mutable_cf_options . target_file_size_base = 10000000 ;
mutable_cf_options . target_file_size_multiplier = 10 ;
NewVersionStorage ( 6 , kCompactionStyleLevel ) ;
mutable_cf_options_ . target_file_size_base = 10000000 ;
mutable_cf_options_ . target_file_size_multiplier = 10 ;
Add ( 0 , 1U , " 150 " , " 200 " , 1000000000U ) ;
// Level 1 score 1.2
Add ( 1 , 66U , " 150 " , " 200 " , 6000000U ) ;
@ -162,12 +176,90 @@ TEST(CompactionPickerTest, LevelMaxScore) {
UpdateVersionStorageInfo ( ) ;
std : : unique_ptr < Compaction > compaction ( level_compaction_picker . PickCompaction (
cf_name , mutable_cf_options , & vstorage , & log_buffer ) ) ;
cf_name_ , mutable_cf_options_ , vstorage_ . get ( ) , & log_buffer_ ) ) ;
ASSERT_TRUE ( compaction . get ( ) ! = nullptr ) ;
ASSERT_EQ ( 1U , compaction - > num_input_files ( 0 ) ) ;
ASSERT_EQ ( 7U , compaction - > input ( 0 , 0 ) - > fd . GetNumber ( ) ) ;
}
TEST ( CompactionPickerTest , NeedsCompactionLevel ) {
const int kLevels = 6 ;
const int kFileCount = 20 ;
for ( int level = 0 ; level < kLevels - 1 ; + + level ) {
uint64_t file_size =
mutable_cf_options_ . MaxBytesForLevel ( level ) * 2 / kFileCount ;
for ( int file_count = 1 ; file_count < = kFileCount ; + + file_count ) {
// start a brand new version in each test.
NewVersionStorage ( kLevels , kCompactionStyleLevel ) ;
for ( int i = 0 ; i < file_count ; + + i ) {
Add ( level , i , std : : to_string ( ( i + 100 ) * 1000 ) . c_str ( ) ,
std : : to_string ( ( i + 100 ) * 1000 + 999 ) . c_str ( ) ,
file_size , 0 , i * 100 , i * 100 + 99 ) ;
}
UpdateVersionStorageInfo ( ) ;
ASSERT_EQ ( vstorage_ - > CompactionScoreLevel ( 0 ) , level ) ;
ASSERT_EQ ( level_compaction_picker . NeedsCompaction (
vstorage_ . get ( ) , mutable_cf_options_ ) ,
vstorage_ - > CompactionScore ( 0 ) > = 1 ) ;
// release the version storage
DeleteVersionStorage ( ) ;
}
}
}
TEST ( CompactionPickerTest , NeedsCompactionUniversal ) {
NewVersionStorage ( 1 , kCompactionStyleUniversal ) ;
UniversalCompactionPicker universal_compaction_picker (
ioptions_ , & icmp_ ) ;
// must return false when there's no files.
ASSERT_EQ ( universal_compaction_picker . NeedsCompaction (
vstorage_ . get ( ) , mutable_cf_options_ ) , false ) ;
// verify the trigger given different number of L0 files.
for ( int i = 1 ;
i < = mutable_cf_options_ . level0_file_num_compaction_trigger * 2 ;
+ + i ) {
Add ( 0 , i , std : : to_string ( ( i + 100 ) * 1000 ) . c_str ( ) ,
std : : to_string ( ( i + 100 ) * 1000 + 999 ) . c_str ( ) ,
1000000 , 0 , i * 100 , i * 100 + 99 ) ;
ASSERT_EQ (
universal_compaction_picker . NeedsCompaction (
vstorage_ . get ( ) , mutable_cf_options_ ) ,
i > = mutable_cf_options_ . level0_file_num_compaction_trigger ) ;
}
}
TEST ( CompactionPickerTest , NeedsCompactionFIFO ) {
NewVersionStorage ( 1 , kCompactionStyleFIFO ) ;
const int kFileCount =
mutable_cf_options_ . level0_file_num_compaction_trigger * 3 ;
const uint64_t kFileSize = 100000 ;
const uint64_t kMaxSize = kFileSize * kFileCount / 2 ;
fifo_options_ . max_table_files_size = kMaxSize ;
ioptions_ . compaction_options_fifo = fifo_options_ ;
FIFOCompactionPicker fifo_compaction_picker ( ioptions_ , & icmp_ ) ;
// must return false when there's no files.
ASSERT_EQ ( fifo_compaction_picker . NeedsCompaction (
vstorage_ . get ( ) , mutable_cf_options_ ) , false ) ;
// verify whether compaction is needed based on the current
// size of L0 files.
uint64_t current_size = 0 ;
for ( int i = 1 ; i < = kFileCount ; + + i ) {
Add ( 0 , i , std : : to_string ( ( i + 100 ) * 1000 ) . c_str ( ) ,
std : : to_string ( ( i + 100 ) * 1000 + 999 ) . c_str ( ) ,
kFileSize , 0 , i * 100 , i * 100 + 99 ) ;
current_size + = kFileSize ;
ASSERT_EQ (
fifo_compaction_picker . NeedsCompaction (
vstorage_ . get ( ) , mutable_cf_options_ ) ,
current_size > fifo_options_ . max_table_files_size ) ;
}
}
} // namespace rocksdb
int main ( int argc , char * * argv ) { return rocksdb : : test : : RunAllTests ( ) ; }