# MinIO AIStor RELEASE.2026-08-07T18-34-35Z

Released: 2026-08-07

This release brings GPU-Direct RDMA to the stable release line. S3 clients can move object data directly between GPU
memory and AIStor over an RDMA fabric, and AIStor nodes can exchange erasure-coded shards over that same fabric.
Server-side encryption also costs less: new objects use AES-128-GCM, and each encrypted request makes far fewer KMS calls.

Upgrade all deployments. This release fixes a key-rotation defect that silently and permanently broke decryption of IAM,
server, tier, and bucket configuration. It also closes a gap that let an object tag shadow an IAM policy condition key,
and adds the missing authentication check on the Tables statistics endpoint.

---

## Downloads

### Binary Downloads

| Platform | Architecture | Download                                                                    |
| -------- | ------------ | --------------------------------------------------------------------------- |
| Linux    | amd64        | [minio](https://dl.min.io/aistor/minio/release/linux-amd64/minio)           |
| Linux    | arm64        | [minio](https://dl.min.io/aistor/minio/release/linux-arm64/minio)           |
| macOS    | arm64        | [minio](https://dl.min.io/aistor/minio/release/darwin-arm64/minio)          |
| macOS    | amd64        | [minio](https://dl.min.io/aistor/minio/release/darwin-amd64/minio)          |
| Windows  | amd64        | [minio.exe](https://dl.min.io/aistor/minio/release/windows-amd64/minio.exe) |

### RDMA Binaries

Both RDMA features require the `minio.rdma` build. It adds no command-line flags of its own and serves over TCP when no
RDMA fabric is present.

The two features have different defaults:

- **S3 over RDMA (GPU-Direct) is on by default.** Install the `minio.rdma` binary with its bundled libraries on
  RDMA-capable hardware and it serves GPU-Direct transfers without further configuration. Clients that do not present an
  RDMA token continue over TCP.
- **Inter-node RDMA is off by default.** Turn it on per node with `MINIO_RDMA_INTERNODE=on`. This is its first release,
  and it requires a lossless RoCEv2 fabric with substantial switch-side configuration. See Inter-Node RDMA under New
  Features before you enable it.

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

### FIPS Binaries

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

### Package Downloads

| Format    | Architecture | Download                                                                                                                                     |
| --------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------- |
| DEB       | amd64        | [minio\_20260807183435.0.0_amd64.deb](https://dl.min.io/aistor/minio/release/linux-amd64/minio_20260807183435.0.0_amd64.deb)                  |
| DEB       | arm64        | [minio\_20260807183435.0.0_arm64.deb](https://dl.min.io/aistor/minio/release/linux-arm64/minio_20260807183435.0.0_arm64.deb)                  |
| RPM       | amd64        | [minio-20260807183435.0.0-1.x86_64.rpm](https://dl.min.io/aistor/minio/release/linux-amd64/minio-20260807183435.0.0-1.x86_64.rpm)             |
| RPM       | arm64        | [minio-20260807183435.0.0-1.aarch64.rpm](https://dl.min.io/aistor/minio/release/linux-arm64/minio-20260807183435.0.0-1.aarch64.rpm)           |
| DEB(RDMA) | amd64        | [minio.rdma\_20260807183435.0.0_amd64.deb](https://dl.min.io/aistor/minio/release/linux-amd64/minio.rdma_20260807183435.0.0_amd64.deb)        |
| DEB(RDMA) | arm64        | [minio.rdma\_20260807183435.0.0_arm64.deb](https://dl.min.io/aistor/minio/release/linux-arm64/minio.rdma_20260807183435.0.0_arm64.deb)        |
| RPM(RDMA) | amd64        | [minio.rdma-20260807183435.0.0-1.x86_64.rpm](https://dl.min.io/aistor/minio/release/linux-amd64/minio.rdma-20260807183435.0.0-1.x86_64.rpm)   |
| RPM(RDMA) | arm64        | [minio.rdma-20260807183435.0.0-1.aarch64.rpm](https://dl.min.io/aistor/minio/release/linux-arm64/minio.rdma-20260807183435.0.0-1.aarch64.rpm) |

Packages are also published under `aistor-*` / `aistor_*` names with identical contents. The installed binary path is
unchanged at `/usr/local/bin/minio`, and the previous `minio-*` package filenames continue to resolve (#6602).

### Container Images

```bash
# Standard
docker pull quay.io/minio/aistor/minio:RELEASE.2026-08-07T18-34-35Z
podman pull quay.io/minio/aistor/minio:RELEASE.2026-08-07T18-34-35Z

# FIPS
docker pull quay.io/minio/aistor/minio:RELEASE.2026-08-07T18-34-35Z.fips
podman pull quay.io/minio/aistor/minio:RELEASE.2026-08-07T18-34-35Z.fips

# GPU-Direct / inter-node RDMA
docker pull quay.io/minio/aistor/minio:RELEASE.2026-08-07T18-34-35Z.rdma
podman pull quay.io/minio/aistor/minio:RELEASE.2026-08-07T18-34-35Z.rdma
```

### Homebrew (macOS)

```bash
brew install minio/aistor/minio
```

---

## Security Updates

### Fixes for previously shipped builds

- **Unauthenticated Tables statistics endpoint**: `/_iceberg/v1/stats` (`GetGlobalStats`) served catalog-wide statistics
  without an authorization check. Authentication is now enforced (#6466).
- **An object tag could shadow an IAM policy condition key**: AIStor turns each object tag into a policy condition key by
  prefixing the tag name with a namespace such as `ExistingObjectTag/`. It joined the two as a path. Tag names may
  contain `/` and `.`, so a tag named `../CurrentTime` collapsed out of its namespace and overwrote the unrelated
  `CurrentTime` condition key during policy evaluation. The prefix is now joined directly, which keeps every tag-derived
  key inside its namespace. This covers both `ExistingObjectTag` and `RequestObjectTag` (#6613, #5773).
- **Dependency CVE remediation**: Bumped `google.golang.org/grpc` to v1.82.1 and `klauspost/compress` to v1.18.7 to clear
  GO-2026-6061 and GO-2026-5841.

### Hardening on paths introduced in this release

GPU-Direct and inter-node RDMA arrive with this release. No earlier release build — standard or FIPS — contained these
code paths, so no deployed release was ever exposed to the issues below. They are listed so that operators turning on
RDMA know how the path behaves today.

- **The RDMA write path now authenticates first**: The RDMA branches of `PutObject` and `PutObjectPart` finished the write
  before reaching signature verification. That path identifies the caller from the access key ID in the request and
  evaluates policy, but it computes no HMAC. An access key ID is not a secret, so a caller who knew only a victim's key
  ID could have written objects as that principal. Both branches now verify the signature before writing anything. RDMA
  carries no HTTP body, so streaming and chunked-signature requests cannot be verified here and are rejected. Anonymous
  requests carry no signature and remain gated by bucket policy (#6724).
- **Transfer size no longer comes from the client**: AIStor now sizes an RDMA transfer from the object it is serving
  rather than from the client's token (#6669). It also parses `x-amz-rdma-token` strictly as a cuObject descriptor and
  rejects an appended address and size, so a client cannot override the address and length the descriptor already
  carries. Internal forwarding between AIStor nodes still uses that appended form (#6758, #6760).
- **The SSE-C key cache is scoped to its key**: The object-key cache added by #5636 earlier in this release ignored the
  customer-supplied SSE-C key when it hit. A caller who presented the wrong SSE-C key could therefore have been served
  key material derived from the correct one. The cache now keys each entry on the SSE-C key, compares in constant time,
  and stores only successful unseals.

---

## New Features

### S3 over RDMA

S3 clients on an RDMA fabric can now read and write object data directly to and from GPU memory, bypassing host bounce
buffers and the TCP stack entirely. It is available in the `minio.rdma` binary, packages, and container image on both
amd64 and arm64, and is on by default on RDMA-capable hardware.

- **GPU-Direct data path**: GET and PUT move between client GPU memory and AIStor with no intermediate copy. Erasure
  reconstruction writes straight into the client's buffer. The path supports multiple NICs with per-NIC health
  monitoring, and RDMA GETs raise S3 event notifications like any other read (#3360).
- **AIStor-native RDMA server**: S3 over RDMA runs on the AIStor-native `libs3rdma` transport, which supports both RDMA
  transport modes and replaces the previous third-party server library (#6049).
- **Bandwidth governance**: The `--api-bandwidth` cap now applies to the GPU-Direct data path, which bypasses the
  socket-level throttle, so a single RDMA tenant cannot saturate the fabric (#5596).
- **Operational visibility**: `minio_api_rdma_*` metrics report the bytes and operations carried over RDMA.
- **Packaged and shipped**: RDMA binaries, deb/rpm/apk packages, and container images are built and published for amd64
  and arm64 as part of every release (#5391, #5421, #5425).
- **PCIe ACS prerequisite documented**: GPU-Direct needs PCIe ACS Redirect cleared on the bridges between the GPU and the
  NIC. Leaving it set is a common cause of `IBV_WC_REM_OP_ERR`, typically on the GPU closest to the NIC. The release
  ships a runbook and a persistent systemd unit that applies the fix (#5616, #6581, #6587).

### Inter-Node RDMA for Erasure-Coded I/O

AIStor nodes can now exchange erasure-coded shards over RDMA instead of TCP. This replaces the previous librpma-based
path with a new implementation (#3792).

This is the first release to ship inter-node RDMA, and it is **off by default** — enable it per node with
`MINIO_RDMA_INTERNODE=on`. It requires a lossless RoCEv2 fabric, which means extensive switch-side configuration (PFC,
congestion notification, DSCP marking) plus matching host settings. Validate it on your own fabric, and engage MinIO
through [SUBNET](https://subnet.min.io) for architectural support before production rollout.

- **Holds up under load**: PUT sends each shard as one contiguous transfer and waits for a durability acknowledgement
  carried on the same connection. Backpressure comes from a per-peer window that adapts to how many bytes are already in
  flight, which stops many senders from overwhelming one receiver. On an 8-node 400 GbE cluster this measured 48–55 GiB/s
  PUT and about 127 GiB/s GET with zero errors from concurrency 64 through 512, against TCP baselines of 46 and
  100 GiB/s (#5894).
- **Falls back to TCP instead of failing**: Receive buffers come only from a pre-registered pool. When that pool is busy,
  or a transfer is too large for it, the PUT quietly goes over TCP instead of returning an error. The
  `minio_system_network_internode_rdma_pool_fallbacks_total` metric counts these fallbacks (#5894).
- **Multi-NIC and multi-rail**: Per-rail routing, per-remote write caps, per-NIC metrics, correct address-handle routing
  on nodes with more than one NIC, and per-NIC credit replenishment (#5581, #5935).
- **Lossless fabric detected automatically**: AIStor reads the lossless RoCE traffic class from the host configuration
  instead of requiring you to set it. `MINIO_RDMA_INTERNODE_TRAFFIC_CLASS` and `MINIO_RDMA_INTERNODE_SERVICE_LEVEL`
  override it (#5532).
- **Tunable transport**: Congestion window, credit, receive-queue, and queue-depth settings are exposed as
  `MINIO_RDMA_INTERNODE_*` environment variables. Any value you leave unset uses a validated default.

---

## Performance Improvements

- **AES-128-GCM for newly written objects**: New objects are encrypted with 128-bit keys under AES-128-GCM (or
  ChaCha20-Poly1305), which is measurably faster than AES-256-GCM on the same hardware. Existing objects are unaffected
  and continue to decrypt under their original 256-bit algorithm. The change activates only when the cluster API version
  advances, which happens once every node in the cluster is upgraded — see Migration Notes (#4714, #5740, #5941).
- **Fewer KMS calls per encrypted request**: The unsealed object encryption key is cached on `ObjectInfo` for the
  lifetime of a request, so ETag decryption, block decryption, metadata decryption, and checksum decryption share a
  single unseal. KMS `Decrypt` calls drop from 4–5 to 1 on a `GET` of an SSE-S3 single-part object, and from 3 to 1 on a
  `HEAD` with checksums (#5636).
- **Faster erasure-shard movement between nodes**: Inter-node RDMA raises cluster-internal throughput over TCP on RDMA
  fabrics — see Inter-Node RDMA above for measured figures (#5894).

---

## Bug Fixes

### Encryption and Key Management

- Key rotation no longer breaks decryption of internal configuration. A keyrotate job mixed its `encryption.context` into
  the additional authenticated data (AAD) used to re-encrypt IAM, server configuration, tier configuration, and bucket
  metadata. None of those stores records the caller's context, so none could reproduce it on the next read. Any
  non-empty context therefore left them permanently undecryptable. The job reported success, and the failure only
  surfaced at the next IAM refresh or restart. Rotation of internal subsystems no longer accepts a KMS context; its AAD
  is always derived by the server. Per-object rotation is unchanged, because it stores the context in the object's own
  metadata (#6711).
- Batch keyrotate now preserves the encoded content checksum when encrypting **multipart** objects (#6590).
- KMS failures now return an accurate status code instead of a blanket 500: 503 when the KMS is unreachable, and 499
  (client closed request) when the caller canceled (#5046).
- Suppressed a log flood of "Unable to decryptPartsChecksums" from every object read while the KMS was unreachable or
  requests were canceled, without hiding distinct actionable failures (#6731).
- Corrected the v2 KMS metric deprecation notes: the v3 KMS metrics are deliberately aggregate and carry no endpoint
  label, and `minio_cluster_kms_online` maps to `minio_kms_online` rather than a duration metric (#6716).
- An object that fails integrity verification during a ranged read now returns 400 instead of a 206 partial response
  (#6113).

### RDMA

- Fixed a GET hang caused by a non-idempotent `GetObjectReader.Close()` spinlock that blocked the HTTP response writer.
- Fixed a "concurrent map read and map write" panic when a GET was split across parallel RDMA chunks.
- Fixed PUTs larger than 64 MiB failing with a missing-checksum error when the server split the transfer (#6417).
- Fixed heap corruption and process aborts caused by two ABI mismatches against the vendored RDMA library, now locked
  down with static assertions so a future library bump fails to compile rather than corrupting memory (#3640).
- Plugged C heap memory leaks in the RDMA CGO layer (#3629).
- Transfer failures now return clean errors, and `content-sha256` is skipped on a path that carries no HTTP body (#5605).
- Tolerate a trailing semicolon in client RDMA tokens.
- Closed five further defects in the RDMA and buffer-pool code — including an ETag panic, a ranged-read truncation, and a
  use-after-free — and covered them with tests (#6607).
- Corrected the documented local ACK timeout math, which understated NIC-failure recovery time by roughly 4x.

### Healing and Erasure Coding

- Healing no longer orphans staged parts when the target drive goes faulty mid-heal (#6704).
- Heal quorum-loss detection now uses `DataBlocks` rather than an incorrect parity-derived threshold (#6249).
- `errFileCorrupt` is now included in the quorum check for inconsistent metadata, so a corrupt shard no longer counts
  toward agreement (#4737).

### Replication

- Fixed a data race on the replication resync status map that could crash a node with a concurrent map read/write
  (#6401).
- The replication `Filter` tag cache is now primed at parse time rather than lazily on the hot path (#6080).
- Fixed a division by zero in replication rate measurement when start and end timestamps are equal, which corrupted the
  moving average (#4050).
- A refused conditional request now gets exactly one response. The precondition check ran inside the object layer, wrote
  a 412 itself, and then returned an error that the handler answered a second time. The second body pushed the response
  past its declared `Content-Length`, so the HTTP server dropped the connection — and replication workers read that
  dropped connection as the whole remote target being down. The check now returns its verdict and the handler is the
  only writer (#6765).

### Object API and Object Lock

- Metadata-only `CopyObject` now routes to the pool that holds the target version rather than the pool of the latest
  version (#6625).
- `CompleteMultipartUpload` now rejects unparseable part ETags instead of accepting them (#6078).
- Retention checks on an encryption update now use NTP time rather than local clock time (#6247).

### Stability

- Fixed a panic that broke every S3 request to a bucket whose quality-of-service rule set `rate: 0`. That value is
  documented as valid and means the rule is kept but not enforced. It produced an empty throttle that every request then
  dereferenced (#5135).
- Fixed a process crash when a bucket versioning metadata fetch fails (#4970).
- Fixed a `slices.Max` panic in the cluster-info admin API when parity values were empty (#6251).
- Fixed a nil `rebalMeta` dereference in `checkIfRebalanceDone` (#3720).
- Fixed a data race on `listPathOptions` in the listing abandonment goroutine (#6429).

### Tables

- Fixed a 500 error returned by the Tables maintenance-trigger endpoint (#6729).

---

## Improvements

- **Documentation rewrite**: Core documentation was rewritten in plain language, with duplication removed and factual
  claims verified against the source (#6645).

---

## Security & Compliance

### Software Bill of Materials (SBOM)

This release includes comprehensive SBOM documentation in multiple formats:

- [SPDX JSON](sbom-RELEASE.2026-08-07T18-34-35Z.spdx.json) - Standard SBOM format
- [CycloneDX JSON](sbom-RELEASE.2026-08-07T18-34-35Z.cyclonedx.json) - Security scanner compatible
- [Go Modules](go-modules-RELEASE.2026-08-07T18-34-35Z.txt) - Human-readable dependency list

SBOM files document all direct and transitive dependencies for security auditing and compliance requirements.

---

## Upgrade Instructions

For detailed upgrade instructions, please read: https://docs.min.io/enterprise/aistor-object-store/upgrade-aistor-server/

Platform-specific upgrade guides:

- **Linux/Bare Metal**: https://docs.min.io/enterprise/aistor-object-store/upgrade-aistor-server/upgrade-aistor-linux/
- **Kubernetes with Helm**: https://docs.min.io/enterprise/aistor-object-store/upgrade-aistor-server/upgrade-aistor-kubernetes-helm/

### New Configuration Options

Inter-node RDMA is off by default and is enabled per node:

| Variable                 | Default | Description                                             |
| ------------------------ | ------- | ------------------------------------------------------- |
| `MINIO_RDMA_INTERNODE`   | `off`   | Carry erasure-coded shards between nodes over RDMA      |

Setting this alone is not enough — see Inter-Node RDMA under New Features for the fabric prerequisites.

Transport tuning is exposed through additional `MINIO_RDMA_INTERNODE_*` variables. All are optional, and any value you
leave unset uses a validated default.

### Migration Notes

- **Object encryption algorithm changes after the cluster fully upgrades**: Once every node is on this release, the
  cluster API version advances and newly written encrypted objects use 128-bit keys under AES-128-GCM (or
  ChaCha20-Poly1305) with the `DAREv2-HMAC-SHA256-128` sealing algorithm. Objects written before that point are unchanged
  and continue to decrypt under 256-bit keys. Because older servers do not recognize the new sealing algorithm, rolling
  back to a prior release after the version advances will fail to decrypt objects written in the interim. Set
  `MINIO_API_BUMP_BAKE_TIME` (for example `24h`) to hold the version bump for a soak period before that becomes
  irreversible. FIPS builds are affected identically; AES-128-GCM is FIPS-approved.
- **RDMA requires the dedicated build**: S3 over RDMA and inter-node RDMA are only present in the `minio.rdma` binary,
  packages, and the `.rdma` container image. The standard build is unchanged and unaffected. On that build, S3 over RDMA
  is on by default on RDMA-capable hardware.
- **Inter-node RDMA needs fabric work**: It stays off until you set `MINIO_RDMA_INTERNODE=on`, and requires a lossless
  RoCEv2 fabric with extensive switch-side configuration. Engage MinIO through [SUBNET](https://subnet.min.io) for
  architectural support first.
- **Package names**: Packages now publish under `aistor-*` / `aistor_*` in addition to `minio-*` / `minio_*`. Contents
  and the installed binary path are identical, and the previous filenames still resolve, so existing automation continues
  to work.

### Support

For enterprise support:

- SUBNET Support: https://subnet.min.io
- Documentation: https://docs.min.io
