# MinIO MemKV RELEASE.2026-05-26T08-06-11Z

Released: 2026-05-26

A short patch on top of `RELEASE.2026-05-26T06-41-19Z` that closes the
TCP-control-plane known-limitation item from those notes and fixes
`memkv -V` so the shipped binary advertises its actual release tag
instead of the workspace stub. No protocol, performance, or hardware-
compatibility changes.

---

## 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\_20260526080611.0.0_amd64.deb](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260526080611.0.0_amd64.deb) |
| DEB    | arm64        | [memkv\_20260526080611.0.0_arm64.deb](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260526080611.0.0_arm64.deb) |
| RPM    | amd64        | [memkv-20260526080611.0.0-1.x86_64.rpm](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv-20260526080611.0.0-1.x86_64.rpm) |
| RPM    | arm64        | [memkv-20260526080611.0.0-1.aarch64.rpm](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv-20260526080611.0.0-1.aarch64.rpm) |
| APK    | amd64        | [memkv\_20260526080611.0.0_x86_64.apk](https://dl.min.io/aistor/memkv/release/linux-amd64/memkv_20260526080611.0.0_x86_64.apk) |
| APK    | arm64        | [memkv\_20260526080611.0.0_aarch64.apk](https://dl.min.io/aistor/memkv/release/linux-arm64/memkv_20260526080611.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).

### Container Image

```bash
docker pull quay.io/minio/memkv:RELEASE.2026-05-26T08-06-11Z
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 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
```

(The minisign public key above is the MinIO release-signing key — same key used across the AIStor product line.)

---

## Changes since RELEASE.2026-05-26T06-41-19Z

### Reliability: TCP session reap on socket close

The prior release shipped the new TCP-multiplexed control plane for
batch RDMA, with a documented limitation: a client that crashed or
dropped its TCP socket without sending `TcpDetach` would strand its
`DcClientHandle` (address handle + DCT number + DC key) in the
server's `DirectIoContext::dc_clients` map until the server
restarted. This release closes that gap.

Each TCP connection now owns a `SessionTracker` — a `HashSet<u64>`
behind a `Mutex` — that the `TcpAttach` handler updates with every
allocated `session_id` and that `TcpDetach` removes from on graceful
teardown. The TCP listener holds an `Arc<SessionTracker>` for the
lifetime of the connection and threads it through every dispatched
request via the new `RequestHandler::handle_for_tcp_session` entry.

After the per-connection writer task drains (which only happens once
every dispatch task has dropped its response-sender clone, so every
in-flight `TcpAttach` has run to completion), the listener drains
the tracker and calls `tcp_session_close` for every session id still
in it, releasing the matching DC peer state. The drain ordering
makes the post-close snapshot stable — there is no race against a
still-in-flight attach.

The macOS server links the same TCP listener but has no DC peer
registry, so `tcp_session_close` is a no-op there and
`SessionTracker` is never populated (the macOS dispatcher has no
`TcpAttach` arm).

Net effect: a crashed or network-partitioned Dynamo / KVBM client no
longer leaves long-lived DC peer state on the server. The known-
limitation entry from `RELEASE.2026-05-26T06-41-19Z` is resolved.

---

## Bug Fixes

### `memkv -V` now reports the release tag, not `0.1.0`

The server's clap `#[command(version)]` was resolving to
`CARGO_PKG_VERSION`, which on this workspace is the stub `0.1.0`.
The shipped binary therefore advertised `memkv 0.1.0` instead of
the release tag, so `docker run quay.io/minio/memkv:latest -V` (and
the same `-V` against the deb/rpm binary) gave operators
investigating a deployment no usable version information.

`server/build.rs` now picks up `VERSION_TAG` and re-exports it as
the rustc env var `MEMKV_VERSION`; both `main_linux.rs` and
`main_macos.rs` switch to `#[command(version = env!("MEMKV_VERSION"))]`.
qreleaser already exports `VERSION_TAG` for the release build — the
env var was flowing into cargo with no consumer — so no change was
needed in the release pipeline.

Dev builds without `VERSION_TAG` fall back to
`DEVELOPMENT.<short-sha>` via `git rev-parse --short=7 HEAD`, and to
`DEVELOPMENT` when git is unavailable, so the binary never
advertises a fake `0.1.0` in any build configuration.

---

## Known Limitations

- **R2D wiring on the Dynamo side.** The plugin- and client-side
  ground work for direct-to-device onboards (dma-buf MR registration
  + CUDA-aware scatter) is complete and unchanged in this release,
  but the matching Dynamo connector contract still has to be taught
  to recognize R2D-completed onboards before KVBM will dispatch
  through it. Until that lands upstream, the host-bounce +
  `cudaMemcpy` H2D remains the default path for end-to-end TTFT
  measurements.

---

## Documentation

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

## Support

- Issues: filed privately by licensed customers and contributors via the support channel
- Security disclosures: security@min.io
