{
  "slug": "hybrid-log",
  "term": "Hybrid log",
  "aliases": [
    "HybridLog",
    "FASTER hybrid log"
  ],
  "definition": "A hybrid log combines an in-memory region supporting in-place updates with read-only records backed by persistent storage.",
  "note": "A mutable region permits repeated updates without a fresh append each time; updates to read-only records create tail copies. An epoch-coordinated safe read-only boundary defers read-modify-write copying while an older in-place update remains possible. [faster]\n\nCheckpoint choice: Fold-over freezes and flushes the main log through its tail, so subsequent updates need new records. A snapshot instead writes the in-memory state to a separate checkpoint file. In-memory completion does not itself establish durability. [faster-recovery]\n\nRecovery position: Concurrent prefix recovery identifies a committed prefix per session rather than one global issue-time cutoff. [cpr] The documented API also reports an exception list for pending operations excluded from a checkpoint; a sequence-number maximum alone is insufficient. [faster-recovery]\n\nCleaning copies live records forward; truncation expires an address range. Scanning log records can return old versions and tombstones, unlike iteration over current keys. [faster-basics]",
  "status": "shipping",
  "advantages": [
    {
      "text": "Repeated hot-record updates can avoid index-pointer replacement and whole-record copying.",
      "citationIds": [
        "faster"
      ]
    }
  ],
  "limitations": [
    {
      "text": "The 2018 throughput evaluation excludes checkpointing, recovery and expiration-based garbage-collection costs.",
      "citationIds": [
        "faster"
      ]
    },
    {
      "text": "Compaction is bounded by the safe read-only address, not simply by the tail.",
      "citationIds": [
        "faster-basics"
      ]
    }
  ],
  "related": [
    "key-value-separation",
    "value-log",
    "database-checkpoint"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "citations": [
    {
      "id": "faster",
      "title": "Chandramouli et al. FASTER: A Concurrent Key-Value Store with In-Place Updates. SIGMOD 2018, sections 2.1, 6 and 7.1.",
      "url": "https://www.microsoft.com/en-us/research/uploads/prod/2018/03/faster-sigmod18.pdf",
      "accessed": "2026-11-02"
    },
    {
      "id": "faster-recovery",
      "title": "FASTER documentation: FasterKV Checkpointing and Recovery, snapshot, fold-over and commit-point semantics.",
      "url": "https://microsoft.github.io/FASTER/docs/fasterkv-recovery/",
      "accessed": "2026-11-02"
    },
    {
      "id": "faster-basics",
      "title": "FASTER documentation: FasterKV Basics, Log Scan and Log Compaction.",
      "url": "https://microsoft.github.io/FASTER/docs/fasterkv-basics/",
      "accessed": "2026-11-02"
    },
    {
      "id": "cpr",
      "title": "Prasaad, Chandramouli and Kossmann. Concurrent Prefix Recovery: Performing CPR on a Database. SIGMOD 2019, section 2.",
      "url": "https://www.microsoft.com/en-us/research/wp-content/uploads/2019/01/cpr-sigmod19.pdf",
      "accessed": "2026-11-02"
    },
    {
      "id": "hesela-kv",
      "title": "Key-value separation: the cleaning bill moves elsewhere",
      "url": "https://hesela.com/analyses/key-value-separation-cleaning-cost/#hybrid-log",
      "accessed": "2026-11-02"
    }
  ],
  "updated": "2026-11-02",
  "provenance": [
    "Historical FASTER mechanism and later FasterKV API documentation are distinguished; no current-version benchmark is claimed.",
    "The research papers are SIGMOD 2018 (DOI 10.1145/3183713.3196898) and SIGMOD 2019 (DOI 10.1145/3299869.3300090)."
  ]
}
