# 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)