{
  "slug": "viper",
  "term": "Viper",
  "aliases": [],
  "definition": "Viper is a research key-value store that keeps a volatile hash index in DRAM and records in persistent memory.",
  "note": "Layout: the offset map adapts CCEH as a volatile index. Clients write records directly into persistent pages aligned to the configured DIMM interleaving, rather than staging them in a DRAM write buffer. [viper-paper]\n\nRecovery: rebuilding the offset map requires scanning stored records. Fast steady-state lookup therefore does not imply an instant restart. The paper describes both fixed- and variable-length recovery. [viper-paper]\n\nImplementation: at revision 79ebf6e9248b, Viper<std::string, std::string>::recover_database() instead throws \"Not implemented yet\". The constructor calls recovery when opening an existing pool. Variable-length put/get support must not be read as implemented string-pool recovery at that revision. [viper-code]\n\nMeasurement: the pinned recovery benchmark fills fixed-size records, closes the store, then times open(). That procedure is not evidence of a power-failure test. Its fixture also removes pools whose path lacks /dev/dax, so changing the benchmark to a directory requires reviewing teardown first. [viper-benchmark] [viper-fixture]",
  "related": [
    "persistent-memory",
    "cceh",
    "persistence-ordering",
    "dax",
    "key-value-separation"
  ],
  "citations": [
    {
      "id": "viper-paper",
      "title": "Benson, Makait and Rabl. Viper: An Efficient Hybrid PMem-DRAM Key-Value Store. PVLDB 14(9), 1544-1556 (2021). DOI: 10.14778/3461535.3461543.",
      "url": "https://www.vldb.org/pvldb/vol14/p1544-benson.pdf",
      "accessed": "2026-11-14"
    },
    {
      "id": "viper-code",
      "title": "Viper authors. viper.hpp: constructor and fixed/string recovery implementations, revision 79ebf6e9248b.",
      "url": "https://github.com/hpides/viper/blob/79ebf6e9248b6734244fb9b52d4cafaf703611b2/include/viper/viper.hpp",
      "accessed": "2026-11-14"
    },
    {
      "id": "viper-benchmark",
      "title": "Viper authors. recovery_bm.cpp: fixed-size prefill, teardown and timed reopen, revision 79ebf6e9248b.",
      "url": "https://github.com/hpides/viper/blob/79ebf6e9248b6734244fb9b52d4cafaf703611b2/benchmark/recovery_bm.cpp",
      "accessed": "2026-11-14"
    },
    {
      "id": "viper-fixture",
      "title": "Viper authors. viper_fixture.hpp: DeInitMap and path-dependent pool removal, revision 79ebf6e9248b.",
      "url": "https://github.com/hpides/viper/blob/79ebf6e9248b6734244fb9b52d4cafaf703611b2/benchmark/fixtures/viper_fixture.hpp",
      "accessed": "2026-11-14"
    },
    {
      "id": "hesela-pmem",
      "title": "Hesela: persistent memory, persistence domains and DAX.",
      "url": "https://hesela.com/analyses/pmem-persistence-domains-dax/",
      "accessed": "2026-11-14"
    }
  ],
  "status": "research",
  "advantages": [],
  "limitations": [],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-11-14",
  "provenance": [
    "Full-paper and pinned-source review. No engine execution, benchmark reproduction or crash-injection experiment was performed.",
    "Paper sections 3, 4.7 and 5.3.9 describe architecture and recovery. Implementation observations apply only to the linked revision, not every version of the design.",
    "The paper evaluates Optane hardware with devdax; its historical performance results are not a current ranking or a guarantee for other persistent-memory platforms."
  ]
}
