# 1. Wiki - [Creating and Ingesting SST files](https://github.com/facebook/rocksdb/wiki/Creating-and-Ingesting-SST-files) ## 1.1 Creating SST file - 使用 `rokcsdb::SstFileWriter` 来创建 SST 文件。 - 构建参数: - **invalidate_page_cache**: 如果为 true,每写入 1 MB 后提示 OS file pages 未来不再需要 - **io_priority**:// TODO:用途 - **options**:用于指定 table type、压缩选项等配置 - 写入时,key 必须保证严格的**递增**(除了 range tombstones 外) ## 1.2 Ingesting SST files - 调用 `DB::IngestEnxternalFile()` 接口 - 可以一次性注入多个 column families 的 SSTs ## 1.3 What happens when youu ingest a file ### 调用 DB::IngestExternalFiles()时 1. 拷贝或者链接文件到 DB 目录 2. **阻塞**对 DB 的写入,保证 DB 的一致性状态(为 ingest 赋值正确的 seq number) 3. 如果范围跟 memtable key 范围重叠,需要 flush memtable 4. 将文件分配到 LSM-tree 的最佳 level 5. 为文件分配一个 global seq number 6. **恢复**对 DB 的写入 ### 挑选满足如下条件的 lowest level - 文件可以放入该 level 内 - 文件的范围与 upper layers 没有重叠 - 文件与 **running compaction** 输出到该 level 的范围没有重叠 ### Global sequence number - 使用 `SstFileWriter` 创建的文件在 metablock 中有一个特殊的 field:global sequence number - 表示文件内的所有key 的 seq numer 都是它 - 注入时分配(带来一次随机写入) - `IngestExternalFileOptions::write_global_seqno` - false 时不写入 global seqno 到 SST 中,而是写入到 MANIFEST,来避免一次随机写入 - 需要 5.16 以后的版本,如果需要兼容之前的版本则需要设置为 true ## 1.4 Ingestion Behind - 选项:`ingest_bebind = true` - 始终注入到 bottom most level,seqno = 0,可能带来 **duplicate keys**, - 当前只有 universal compaction 支持 ### User cache - 数据回填(Back-fill)