• C
    Always allow L0->L1 trivial move during manual compaction (#11375) · 43e9a60b
    Changyu Bi 提交于
    Summary:
    during manual compaction (CompactRange()), L0->L1 trivial move is disabled when only L0 overlaps with compacting key range (introduced in https://github.com/facebook/rocksdb/issues/7368 to enforce kForce* contract). This can cause large memory usage due to compaction readahead when number of L0 files is large. This PR allows L0->L1 trivial move in this case, and will do a L1 -> L1 intra-level compaction when needed (`bottommost_level_compaction` is kForce*). In brief, consider a DB with only L0 file, and user calls CompactRange(kForce, nullptr, nullptr),
    - before this PR, RocksDB does a L0 -> L1 compaction (disallow trivial move),
    - after this PR, RocksDB does a L0 -> L1 compaction (allow trivial move), and a L1 -> L1 compaction.
    Users can use kForceOptimized to avoid this extra L1->L1 compaction overhead when L0s are overlapping and cannot be trivial moved.
    
    This PR also fixed a bug (see previous discussion in https://github.com/facebook/rocksdb/issues/11041) where `final_output_level` of a manual compaction can be miscalculated when `level_compaction_dynamic_level_bytes=true`. This bug could cause incorrect level being moved when CompactRangeOptions::change_level is specified.
    
    Pull Request resolved: https://github.com/facebook/rocksdb/pull/11375
    
    Test Plan: - Added new unit tests to test that L0 -> L1 compaction allows trivial move and L1 -> L1 compaction is done when needed.
    
    Reviewed By: ajkr
    
    Differential Revision: D44943518
    
    Pulled By: cbi42
    
    fbshipit-source-id: e9fb770d17b163c18a623e1d1bd6b81159192708
    43e9a60b
可在Tags中查看这些版本中当前仓库的状态.
HISTORY.md 277.7 KB