# MinIO MemKV RELEASE.2026-07-06T08-18-42Z

Released: 2026-07-06

Stored KV data is now durably readable by client key across a server restart —
a GET after a restart hits the block instead of forcing a cold recompute, on
both the LMCache and NIXL read paths. This release also hardens storage
reliability and correctness across a set of fixes from a release-readiness audit.

> **Upgrade note:** the on-disk drive format changed. Drives formatted by an
> earlier release must be reformatted — see Upgrade Notes below.

---

## Downloads

### Server Binary

| Platform | Architecture | Download |
| -------- | ------------ | -------- |
| Linux    | amd64        | [memkv](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv) |
| Linux    | arm64        | [memkv](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv) |

### NIXL Plugin (for Dynamo / KVBM integrations)

| Platform | Architecture | Download |
| -------- | ------------ | -------- |
| Linux    | amd64        | [libplugin_MEMKV.so](https://dl.min.io/aistor/memkv/release/linux-amd64/libplugin_MEMKV.so) |
| Linux    | arm64        | [libplugin_MEMKV.so](https://dl.min.io/aistor/memkv/release/linux-arm64/libplugin_MEMKV.so) |

### LD_PRELOAD Shim (for MLPerf-Storage kvcache workloads)

| Platform | Architecture | Download |
| -------- | ------------ | -------- |
| Linux    | amd64        | [libmemkv_preload.so](https://dl.min.io/aistor/memkv/release/linux-amd64/libmemkv_preload.so) |
| Linux    | arm64        | [libmemkv_preload.so](https://dl.min.io/aistor/memkv/release/linux-arm64/libmemkv_preload.so) |

### Packages

`.deb`, `.rpm`, and `.apk` packages bundle the server + both `.so` sidecars + the LMCache and sglang Python wheels into a single per-arch install.

| Format | Architecture | Download |
| ------ | ------------ | -------- |
| DEB    | amd64        | [memkv\_20260706081842.0.0_amd64.deb](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260706081842.0.0_amd64.deb) |
| DEB    | arm64        | [memkv\_20260706081842.0.0_arm64.deb](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260706081842.0.0_arm64.deb) |
| RPM    | amd64        | [memkv-20260706081842.0.0-1.x86_64.rpm](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv-20260706081842.0.0-1.x86_64.rpm) |
| RPM    | arm64        | [memkv-20260706081842.0.0-1.aarch64.rpm](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv-20260706081842.0.0-1.aarch64.rpm) |
| APK    | amd64        | [memkv\_20260706081842.0.0_x86_64.apk](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260706081842.0.0_x86_64.apk) |
| APK    | arm64        | [memkv\_20260706081842.0.0_aarch64.apk](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260706081842.0.0_aarch64.apk) |

After installing the deb/rpm, the Python plugin wheels land at `/usr/share/memkv/wheels/`:

```bash
pip install /usr/share/memkv/wheels/memkv_lmcache-*.whl
pip install /usr/share/memkv/wheels/memkv_sglang-*.whl
```

The NIXL plugin is auto-symlinked to `/opt/nvidia/nvda_nixl/lib/plugins/` when that directory exists (postinstall hook).

### Python Plugins (PyPI)

The LMCache and sglang plugins are also published to PyPI, so they install without the deb/rpm:

```bash
pip install memkv-lmcache memkv-sglang
```

Install **1.0.1 or later** — the 1.0.0 wheels predate cross-instance KV reuse.

The wheels `dlopen` the RDMA libraries at runtime; the transport needs host `rdma-core`, otherwise it falls back to TCP.

### Container Image

```bash
docker pull quay.io/minio/memkv:RELEASE.2026-07-06T08-18-42Z
docker pull quay.io/minio/memkv:latest
```

Container ships the server + the NIXL plugin (under `/usr/local/lib/plugins/`). The LD_PRELOAD shim and Python wheels are not included in the container image — use the deb/rpm or PyPI for those.

### Verification

Each binary is signed with both minisign (preferred) and GPG; sha256sums are published alongside.

```bash
# minisign
minisign -Vm memkv -P RWTx5Zr1tiHQLwG9keckT0c45M3AGeHD6IvimQHpyRywVWGbP1aVSGav

# sha256
sha256sum -c memkv.sha256sum
```

---

## Changes since RELEASE.2026-07-02T07-27-36Z

### Upgrade Notes

- **On-disk drive format changed — reformat existing drives.** A drive
  formatted by an earlier release is refused on open; reformat each with
  `memkv setup` first. Drives hold KV cache, not source data, so this only
  starts the cache cold — nothing durable is lost.

### New Features

- **Durable read-by-key after a restart.** Blocks are stored with their client
  key and resolved from disk, so a GET after a restart hits the block instead
  of forcing a cold recompute. Works on production-sized drives (>1M slots)
  with no rebuild scan at startup, on both the LMCache and NIXL read paths.

### Bug Fixes

- **Batch (NIXL) reads returned NotFound for every key after a restart** — the
  batch path never consulted the durable key index, so nixl-served blocks were
  unrecoverable across a restart. Fixed; verified 320/320 across a hard restart
  on a 12-drive server at 261 Gbps.
- **Values larger than `block_size` (default 4 MiB) could read back
  incorrectly** on reopen and when striped across drives, over both RDMA and
  TCP. Large values now round-trip correctly.
- **On-disk index reliability under concurrent writes at high fill**, where
  reads could also fail with a cache error. Structural writes are now
  serialized; reads take no lock, so throughput is unchanged.
- **Storage reliability fixes on the slot-recycle path** from a release audit:
  reading a slot as it was recycled, double recycles, reusing a slot before its
  old contents were cleared, acknowledged writes not surviving a checkpoint, and
  a read error not taking the drive offline. All addressed.
- **Discard failures were silently ignored**, letting a slot be reused before
  its old contents were cleared. Failures now surface and take the drive offline.

### Performance

- **Faster post-restart warmup on large, near-full drives.** The on-disk index
  cache was too small to hold the index, so the first read of each key after a
  restart thrashed (~94% miss). The cache is now sized for the whole index and
  warmed on open. Steady-state reads, already served from memory, are
  unaffected.

---

## Documentation

- Hosted docs: <https://docs.min.io/memkv/>
- Embedded docs (in the binary): `memkv doc` serves the same site locally.

## Support

- Security disclosures: security@min.io
