RustFS Backend
August 29, 2026 ยท View on GitHub
Status: optional S3-compatible provider profile, not a metadata or namespace architecture.
RustFS is one S3-compatible object provider for NoKV artifact blocks. It does not own namespace metadata, root placement, revision reachability, or garbage collection policy.
Boundary
native full CLI / Python SDK / lower-level Rust SDK
-> NoKV metadata and publication service
-> S3-compatible object interface
-> RustFS
NoKV sends immutable block puts, ranged gets, integrity checks, and fenced deletes through the common object package. The NoKV metadata schema remains the authority for paths, manifests, references, operations, and deletion eligibility. Holt is the current serving local metadata adapter.
Deployment Identity
Treat these values as one reviewed deployment profile:
endpoint
region
bucket
access identity
credential source
TLS and certificate policy
path-style or virtual-host addressing
multipart limits
request timeout and retry policy
Credentials are supplied by environment or a secret manager and must not be written into metadata, manifests, logs, examples, or object keys.
The durable block key remains:
nokv/artifacts/{logical_shard_id}/{root_id}/{artifact_revision_id}/blocks/{object_index}
Changing the endpoint or physical RustFS node does not change that identity.
The bucket plus configured prefix contains one immutable, provider-neutral identity marker:
nokv/system/object-namespace
The control plane binds each RootId to the marker's ObjectNamespaceId
exactly once. Routes carry that ID, and the Holt root fence persists it in the
same metadata authority that enforces placement generation and owner epoch.
Endpoint, bucket, prefix, and credentials remain deployment configuration; NoKV
does not copy provider-specific values into metadata.
Consequently, two healthy RustFS prefixes are not interchangeable. A process configured with the wrong prefix observes a different or absent marker and is rejected before it can publish a route or use that provider for artifact or lifecycle operations. A changed endpoint is safe only when it resolves to the same durable namespace marker.
Required Bucket Behavior
Before serving business writes, NoKV runs endpoint-specific write-conformance admission using reserved, unreferenced system keys. The current v1 profile verifies:
- a fresh single-PUT create-if-absent;
- an exact-byte replay and a different-byte collision;
- whole-object readback and an exact ranged read;
- a concurrent different-byte create race with exactly one stored winner.
The admission receipt is scoped to the exact provider handle and exercised
single-PUT profile: the handle owns an immutable connection profile, and the
receipt records the maximum object size exercised by the probe. A provider
name or a static true capability is insufficient; another handle or a block
above that profile is rejected. Multipart upload, completion, and abort are not
qualified by admission v1 and must remain fail-closed until a separate endpoint
probe covers them.
The deployment must additionally ensure:
- timeout and retry settings preserve ambiguous outcomes for reconciliation;
- lifecycle policies cannot delete reachable NoKV objects independently;
- bucket listing is not required for metadata recovery or reachability.
NoKV should use a dedicated bucket or an exclusive prefix with a policy that prevents writes outside that boundary.
Local Development
A local RustFS deployment is suitable for integration tests when the test records:
- exact RustFS image or binary version;
- endpoint and TLS mode;
- clean or reused data directory;
- bucket initialization;
- NoKV durability profile;
- injected provider failures.
Keep RustFS data and Holt metadata in separate durable directories. Removing one does not safely reset the other; create a fresh paired test deployment instead of mixing prior metadata with an empty object directory.
The checked-in local launcher uses a Docker-managed volume by default because
the pinned RustFS image runs as non-root UID/GID 10001:10001. An explicit
NOKV_WORKBENCH_RUSTFS_DATA_DIR host bind mount is supported only when that
directory is already writable by the container user. CI gates use isolated
named volumes; the gate or workflow cleanup removes them after qualification.
Compatibility Evidence
One executed compatibility probe against Homebrew MinIO
RELEASE.2025-09-06T17-38-46Z was classified as inconclusive and stopped
before business publication. That result applies only to the exercised binary,
configuration, and run; it is not a claim about every MinIO release or
deployment.
Failure Semantics
Publication follows object-first, metadata-last ordering:
- upload blocks;
- verify completion evidence;
- publish metadata;
- acknowledge the deterministic result.
If metadata publication fails, staged-object records drive cleanup. If delete completion is uncertain, the operation enters quarantine and reconciliation. The system does not infer success from a later bucket listing.
Temporary provider failures remain retryable across the object, client, and
Workbench error boundaries. After bounded attempts, callers receive
ObjectUnavailable with retryable: true and an attempt count. Public
provider-admission errors and ambiguous create/delete errors do not include
endpoint, bucket, prefix, or physical object keys. Immutable create and delete
operations with ambiguous completion remain reconciliation cases rather than
blind retries.
Existing Roots
Roots created before object-namespace binding have no durable evidence from which NoKV could infer the historical bucket/prefix. Automatic adoption would therefore make a typo authoritative. Upgrade them only while all owners are stopped and after an operator verifies the exact existing object profile:
nokv \
--root-id ROOT_HEX32 \
--etcd-endpoint ETCD_URL \
--object-bucket BUCKET \
--object-endpoint S3_URL \
--object-root PREFIX \
provision LOGICAL_SHARD_HEX32 \
--adopt-legacy-object-namespace
Without the explicit flag, provisioning an existing unbound root fails before
creating a marker or control binding. The next --metadata-reopen validates
the control binding and upgrades the legacy Holt root fence through the normal
owner-fenced metadata command and recovery outbox. Existing v1 root-fence and
v2 recovery bytes remain readable and re-encode canonically.
The legacy None decode and explicit adoption path may be removed only after
every supported deployment proves that all root control bindings and Holt root
fences contain an ObjectNamespaceId, and the documented upgrade window has
ended. It must never be replaced by implicit adoption.
Qualification
Full RustFS qualification still requires:
- single and multipart publication;
- exact and ranged reads;
- checksum and length mismatch;
- timeout before and after provider completion;
- abort and staged cleanup;
- zero-reference deletion;
- ambiguous-delete reconciliation;
- process restart and owner replacement;
- healthy wrong-prefix rejection without owner-epoch or payload mutation;
- provider outage returning a redacted retryable error and the same logical request succeeding after provider recovery;
- throughput and latency under the declared payload/concurrency matrix.
Retain raw evidence using Benchmarks and Workspace Acceptance. An endpoint admission receipt qualifies only the exercised single-PUT and range-read contract. It does not by itself qualify multipart behavior, exact crash recovery, process restart, owner replacement, or ambiguous-completion reconciliation.