Back to Rustfs

S3 Compatibility Matrix

docs/architecture/s3-compatibility-matrix.md

1.0.0-rc.14.8 KB
Original Source

S3 Compatibility Matrix

This matrix records the user-facing S3 compatibility claim for RustFS and ties it to the executable Ceph s3tests lists under scripts/s3-tests/.

Current Claim

RustFS provides broad S3 API compatibility for supported features. It does not claim complete coverage of every standard or vendor-specific S3 behavior.

The root README should use the same wording: supported S3-compatible clients and features are covered by the compatibility matrix and test lists.

Test List Sources

ListPurposeCurrent countSource
Implemented testsStandard S3 tests expected to pass and used by the default local s3tests run.452scripts/s3-tests/implemented_tests.txt
Lifecycle behavior testsExpiration behavior cases gated by the dedicated s3-lifecycle-behavior-tests lane (debug-accelerated day + scanner enabled).5scripts/s3-tests/lifecycle_behavior_tests.txt
Unimplemented testsStandard S3 features planned but not yet implemented.17scripts/s3-tests/unimplemented_tests.txt
Excluded testsVendor-specific or intentionally unsupported behavior excluded from RustFS compatibility gating.273scripts/s3-tests/excluded_tests.txt

Counts ignore blank lines and comments.

The lifecycle behavior lane runs real Days-based expiration cases that need RUSTFS_ILM_DEBUG_DAY_SECS (Ceph lc_debug_interval equivalent) and an enabled background scanner; it cannot share the default single-server gate because a global debug day would also shrink the x-amz-expiration header asserted by the test_lifecycle_expiration_header_* cases. See scripts/s3-tests/run.sh (IMPLEMENTED_TESTS_FILE override) and the s3-lifecycle-behavior-tests job in .github/workflows/ci.yml.

Supported Coverage

The implemented test list currently covers the common object-storage surface:

AreaStatusEvidence
Bucket create/delete/list/headSupportedimplemented_tests.txt
Object put/get/delete/copy/headSupportedimplemented_tests.txt
CopyObject checksums (CRC32, CRC32C, CRC64NVME, SHA1, SHA256, MD5, SHA512, XXHASH3, XXHASH64, XXHASH128), including source preservation and explicit overrideSupported in the first RustFS release containing this changecrates/e2e_test/src/copy_object_checksum_test.rs
ListObjects/ListObjectsV2 prefix, delimiter, marker, max-keysSupportedimplemented_tests.txt
Multipart upload create/upload/complete/abort and selected multipart copy/checksum/object-attribute behaviorSupportedimplemented_tests.txt
Bucket and object taggingSupportedimplemented_tests.txt
Bucket policy put/get/deleteSupportedimplemented_tests.txt
Public access block put/get/deleteSupportedimplemented_tests.txt
Presigned GET and PUT URLsSupportedimplemented_tests.txt
Range and conditional readsSupportedimplemented_tests.txt
User metadataSupportedimplemented_tests.txt
SSE-C and selected SSE-KMS edge casesSupportedimplemented_tests.txt
Selected versioning, object-lock, checksum, CORS, raw request, and conditional write behaviorSupportedimplemented_tests.txt

"Supported" for the SSE row means RustFS encrypts and decrypts its own objects. It does not mean RustFS can read objects another implementation encrypted: objects MinIO wrote with SSE-S3, SSE-KMS, or SSE-C are not readable by RustFS today, which matters when migrating. See MinIO file-format interoperability, Part C and rustfs/backlog#1638.

Planned Standard Coverage

These are standard S3 areas that remain planned work and must not be described as already complete:

AreaStatusEvidence
Bucket access loggingPlannedunimplemented_tests.txt
POST Object form upload checksum handlingPlannedunimplemented_tests.txt
Bucket ownership controlsPlannedunimplemented_tests.txt
Multipart upload listing and part lookup compatibility edge casesNot part of default gateexcluded_tests.txt
IAM-account or multi-storage-class dependent casesNot part of default gateunimplemented_tests.txt
Tenanted bucket policy edge casesNeeds investigationunimplemented_tests.txt

Intentional Exclusions

excluded_tests.txt contains tests that should not block the RustFS compatibility gate. They fall into two classes:

  • vendor-specific or non-portable behavior not required for RustFS S3 compatibility;
  • intentionally unsupported product behavior, such as ACL authorization.

Update Rule

When a planned S3 feature is implemented, move its passing test entries from unimplemented_tests.txt to implemented_tests.txt, update this matrix, and avoid changing README wording beyond the supported coverage.