{
  "slug": "sstable-restart-point",
  "term": "SSTable restart point",
  "aliases": [
    "Block restart point",
    "Key compression restart point"
  ],
  "definition": "An SSTable restart point is an indexed entry that stores its full key so a reader can resume decoding a prefix-compressed block without reconstructing all preceding keys.",
  "note": "In LevelDB 1.23, ordinary entries can omit the byte prefix shared with the preceding key; a restart entry sets the shared-prefix length to zero. A block ends with four-byte restart offsets and a four-byte count. The directory enables indexed entry selection, not crash recovery. [restart-builder]\n\nSeek uses binary search over restart keys followed by forward reconstruction. Next decodes the following entry; Prev returns to an earlier restart and decodes forward again. Reverse traversal can therefore do different reconstruction work from forward traversal. These are source-level operations, not measured latency or device reads. [restart-reader]\n\nThe data-block default is 16 entries between restarts. TableBuilder separately forces the index-block interval to 1, so that default must not be applied to every block. [restart-options] [restart-writer]\n\nKey-prefix encoding precedes optional compression of the finished block. Selecting kNoCompression skips that latter step but does not disable prefix encoding. A restart offset addresses the decoded block, not an independently readable region inside a compressed disk block. [restart-writer]\n\nMore frequent restarts trade extra offsets and repeated key bytes for shorter reconstruction spans. This layout mechanism is distinct from a prefix Bloom filter's membership predicate. Other SSTable implementations and versions may use different formats.",
  "related": [
    "sstable",
    "lsm-tree",
    "prefix-bloom-filter"
  ],
  "citations": [
    {
      "id": "restart-builder",
      "title": "LevelDB 1.23: BlockBuilder entry encoding and restart directory.",
      "url": "https://github.com/google/leveldb/blob/99b3c03b3284f5886f9ef9a4ef703d57373e61be/table/block_builder.cc",
      "accessed": "2026-11-12"
    },
    {
      "id": "restart-reader",
      "title": "LevelDB 1.23: Block::Iter Seek, Next and Prev.",
      "url": "https://github.com/google/leveldb/blob/99b3c03b3284f5886f9ef9a4ef703d57373e61be/table/block.cc",
      "accessed": "2026-11-12"
    },
    {
      "id": "restart-writer",
      "title": "LevelDB 1.23: TableBuilder index options and block compression.",
      "url": "https://github.com/google/leveldb/blob/99b3c03b3284f5886f9ef9a4ef703d57373e61be/table/table_builder.cc",
      "accessed": "2026-11-12"
    },
    {
      "id": "restart-options",
      "title": "LevelDB 1.23: Options::block_restart_interval and compression.",
      "url": "https://github.com/google/leveldb/blob/99b3c03b3284f5886f9ef9a4ef703d57373e61be/include/leveldb/options.h",
      "accessed": "2026-11-12"
    },
    {
      "id": "hesela",
      "title": "Hesela: Restart points change the work inside a block.",
      "url": "https://hesela.com/analyses/bloom-filters-lsm-read-cost/#sstable-restarts",
      "accessed": "2026-11-12"
    }
  ],
  "status": "shipping",
  "advantages": [
    {
      "text": "Indexed full-key entries let a reader begin reconstruction within a block instead of always starting at its first entry.",
      "citationIds": [
        "restart-builder",
        "restart-reader"
      ]
    }
  ],
  "limitations": [
    {
      "text": "Restart spacing alone does not predict lookup latency: block caching, decompression, key distribution and iterator state also matter.",
      "citationIds": [
        "restart-reader",
        "restart-writer"
      ]
    }
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-11-12",
  "provenance": [
    "Source review of LevelDB tag 1.23, commit 99b3c03b3284f5886f9ef9a4ef703d57373e61be; builder, iterator, options and compression paths inspected on 2026-11-12. No engine benchmark or current-version claim."
  ]
}
