Commit b6721d2
committed
Fix Multi-Level Namespace Signing & Add Iceberg Compatibility Tests
This PR fixes a critical SignatureDoesNotMatch (403) error for multi-level namespace
operations and adds comprehensive Iceberg REST Compatibility Kit (RCK) test coverage.
Changes
Bug Fixes
1. Multi-Level Namespace Signature Mismatch
Problem: All operations on multi-level namespaces (e.g., ["parent", "child"]) failed with
SignatureDoesNotMatch (403).
Root Cause: The Iceberg REST Catalog spec uses \u{001F} (unit separator) to join namespace
levels. When URL-encoded, this becomes %1F. However, AWS SigV4 requires the canonical URI
to be fully URI-encoded, meaning % must be encoded as %25 (so %1F becomes %251F).
The client was signing with %1F, but MinIO server's signature-v4.go:96 calls s3utils.EncodePath()
which produces %251F.
2. DataFusion ETag Type Mismatch
Fixed type error in src/s3tables/datafusion/object_store.rs where PartInfo::new() received String
instead of ETag.
3. Removed Unsupported Scan Planning Test
Removed test_server_accepts_filter_json_format from datafusion_full_integration.rs as MinIO server does
not support the scan planning API (returns 400 "unsupported API call").
New Test Coverage
- iceberg_catalog_compat.rs - 15 tests for namespace/table properties, schema management
- iceberg_view_compat.rs - 20 tests for view properties, versions, SQL dialects
- iceberg_transactions_compat.rs - 19 tests for data append, concurrent operations
- catalog_api_compliance.rs - 26 tests for HTTP headers, edge cases, error responses
- Total: 80 new tests for full Iceberg RCK coverage
Documentation
Added tests/s3tables/README.md with:
- Test categories and how to run them
- Multi-level namespace compliance explanation
- RCK test alignment details
- Troubleshooting guide
CI/CD
Added .github/workflows/s3tables-integration.yml with jobs for:
- Basic S3 Tables integration tests
- Iceberg compatibility tests (Phases 1-4)
- Advanced/concurrent operations
- DataFusion integration
- Stress tests (manual trigger)
How to Test
1. Start MinIO Server
MINIO_ROOT_USER=minioadmin \
MINIO_ROOT_PASSWORD=minioadmin \
MINIO_SITE_REGION=us-east-1 \
./minio server /tmp/minio-data --console-address ":9001"
2. Set Environment Variables
export SERVER_ENDPOINT=localhost:9000
export ACCESS_KEY=minioadmin
export SECRET_KEY=minioadmin
export SERVER_REGION=us-east-1
export TABLES_ENDPOINT=http://localhost:9000
3. Run the tests
cargo test -p minio s3tables:: -- --test-threads=4
cargo test -p minio iceberg_catalog_compat -- --nocapture
cargo test -p minio iceberg_view_compat -- --nocapture
cargo test -p minio iceberg_transactions_compat -- --nocapture
cargo test -p minio rck_conformance::nested -- --nocapture
Signed-off-by: Shubhendu Ram Tripathi <shubhendu@minio.io>1 parent 10dcc20 commit b6721d2
File tree
21 files changed
+6583
-185
lines changed- .github/workflows
- common/src
- src
- s3tables
- client
- datafusion
- types
- s3
- tests/s3tables
21 files changed
+6583
-185
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
30 | 30 | | |
31 | 31 | | |
32 | 32 | | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
33 | 36 | | |
34 | 37 | | |
35 | 38 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
23 | 23 | | |
24 | 24 | | |
25 | 25 | | |
| 26 | + | |
| 27 | + | |
26 | 28 | | |
27 | 29 | | |
28 | 30 | | |
29 | 31 | | |
30 | 32 | | |
31 | 33 | | |
| 34 | + | |
| 35 | + | |
32 | 36 | | |
33 | 37 | | |
34 | 38 | | |
| |||
38 | 42 | | |
39 | 43 | | |
40 | 44 | | |
41 | | - | |
| 45 | + | |
| 46 | + | |
42 | 47 | | |
43 | 48 | | |
44 | 49 | | |
45 | 50 | | |
| 51 | + | |
| 52 | + | |
46 | 53 | | |
47 | 54 | | |
48 | 55 | | |
| |||
52 | 59 | | |
53 | 60 | | |
54 | 61 | | |
55 | | - | |
| 62 | + | |
| 63 | + | |
56 | 64 | | |
57 | 65 | | |
58 | 66 | | |
59 | | - | |
| 67 | + | |
60 | 68 | | |
61 | 69 | | |
| 70 | + | |
| 71 | + | |
62 | 72 | | |
63 | 73 | | |
64 | 74 | | |
| |||
0 commit comments