@ -445,9 +445,6 @@ static bool SaveValue(void* arg, const ParsedInternalKey& parsed_key,
}
}
namespace {
namespace {
bool NewestFirst ( FileMetaData * a , FileMetaData * b ) {
return a - > fd . GetNumber ( ) > b - > fd . GetNumber ( ) ;
}
bool NewestFirstBySeqNo ( FileMetaData * a , FileMetaData * b ) {
bool NewestFirstBySeqNo ( FileMetaData * a , FileMetaData * b ) {
if ( a - > smallest_seqno ! = b - > smallest_seqno ) {
if ( a - > smallest_seqno ! = b - > smallest_seqno ) {
return a - > smallest_seqno > b - > smallest_seqno ;
return a - > smallest_seqno > b - > smallest_seqno ;
@ -456,7 +453,7 @@ bool NewestFirstBySeqNo(FileMetaData* a, FileMetaData* b) {
return a - > largest_seqno > b - > largest_seqno ;
return a - > largest_seqno > b - > largest_seqno ;
}
}
// Break ties by file number
// Break ties by file number
return NewestFirst ( a , b ) ;
return a - > fd . GetNumber ( ) > b - > fd . GetNumber ( ) ;
}
}
bool BySmallestKey ( FileMetaData * a , FileMetaData * b ,
bool BySmallestKey ( FileMetaData * a , FileMetaData * b ,
const InternalKeyComparator * cmp ) {
const InternalKeyComparator * cmp ) {
@ -655,11 +652,7 @@ void Version::Get(const ReadOptions& options,
assert ( comp_sign < 0 ) ;
assert ( comp_sign < 0 ) ;
} else {
} else {
// level == 0, the current file cannot be newer than the previous one.
// level == 0, the current file cannot be newer than the previous one.
if ( cfd_ - > options ( ) - > compaction_style = = kCompactionStyleUniversal ) {
assert ( ! NewestFirstBySeqNo ( f , prev_file ) ) ;
assert ( ! NewestFirstBySeqNo ( f , prev_file ) ) ;
} else {
assert ( ! NewestFirst ( f , prev_file ) ) ;
}
}
}
}
}
prev_file = f ;
prev_file = f ;
@ -1318,22 +1311,18 @@ struct VersionSet::ManifestWriter {
class VersionSet : : Builder {
class VersionSet : : Builder {
private :
private :
// Helper to sort v->files_
// Helper to sort v->files_
// kLevel0LevelCompaction -- NewestFirst (also used for FIFO compaction)
// kLevel0 -- NewestFirstBySeqNo
// kLevel0UniversalCompaction -- NewestFirstBySeqNo
// kLevelNon0 -- BySmallestKey
// kLevelNon0 -- BySmallestKey
struct FileComparator {
struct FileComparator {
enum SortMethod {
enum SortMethod {
kLevel0LevelCompaction = 0 ,
kLevel0 = 0 ,
kLevel0UniversalCompaction = 1 ,
kLevelNon0 = 1 ,
kLevelNon0 = 2 ,
} sort_method ;
} sort_method ;
const InternalKeyComparator * internal_comparator ;
const InternalKeyComparator * internal_comparator ;
bool operator ( ) ( FileMetaData * f1 , FileMetaData * f2 ) const {
bool operator ( ) ( FileMetaData * f1 , FileMetaData * f2 ) const {
switch ( sort_method ) {
switch ( sort_method ) {
case kLevel0LevelCompaction :
case kLevel0 :
return NewestFirst ( f1 , f2 ) ;
case kLevel0UniversalCompaction :
return NewestFirstBySeqNo ( f1 , f2 ) ;
return NewestFirstBySeqNo ( f1 , f2 ) ;
case kLevelNon0 :
case kLevelNon0 :
return BySmallestKey ( f1 , f2 , internal_comparator ) ;
return BySmallestKey ( f1 , f2 , internal_comparator ) ;
@ -1359,10 +1348,7 @@ class VersionSet::Builder {
Builder ( ColumnFamilyData * cfd ) : cfd_ ( cfd ) , base_ ( cfd - > current ( ) ) {
Builder ( ColumnFamilyData * cfd ) : cfd_ ( cfd ) , base_ ( cfd - > current ( ) ) {
base_ - > Ref ( ) ;
base_ - > Ref ( ) ;
levels_ = new LevelState [ base_ - > NumberLevels ( ) ] ;
levels_ = new LevelState [ base_ - > NumberLevels ( ) ] ;
level_zero_cmp_ . sort_method =
level_zero_cmp_ . sort_method = FileComparator : : kLevel0 ;
( cfd_ - > options ( ) - > compaction_style = = kCompactionStyleUniversal )
? FileComparator : : kLevel0UniversalCompaction
: FileComparator : : kLevel0LevelCompaction ;
level_nonzero_cmp_ . sort_method = FileComparator : : kLevelNon0 ;
level_nonzero_cmp_ . sort_method = FileComparator : : kLevelNon0 ;
level_nonzero_cmp_ . internal_comparator = & cfd - > internal_comparator ( ) ;
level_nonzero_cmp_ . internal_comparator = & cfd - > internal_comparator ( ) ;
@ -1408,9 +1394,7 @@ class VersionSet::Builder {
auto f2 = v - > files_ [ level ] [ i ] ;
auto f2 = v - > files_ [ level ] [ i ] ;
if ( level = = 0 ) {
if ( level = = 0 ) {
assert ( level_zero_cmp_ ( f1 , f2 ) ) ;
assert ( level_zero_cmp_ ( f1 , f2 ) ) ;
if ( cfd_ - > options ( ) - > compaction_style = = kCompactionStyleUniversal ) {
assert ( f1 - > largest_seqno > f2 - > largest_seqno ) ;
assert ( f1 - > largest_seqno > f2 - > largest_seqno ) ;
}
} else {
} else {
assert ( level_nonzero_cmp_ ( f1 , f2 ) ) ;
assert ( level_nonzero_cmp_ ( f1 , f2 ) ) ;