• Y
    Allow compaction iterator to perform garbage collection (#7556) · 65952679
    Yanqin Jin 提交于
    Summary:
    Add a threshold timestamp, full_history_ts_low_ of type `std::string*` to
    `CompactionIterator`, so that RocksDB can also perform garbage collection during
    compaction.
    * If full_history_ts_low_ is nullptr, then compaction iterator does not perform
      GC, preserving all timestamp history for all keys. Compaction iterator will
    treat user key with different timestamps as different user keys.
    * If full_history_ts_low_ is not nullptr, then compaction iterator performs
      GC. GC will look at keys older than `*full_history_ts_low_` and determine their
      eligibility based on factors including snapshots.
    
    Current rules of GC:
     * If an internal key is in the same snapshot as a previous counterpart
        with the same user key, and this key is eligible for GC, and the key is
        not single-delete or merge operand, then this key can be dropped. Note
        that the previous internal key cannot be a merge operand either.
     * If a tombstone is the most recent one in the earliest snapshot and it
        is eligible for GC, and keyNotExistsBeyondLevel() is true, then this
        tombstone can be dropped.
     * If a tombstone is the most recent one in a snapshot and it is eligible
        for GC, and the compaction is at bottommost level, then all other older
        internal keys of the same user key must also be eligible for GC, thus
        can be dropped
    * Single-delete, delete-range and merge are not currently supported.
    
    Pull Request resolved: https://github.com/facebook/rocksdb/pull/7556
    
    Test Plan: make check
    
    Reviewed By: ltamasi
    
    Differential Revision: D24507728
    
    Pulled By: riversand963
    
    fbshipit-source-id: 3c09c7301f41eed76dfcf4d1527e68cf6e0a8bb3
    65952679
db_iter.cc 50.2 KB