马登山
29c2f247c3
Merge remote-tracking branch 'origin/main' into cxymds/fix-transition-identity-flake
2026-07-29 15:09:04 +08:00
cxymds
d9efd6b853
feat(ecstore): add remote snapshot lease RPCs ( #5389 )
...
* feat(ecstore): add local snapshot leases
* feat(ecstore): add remote snapshot lease RPCs
* fix(rpc): keep snapshot lease checks CI-compatible
2026-07-29 15:06:18 +08:00
cxymds
2801b2500d
fix(tiering): gate remote version state writes ( #5382 )
...
* feat(tiering): model provider version capabilities
* feat(tiering): persist opaque remote versions
* fix(tiering): gate remote version state safely
* fix(tiering): gate remote version state writes
* fix(tiering): preserve remote version state on delete
* fix(tiering): accept unversioned transition responses
* fix(tiering): replay exact cleanup journals
* test(tiering): pin empty exact cleanup guard
* test(tiering): accept strict missing journal errors
* test(tiering): exercise free-version identity guard
* test(tiering): reach destination identity guard
* test(tiering): persist version identity drift
* test(tiering): bind version drift fixture
* test(config): keep fleet gate tests after constants
2026-07-29 15:06:08 +08:00
cxymds
02f4dbeb68
fix(heal): fail closed on ambiguous metadata rescue ( #5361 )
...
* fix(heal): fail closed on ambiguous metadata rescue
* fix(heal): preserve uncertain dangling state
* test(heal): satisfy strict clippy checks
* fix(heal): retain explicit version metadata recovery
* fix(heal): preserve metadata rescue diagnostics
---------
Co-authored-by: houseme <housemecn@gmail.com >
2026-07-29 15:06:01 +08:00
cxymds
f7757e6437
test(ecstore): rendezvous concurrent resend commits ( #5411 )
...
* test(ecstore): rendezvous concurrent resend commits
* test(ecstore): satisfy multipart barrier lint
2026-07-29 15:05:53 +08:00
cxymds
1cb1b02b08
fix(ecstore): prevent deleted bucket recreation ( #5380 )
...
* fix(ecstore): prevent deleted bucket recreation
* fix(ecstore): reject empty metadata bucket names
* fix(ecstore): avoid recursive bucket metadata lookup
* fix(ecstore): bound lazy metadata future stack use
* test(ecstore): create bucket before metadata reload
---------
Co-authored-by: houseme <housemecn@gmail.com >
2026-07-29 14:49:18 +08:00
Zhengchao An
3fe74a5019
fix(swift): merge account and container metadata POSTs ( #5414 )
2026-07-29 06:36:07 +00:00
Zhengchao An
451cbc099b
fix(tier): keep converging peers that reject a config reload ( #5412 )
2026-07-29 14:24:26 +08:00
cxymds
b683bf236e
Merge branch 'main' into cxymds/fix-transition-identity-flake
2026-07-29 14:00:26 +08:00
cxymds
cb62079ba6
test(ilm): make active cancellation deterministic ( #5403 )
...
* ci: preserve timeout evidence for workspace tests
* test(ilm): make active cancellation deterministic
* ci: allow cold doctest compilation to finish
---------
Co-authored-by: houseme <housemecn@gmail.com >
2026-07-29 13:53:59 +08:00
Zhengchao An
d39ffdb1cd
fix(filemeta): canonicalize version order after insert ( #5413 )
2026-07-29 05:49:00 +00:00
马登山
9aa5a7d956
Merge remote-tracking branch 'origin/cxymds/fix-rio-resend-lock-timeout' into cxymds/fix-transition-identity-flake
2026-07-29 13:38:06 +08:00
马登山
0dcf929ebc
Merge remote-tracking branch 'origin/main' into cxymds/fix-transition-identity-flake
...
# Conflicts:
# crates/ecstore/src/set_disk/ops/object.rs
2026-07-29 13:37:51 +08:00
马登山
1ae87c5990
test(ecstore): satisfy multipart barrier lint
2026-07-29 13:36:39 +08:00
cxymds
7ac419fe39
Merge branch 'main' into cxymds/fix-rio-resend-lock-timeout
2026-07-29 13:23:43 +08:00
Zhengchao An
7d698abc1f
ci(checksums): inherit workspace lint policy ( #5415 )
2026-07-29 12:53:45 +08:00
hector
a1a65ad65d
fix(action): change quay.io image repository name ( #5417 )
2026-07-29 12:53:26 +08:00
cxymds
358af6a8de
ci: preserve timeout evidence for workspace tests ( #5402 )
...
* ci: preserve timeout evidence for workspace tests
* ci: allow cold doctest compilation to finish
* ci: allow cold nextest compilation to finish
* ci: allow cold nextest compilation to finish
---------
Co-authored-by: houseme <housemecn@gmail.com >
2026-07-29 04:49:03 +00:00
Zhengchao An
90d1a15d13
fix(ecstore): classify peer RPC failures by gRPC status code ( #5400 )
2026-07-29 11:35:09 +08:00
马登山
a02ca95093
test(ecstore): rendezvous concurrent resend commits
2026-07-29 11:28:06 +08:00
cxymds
2423ba8e3f
fix(tiering): base restore expiry on completion ( #5366 )
...
* fix(tiering): base restore expiry on completion
* fix(tiering): import restore metadata types
* fix(restore): resolve metadata finalization build errors
* test(ecstore): import restore expiry helper
2026-07-29 02:55:00 +00:00
cxymds
294c79c156
fix(tiering): gate remote version state safely ( #5374 )
...
* feat(tiering): model provider version capabilities
* feat(tiering): persist opaque remote versions
* fix(tiering): gate remote version state safely
* fix(tiering): preserve remote version state on delete
* fix(tiering): accept unversioned transition responses
* fix(tiering): replay exact cleanup journals
* test(tiering): pin empty exact cleanup guard
* test(tiering): accept strict missing journal errors
* test(tiering): exercise free-version identity guard
* test(tiering): reach destination identity guard
* test(tiering): persist version identity drift
* test(tiering): bind version drift fixture
---------
Co-authored-by: houseme <housemecn@gmail.com >
2026-07-29 02:43:28 +00:00
cxymds
3d80578abd
feat(ecstore): add local data-dir snapshot leases ( #5388 )
...
feat(ecstore): add local snapshot leases
Co-authored-by: houseme <housemecn@gmail.com >
2026-07-29 02:42:35 +00:00
Zhengchao An
957080bea5
fix(swift): persist container and account metadata writes ( #5398 )
...
Swift container and account metadata handlers cloned the cached
BucketMetadata, set the tagging fields, and called set_bucket_metadata,
which only updates the in-memory cache map. Nothing reached
.metadata.bin, so every Swift metadata POST was lost on restart and
silently overwritten by the next disk-truth reload (a peer
LoadBucketMetadata notification or the 15-minute refresh loop) — while
the client had already been told 2xx.
Route these writes through a new metadata_sys::update_config_with: a
read-modify-write that loads the on-disk metadata and persists the
result under the same write guard metadata_sys::update uses, so the
rewrite merges against disk truth instead of a possibly stale cache and
cannot clobber a concurrent update to another config file. Peers are
notified afterwards, matching the S3 config handlers.
Persisting these writes required hardening the paths that now produce
durable state:
- Account metadata writes validate account ownership. This metadata
holds the account's TempURL signing key, so an unauthenticated write
for someone else's account would have become a durable, cluster-wide
takeover of that account's pre-signed URLs. Reads stay open because
TempURL signature validation runs before credentials exist.
- disable_versioning verifies the container exists. Without it the
metadata loader's "no metadata on disk" default would be persisted,
creating an orphan metadata file and caching a fabricated default as
authoritative.
- Container and account metadata are size- and count-limited, reusing
the Swift limits object metadata already enforces; these tags land in
the bucket metadata file that every later config write rewrites whole.
- A rewrite refuses to run when the persisted tagging config is
unreadable, instead of merging onto an empty set and wiping the
container ACL and versioning tags. It reports 409 naming the remedy.
- Storage errors are logged in full and reported generically, since they
now carry real disk and quorum detail.
The tagging arm of BucketMetadata::update_config also clears the parsed
config, as the lifecycle arm does: parse_all_configs skips empty XML
rather than clearing, so a cleared config kept serving the old tags.
Tagging is serialized with the S3 XML serializer the loader can parse
back, not quick_xml, whose output was never round-trippable.
2026-07-29 02:31:11 +00:00
houseme
c6d42a5355
Merge branch 'main' into cxymds/fix-transition-identity-flake
2026-07-29 09:58:50 +08:00
cxymds
c1538cf1c3
fix(multipart): serialize complete and abort ( #5356 )
...
* fix(multipart): serialize complete and abort
* test(multipart): order abort-first finalization
* fix(multipart): enforce quorum staging cleanup
* fix(multipart): remove stale mutable binding
2026-07-29 01:49:19 +00:00
houseme
5af56cbb02
test(ci): stabilize lifecycle timeout coverage ( #5404 )
...
Co-authored-by: heihutu <heihutu@gmail.com >
2026-07-29 01:37:29 +00:00
houseme
f99956eade
test(lifecycle): classify mixed rollout harness results ( #5384 )
...
* test(lifecycle): classify mixed rollout harness results
Classify Docker #1508 evidence as strict, baseline, blocked, or failed so tiered-storage baseline runs cannot be mistaken for strict mixed-version rollout closure evidence.
Co-Authored-By: heihutu <heihutu@gmail.com >
* test: classify Docker manual transition preemption
Co-Authored-By: heihutu <heihutu@gmail.com >
---------
Co-authored-by: heihutu <heihutu@gmail.com >
2026-07-29 01:21:23 +00:00
houseme
775279b6fd
fix(notify): defer disabled bootstrap storage refresh ( #5373 )
...
Co-authored-by: heihutu <heihutu@gmail.com >
2026-07-28 17:39:22 +00:00
马登山
4826c0207e
test(ecstore): remove invalid transition version drift case
2026-07-28 20:38:18 +08:00
cxymds
eb755e2b97
fix(auth): compare sensitive tokens in constant time ( #5371 )
...
* fix(auth): compare sensitive tokens in constant time
* test(auth): scope constant-time source guard
* test(auth): ignore test source in comparison guard
* chore(deps): use constant-time s3s authentication
2026-07-28 17:56:22 +08:00
cxymds
7f146fc5de
feat(tiering): model provider version capabilities ( #5372 )
2026-07-28 17:42:08 +08:00
cxymds
5426237a49
fix(filemeta): preserve canonical version order ( #5353 )
2026-07-28 17:38:59 +08:00
cxymds
d7afa4e38e
fix(heal): report partial rename failures ( #5355 )
...
* fix(heal): report partial rename failures
* fix(log-analyzer): track partial heal rename failures
2026-07-28 17:37:02 +08:00
cxymds
a3f5a8eaf9
fix(ecstore): fence object tagging updates ( #5360 )
...
* fix(ecstore): fence object tagging updates
* test(ecstore): stabilize tagging lock regressions
* test(ecstore): restore setup type on current-thread runtime
2026-07-28 17:36:00 +08:00
cxymds
547c678eed
fix(filemeta): reject positive size without parts ( #5354 )
...
* fix(filemeta): reject positive size without parts
* test(ecstore): keep optimized read fixture valid
* test(ecstore): keep listing fixtures valid
2026-07-28 17:35:53 +08:00
cxymds
df945b275a
fix(lifecycle): recover saturated scanner tasks ( #5369 )
2026-07-28 17:30:52 +08:00
cxymds
2e78a49c95
fix(lifecycle): reject invalid modification times ( #5370 )
2026-07-28 17:23:21 +08:00
cxymds
7ad0e726db
fix(ecstore): use set read quorum for version reads ( #5365 )
...
* fix(ecstore): use set read quorum for version reads
* fix(ecstore): convert optimized read batch errors
2026-07-28 17:23:15 +08:00
cxymds
45c3386b68
fix(bitrot): reject trailing shard data ( #5358 )
...
* fix(bitrot): reject trailing shard data
* test(ecstore): align bitrot disk fixture type
2026-07-28 17:23:08 +08:00
cxymds
7af92b4f54
fix(ecstore): handle pre-epoch disk health clocks ( #5383 )
2026-07-28 17:22:26 +08:00
cxymds
daa627ee0e
fix(auth): enforce presigned URL expiry limit ( #5368 )
...
* fix(auth): enforce presigned URL expiry limit
* ci(deny): allow presigned expiry s3s fork
* chore(deps): update presigned expiry validation
2026-07-28 17:11:30 +08:00
cxymds
5c3d3a8220
fix(ecstore): handle mutex poisoning explicitly ( #5379 )
...
* fix(ecstore): handle mutex poisoning explicitly
* test(ecstore): satisfy poison assertion lint
2026-07-28 17:09:09 +08:00
cxymds
6bc5fc77b5
fix(notify): emit noop event for missing deletes ( #5381 )
2026-07-28 17:05:10 +08:00
cxymds
e822fc1552
fix(swift): enforce cumulative container quotas ( #5378 )
2026-07-28 17:05:04 +08:00
cxymds
2f6115e058
fix(swift): enforce TempURL IP restrictions ( #5377 )
2026-07-28 17:04:58 +08:00
cxymds
882e1a71b1
fix(tiering): abort failed multipart restores ( #5367 )
...
* fix(tiering): abort failed multipart restores
* fix(tiering): compile restore abort regressions
* test(tiering): assert restored multipart metadata
* test(tiering): parse completed restore status
2026-07-28 17:04:52 +08:00
cxymds
b432f31c2c
fix(multipart): preserve retried parts on quorum failure ( #5363 )
...
* fix(multipart): preserve retried parts on quorum failure
* style(multipart): format transaction rollback
* fix(proto): regenerate multipart transaction RPCs
* fix(multipart): import rollback marker constant
* fix(multipart): export transaction action
* fix: import multipart transaction test requests
2026-07-28 17:04:46 +08:00
cxymds
6e0640444e
fix(multipart): list uploads across all sets ( #5362 )
2026-07-28 17:04:40 +08:00
cxymds
4fb9b0dc7f
fix(authz): fail closed on policy load errors ( #5359 )
...
* fix(authz): fail closed on policy load errors
* test(authz): cover policy failure precedence
* test: align policy failure expectations
* test: align upload part copy fail-closed expectation
2026-07-28 17:04:35 +08:00