{
  "slug": "nvmkv",
  "term": "NVMKV",
  "aliases": [],
  "definition": "NVMKV is a research key-value store that maps keys into a sparse flash address space and relies on extended FTL primitives for persistence.",
  "note": "Hashing selects a virtual slot; the FTL supplies physical mapping and allocation. Unwritten virtual gaps consume address space without reserving flash capacity. This removes a separate key-to-location index, not the FTL map or every cache. [hotstorage14]\n\nThe 2015 contract makes individual basic operations atomic and serializable, including operations submitted in a batch; the batch itself is not one transaction. Conditional primitives are emulated in that prototype. Its single-I/O goal is not a bound for every lookup or deletion. Pool deletion records invalidation before asynchronous reclamation. [atc15]\n\nThe published library requires sparse addressing, atomic writes and persistent TRIM from its lower layer. Those requirements are not implied by an ordinary block-device interface. The pinned API declares batch get and put calls without specifying whole-batch atomicity. [library] [api] In that revision, batch reads call individual gets in sequence; batch writes can split trimming and writing into separate atomic vector calls. [implementation] [wrapper]\n\nA b-bit sector offset addresses 2^b sectors. At 512 bytes per sector, 11 bits span 1 MiB and 12 bits span 2 MiB. This arithmetic describes virtual extent size, not a maximum accepted value or physical flash reservation. [budget]",
  "status": "research",
  "advantages": [],
  "limitations": [
    {
      "text": "Hash-based iteration does not preserve key order, and small records can waste space through sector rounding.",
      "citationIds": [
        "atc15"
      ]
    },
    {
      "text": "The pinned API declares a 1,047,552-byte value ceiling (1 MiB minus 1 KiB). Its README specifies 1 MiB minus one block for 2 KiB or 4 KiB block configurations.",
      "citationIds": [
        "api",
        "library"
      ]
    }
  ],
  "related": [
    "ftl",
    "flashstore",
    "skimpystash",
    "fawn-ds",
    "key-value-separation"
  ],
  "supersedes": [],
  "supersededBy": [],
  "firstSeen": null,
  "lastSeen": null,
  "updated": "2026-11-15",
  "citations": [
    {
      "id": "atc15",
      "title": "Marmol et al. NVMKV: A Scalable, Lightweight, FTL-aware Key-Value Store. USENIX ATC 2015, sections 5, 7 and 9.",
      "url": "https://www.usenix.org/system/files/conference/atc15/atc15-paper-marmol.pdf",
      "accessed": "2026-11-14"
    },
    {
      "id": "hotstorage14",
      "title": "Marmol et al. NVMKV: A Scalable and Lightweight Flash Aware Key-Value Store. HotStorage 2014, sections 2-3.",
      "url": "https://www.usenix.org/system/files/conference/hotstorage14/hotstorage14-paper-marmol.pdf",
      "accessed": "2026-11-14"
    },
    {
      "id": "library",
      "title": "OpenNVM NVMKV library README, revision 1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006.",
      "url": "https://github.com/opennvm/nvmkv/blob/1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006/README.md",
      "accessed": "2026-11-15"
    },
    {
      "id": "api",
      "title": "OpenNVM API: value-size constant and batch declarations, revision 1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006.",
      "url": "https://github.com/opennvm/nvmkv/blob/1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006/include/nvm_kv.h",
      "accessed": "2026-11-15"
    },
    {
      "id": "implementation",
      "title": "OpenNVM store manager: batch read loop and split trim/write path, revision 1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006.",
      "url": "https://github.com/opennvm/nvmkv/blob/1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006/src/kv_store_mgr.cpp",
      "accessed": "2026-11-15"
    },
    {
      "id": "wrapper",
      "title": "OpenNVM write wrapper: atomic vector dispatch, revision 1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006.",
      "url": "https://github.com/opennvm/nvmkv/blob/1cebb5d713aa9043a1cd9eb661bfbcdb73b7f006/src/kv_wrappers.cpp#L23-L37",
      "accessed": "2026-11-14"
    },
    {
      "id": "budget",
      "title": "Hesela: exact virtual sector-address arithmetic, with executable checks.",
      "url": "https://hesela.dev/research/nvmkv-address-budget.json",
      "accessed": "2026-11-14"
    }
  ],
  "provenance": [
    "Source review of historical prototypes and a pinned API, not an executed NVMKV benchmark or crash-recovery test.",
    "ATC15 evaluated two ioMemory systems and omitted YCSB workload E. Its throughput comparisons are not forecasts for current SSDs. [atc15]",
    "ATC15 section 5.1 labels 11 sector-offset bits at 512 bytes as 2 MB; multiplication gives 1,048,576 bytes (1 MiB). This does not establish the implementation's value limit. [atc15] [budget]"
  ]
}
