mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 08:18:18 +00:00
4b83efaf36
* ci(ilm): move first batch of 5 s3-tests lifecycle expiration cases into a gated behavior lane (backlog#1148 ilm-10)
The 20 lifecycle cases in excluded_tests.txt were labeled "vendor-specific"
but the real blocker was the absence of a Ceph lc_debug_interval equivalent.
RUSTFS_ILM_DEBUG_DAY_SECS (ilm-5) now provides that, so Days>=1 expiration
behavior is testable in seconds.
These cases assert that objects/versions/uploads are actually removed by the
background scanner and the stale-multipart cleanup loop. They cannot join the
default single-server s3-implemented-tests gate: it disables the scanner, and a
global RUSTFS_ILM_DEBUG_DAY_SECS also shrinks the x-amz-expiration header that
the already-passing test_lifecycle_expiration_header_* cases assert on. So this
adds an isolated lane instead of putting them in implemented_tests.txt.
First batch (5), each verified against the pinned upstream source and the
RustFS evaluator/scanner/stale-multipart execution paths:
- test_lifecycle_expiration (prefix Days=1/Days=5, scanner delete)
- test_lifecyclev2_expiration (same via ListObjectsV2)
- test_lifecycle_noncur_expiration (NoncurrentVersionExpiration)
- test_lifecycle_deletemarker_expiration (ExpiredObjectDeleteMarker cascade)
- test_lifecycle_multipart_expiration (AbortIncompleteMultipartUpload)
Dropped from the batch, kept excluded with reason:
- test_lifecycle_expiration_days0: RustFS accepts Expiration{Days:0} (returns
200; only Days<0 is rejected in crates/lifecycle/src/core.rs validate()),
while AWS/this test expect InvalidArgument. Real validation gap.
Changes:
- scripts/s3-tests/lifecycle_behavior_tests.txt: new exact-node-id run set.
- scripts/s3-tests/run.sh: honor an IMPLEMENTED_TESTS_FILE override so a lane
can point at an alternate whitelist.
- .github/workflows/ci.yml: new s3-lifecycle-behavior-tests PR-gate job that
starts rustfs with RUSTFS_ILM_DEBUG_DAY_SECS=10, scanner enabled (cycle 2s,
no start delay) and a 2s stale-multipart cleanup interval, running the new
list serially.
- scripts/s3-tests/report_compat.py: recognize the behavior list so the weekly
scope=all sweep (plain server) does not misclassify expected failures.
- scripts/s3-tests/excluded_tests.txt: remove the 5 enabled cases; re-annotate
the remaining 15 lifecycle exclusions with real reasons + batch-2 plan.
- docs/architecture/s3-compatibility-matrix.md: sync counts (implemented 451,
excluded 274, behavior 5) and document the lane.
Refs backlog#1148 (ilm-10), master plan backlog#1155.
* fix(lifecycle): reject zero-day expiration/noncurrent/abort rules (backlog#1148 ilm-10) (#4722)
41 lines
2.2 KiB
Plaintext
41 lines
2.2 KiB
Plaintext
# Lifecycle behavior tests (ceph/s3-tests) — backlog#1148 ilm-10, master plan #1155
|
|
# =================================================================================
|
|
#
|
|
# These upstream lifecycle tests exercise *real expiration behavior*: they PUT a
|
|
# lifecycle rule with Days/NoncurrentDays/DaysAfterInitiation, sleep a multiple of
|
|
# the debug interval, then assert objects/versions/uploads were actually removed by
|
|
# the background scanner and the stale-multipart cleanup loop.
|
|
#
|
|
# They CANNOT run in the default single-server gate (implemented_tests.txt) because:
|
|
# 1. The default harness disables the background scanner (run.sh sets
|
|
# RUSTFS_SCANNER_ENABLED=false) — nothing expires.
|
|
# 2. A real day is 86400s; without acceleration a Days=1 rule takes 24h.
|
|
# 3. Enabling RUSTFS_ILM_DEBUG_DAY_SECS *globally* would break the already-passing
|
|
# x-amz-expiration header tests (test_lifecycle_expiration_header_*), which
|
|
# assert `(expiry-date - now).days == Days` — the header is computed from the
|
|
# same debug-scaled expected_expiry_time().
|
|
#
|
|
# So this list is run by a DEDICATED lane (ci.yml job `s3-lifecycle-behavior-tests`)
|
|
# against a server started with:
|
|
# RUSTFS_ILM_DEBUG_DAY_SECS=10 (1 "day" = 10s, matches s3-tests lc_debug_interval)
|
|
# RUSTFS_SCANNER_ENABLED=true
|
|
# RUSTFS_SCANNER_CYCLE=2 (scan every 2s, well under a debug-day)
|
|
# RUSTFS_SCANNER_START_DELAY_SECS=0
|
|
# RUSTFS_API_STALE_UPLOADS_CLEANUP_INTERVAL=2s (multipart abort lane)
|
|
#
|
|
# Point run.sh at this file with IMPLEMENTED_TESTS_FILE=<this path>.
|
|
#
|
|
# First batch (ilm-10). Each entry was verified against the pinned upstream source
|
|
# and the RustFS evaluator/scanner/stale-multipart execution paths.
|
|
|
|
# Basic prefix expiration: Days=1 / Days=5 rules, scanner-driven deletion.
|
|
test_lifecycle_expiration
|
|
# Same as above but validates ListObjectsV2 sees the expirations.
|
|
test_lifecyclev2_expiration
|
|
# Versioned NoncurrentVersionExpiration (NoncurrentDays): noncurrent versions removed.
|
|
test_lifecycle_noncur_expiration
|
|
# ExpiredObjectDeleteMarker + NoncurrentVersionExpiration cascade on a versioned bucket.
|
|
test_lifecycle_deletemarker_expiration
|
|
# AbortIncompleteMultipartUpload (DaysAfterInitiation): stale-multipart cleanup loop.
|
|
test_lifecycle_multipart_expiration
|