Commit Graph
5352 Commits
Author SHA1 Message Date
hectorandGitHub 95627cb601 fix: create config file before fpm RPM packaging (#5924)
The RPM build step fails because fpm's --config-files flag requires
/etc/default/rustfs to exist in the staging area, but unlike the DEB
build (which creates it in its package directory structure), the fpm
command has no prior step creating this file.

Create the config file in a temporary directory and pass it to fpm
via a source=dest mapping, matching the DEB build's behavior.
2026-08-10 08:15:15 +00:00
d97e059c3c fix(iam): merge OIDC extra root CAs (#5915)
Co-authored-by: heihutu <[email protected]>
2026-08-10 15:24:52 +08:00
d900e11a09 perf(ecstore): expose replay cache RPC sources (#5926)
Track accepted replay cache records by gRPC operation and split Lock/Unlock and ReadVersion methods out of grpc_other so hotpath validation can attribute nonce pressure without changing replay protection semantics.

Co-authored-by: heihutu <[email protected]>
2026-08-10 15:13:27 +08:00
f1ff9a36bc test(heal): cover replacement terminal recovery (#5920)
Co-authored-by: heihutu <[email protected]>
2026-08-10 14:51:26 +08:00
276eea1fba test(heal): cover replacement target evidence failures (#5919)
Co-authored-by: heihutu <[email protected]>
2026-08-10 14:50:55 +08:00
88e285c523 perf(ecstore): gate bounded GET metadata fanout (#5917)
Co-authored-by: heihutu <[email protected]>
2026-08-10 05:20:21 +00:00
785ee719e7 feat(heal): aggregate replacement recovery status (#5916)
Add a replacement recovery peer RPC so Admin v4 can distinguish definitive cluster proofs from unsupported, unavailable, or conflicting peer state without extending the existing background heal v3/v1 status protocol.

Co-authored-by: heihutu <[email protected]>
2026-08-10 05:03:27 +00:00
Zhengchao AnandGitHub a8c15e90ec docs(agents): tighten production code growth rules (#5907) 2026-08-10 11:12:52 +08:00
hectorandGitHub 63b564d064 fix: prevent tilde expansion in DEB version substitution (#5913)
The DEB version substitution used ${VERSION/-/~} which caused bash
to expand ~ to $HOME (e.g. /home/runner), producing an invalid
version string like '1.0.0/home/runnerrc.1'.

Store ~ in a variable first to prevent tilde expansion.
2026-08-10 11:11:49 +08:00
d51191f81b build(deps): use RustFS s3s fork (#5901)
* build(deps): use RustFS s3s fork

* ci: allow RustFS s3s source

---------

Co-authored-by: houseme <[email protected]>
2026-08-10 02:45:49 +00:00
1aeb84dd6b feat(heal): expose replacement recovery status (#5912)
Add a v4 admin status endpoint for local durable automatic replacement recovery records without changing the v3 background heal status or peer v1 payloads.

Co-authored-by: heihutu <[email protected]>
2026-08-10 01:48:18 +00:00
f17ea7f146 fix(heal): harden replacement rebuild tracking (#5892)
* fix(heal): gate auto replacement formatting

Co-Authored-By: heihutu <[email protected]>

* fix(heal): require replacement target outcomes

Co-Authored-By: heihutu <[email protected]>

* fix(heal): bind resumes to replacement targets

Co-Authored-By: heihutu <[email protected]>

* fix(heal): fence healing marker ownership

Co-Authored-By: heihutu <[email protected]>

* test(heal): cover replacement target completion

Co-Authored-By: heihutu <[email protected]>

* docs(heal): clarify replacement recovery status

Co-Authored-By: heihutu <[email protected]>

* fix(heal): canonicalize replacement target checks

Co-Authored-By: heihutu <[email protected]>

* fix(heal): satisfy marker test module lint

Co-Authored-By: heihutu <[email protected]>

* fix(heal): scope automatic replacement format

Co-Authored-By: heihutu <[email protected]>

* fix(heal): require a mounted replacement target

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): avoid cloned ref slice in test

Co-Authored-By: heihutu <[email protected]>

* fix(heal): revalidate replacement before scanning

Co-Authored-By: heihutu <[email protected]>

* fix(heal): reset stale resume checkpoints

Co-Authored-By: heihutu <[email protected]>

* fix(heal): release scanner disk map before probing

Co-Authored-By: heihutu <[email protected]>

* fix(heal): persist replacement intent before format

Co-Authored-By: heihutu <[email protected]>

* fix(heal): fail closed on mountinfo read errors

Co-Authored-By: heihutu <[email protected]>

* fix(heal): fence replacement target identity

Co-Authored-By: heihutu <[email protected]>

* fix(heal): order replacement completion cleanup

Co-Authored-By: heihutu <[email protected]>

* fix(heal): atomically seal replacement completion

Co-Authored-By: heihutu <[email protected]>

* test(heal): census replacement target shards

Co-Authored-By: heihutu <[email protected]>

* fix(heal): fence replacement recovery ownership

Co-Authored-By: heihutu <[email protected]>

* fix(heal): preserve replacement recovery anchors

Co-Authored-By: heihutu <[email protected]>

* fix(heal): satisfy replacement recovery lint gates

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): bind replacement identity to mount lease

Co-Authored-By: heihutu <[email protected]>

* test(heal): cover durable replacement recovery states

Co-Authored-By: heihutu <[email protected]>

* fix(heal): validate persisted resume task identifiers

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): avoid blocking replacement marker CAS

Co-Authored-By: heihutu <[email protected]>

* fix(heal): report failed marker rollback

Co-Authored-By: heihutu <[email protected]>

* test(heal): pin replacement resume schema compatibility

Co-Authored-By: heihutu <[email protected]>

* fix(heal): preserve durable recovery anchors

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): preserve public disk path semantics

Co-Authored-By: heihutu <[email protected]>

* test(heal): use canonical replacement task ids

Co-Authored-By: heihutu <[email protected]>

* test(heal): cover automatic replacement in 3x4 cluster

Co-Authored-By: heihutu <[email protected]>

* fix(heal): verify replacement target commits

Co-Authored-By: heihutu <[email protected]>

* fix(heal): persist replacement completion proof

Co-Authored-By: heihutu <[email protected]>

* feat(heal): expose durable replacement status

Co-Authored-By: heihutu <[email protected]>

* fix(heal): bound durable replacement discovery

Co-Authored-By: heihutu <[email protected]>

* fix(heal): remove replacement readiness bypass

Co-Authored-By: heihutu <[email protected]>

* fix(heal): retry terminal replacement cleanup

Co-Authored-By: heihutu <[email protected]>

* fix(heal): isolate replacement intents from legacy resume

Co-Authored-By: heihutu <[email protected]>

* fix(heal): migrate legacy replacement intents at startup

Co-Authored-By: heihutu <[email protected]>

* style(heal): apply strict clippy fix

Co-Authored-By: heihutu <[email protected]>

* fix(heal): prioritize active replacement recovery state

Co-Authored-By: heihutu <[email protected]>

* fix(heal): bind readiness to the admitted mount lease

Co-Authored-By: heihutu <[email protected]>

* fix(heal): atomically publish replacement intents

Co-Authored-By: heihutu <[email protected]>

* fix(heal): isolate replacement recovery directory

Co-Authored-By: heihutu <[email protected]>

* fix(heal): tolerate an empty recovery directory

Co-Authored-By: heihutu <[email protected]>

* style(heal): remove redundant disk bytes conversion

Co-Authored-By: heihutu <[email protected]>

* fix(heal): reconcile proof-first replacement recovery

Co-Authored-By: heihutu <[email protected]>

* fix(heal): fence torn intent recovery

Co-Authored-By: heihutu <[email protected]>

* test(heal): cover replacement migration conflicts

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): fence replacement lease mount identity

Co-Authored-By: heihutu <[email protected]>

* test(heal): cover missing replacement path admission

Co-Authored-By: heihutu <[email protected]>

* fix(heal): reject conflicting legacy completion proof

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): fall back to proc mount identity

Co-Authored-By: heihutu <[email protected]>

* feat(admin): expose replacement recovery status

Surface the local durable replacement recovery snapshot in the background heal status response so operators can tell whether replacement cleanup is definitive or still pending.

Co-Authored-By: heihutu <[email protected]>

* fix(heal): keep replacement status compatible

Keep the existing background heal status response wire-compatible while retaining the Linux mount lease cleanup needed for the replacement recovery branch.

Co-Authored-By: heihutu <[email protected]>

* style(ecstore): match linux mount lease formatting

Keep Linux rustfmt output stable for the replacement mount lease comparison.

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): qualify mount lease test constant

Use the disk module path for the format config constant in the Linux mount lease regression test.

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): keep procfd mount roots directory-safe

Use a procfd path with an explicit directory component so Unix directory guards can open the replacement mount lease root with O_NOFOLLOW while preserving handle-relative I/O semantics.

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): delete empty leased buckets via dirfd

Use the held mount lease fd as the parent for non-force empty bucket deletion on Linux so procfd-rooted paths do not get rejected as BucketNotEmpty. Also make the download-part OpenOptions truncate behavior explicit and keep fsync test recording stable across procfd canonicalization.

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): scan leased bucket paths for emptiness

Use the local disk I/O root for bucket emptiness probes before non-force bucket deletion and table-bucket metadata checks. This keeps validation on the same mount instance as the subsequent local disk delete path.

Co-Authored-By: heihutu <[email protected]>

* test(ecstore): align lease path test probes

Co-Authored-By: heihutu <[email protected]>

* fix(heal): block unsafe replacement recovery restarts

Co-Authored-By: heihutu <[email protected]>

* fix(heal): defer blocked replacement candidates

Co-Authored-By: heihutu <[email protected]>

* fix(heal): retry transient replacement discovery

Co-Authored-By: heihutu <[email protected]>

* fix(heal): keep transient recovery errors retryable

Co-Authored-By: heihutu <[email protected]>

* fix(heal): block corrupt legacy replacement state

Co-Authored-By: heihutu <[email protected]>

* fix(heal): classify flat replacement intent corruption

Co-Authored-By: heihutu <[email protected]>

* fix(heal): keep transient resume loads retryable

Classify malformed legacy replacement state as blocking corruption while preserving disk and transient load failures for retry. This avoids permanently blocking replacement recovery on temporary storage errors.

Co-Authored-By: heihutu <[email protected]>

* fix(heal): avoid latching transient legacy publishes

Co-Authored-By: heihutu <[email protected]>

* fix(heal): retry blocked legacy migrations

Co-Authored-By: heihutu <[email protected]>

* fix(heal): defer blocked startup recoveries

Co-Authored-By: heihutu <[email protected]>

* fix(ecstore): preserve disk sync limiter across lease roots

Co-Authored-By: heihutu <[email protected]>

---------

Co-authored-by: heihutu <[email protected]>
Co-authored-by: zhi22915 <[email protected]>
2026-08-10 08:32:47 +08:00
10a1d6b6e6 perf(get): avoid zeroing response body chunks (#5905)
Co-authored-by: heihutu <[email protected]>
2026-08-10 06:43:35 +08:00
Zhengchao AnandGitHub be0cea83b7 test(ecstore): pin persisted metadata key literals and bucket config goldens (#5904) 2026-08-09 22:12:26 +00:00
b4b891afad fix(ecstore): raise replay cache auto headroom (#5902)
Co-authored-by: heihutu <[email protected]>
2026-08-09 18:34:27 +00:00
唐小鸭andGitHub 88756ea8e1 test(ecstore): decouple kubernetes endpoint tests from kernel hostname (#5900)
Three Kubernetes endpoint-identity tests read the real kernel hostname
and panicked when it is an IP literal (e.g. macOS without a static
HostName, where DHCP/reverse-DNS sets the kernel hostname to an address
like 192.168.1.11).

Add a cfg(test) override seam (force_kernel_hostname_for_test, mirroring
the existing force_local_host_resolution_timeout_for_test pattern) and
route the production read through kernel_hostname_for_endpoint_identity()
so the tests inject deterministic hostnames instead of depending on the
host environment. Production behavior is unchanged.
2026-08-09 17:05:18 +00:00
唐小鸭andGitHub 6333f21a2e feat(replication): SSE-C ciphertext passthrough replication (#5898)
Complete the encrypted-object replication series (backlog#1783, PR-C of
3, after #5872 and #5885): SSE-C objects replicate as ciphertext
passthrough — the source holds no customer key, so the stored bytes and
their encryption metadata travel verbatim and the replica decrypts only
with the original customer key, single-part and multipart.

- Sender: SSE-C objects read raw (raw_data_movement_read), transfer at
  ciphertext size, and range multipart parts over stored part sizes.
- Receiver: authorized replication PUTs restore the stored SSE-C keys
  from the transport headers (exact lowercase forms - the read-path
  check is case-sensitive), set ObjectOptions.preserve_ciphertext, and
  skip compression, bucket-default SSE, and sse_encryption behind one
  restore-derived gate. Multipart uses an internal session marker to
  store parts verbatim and strips it on complete.
- Convergence: the replication HEAD sends
  x-rustfs-source-replication-check; the target authorizes it as
  ReplicateObjectAction and skips SSE-C read validation for that
  request only, so keyless convergence HEADs see etag/size/mtime
  instead of 400 and SSE-C replicas stop re-driving forever.
- e2e: SSE-C contract flips to a key-gated readable replica (no-key and
  wrong-key GETs fail - the direct silent-plaintext detector); new
  multipart passthrough contract with ETag/marker/stability assertions.
2026-08-09 23:53:04 +08:00
942faefb25 fix(ecstore): anchor Windows rename publication (#5677)
* fix(ecstore): anchor Windows rename publication

* fix(ecstore): complete Windows rename confinement

* test(ecstore): retain Windows retry assertion path

* fix(ecstore): accept configured Windows root paths

* fix(ecstore): size Windows rename buffers correctly

* fix(ecstore): use native relative rename on Windows

* fix(ecstore): preserve Windows rename parent guards

* fix(ecstore): reuse guarded Windows rename trees

* fix(ecstore): compile Windows publication helpers

* fix(ecstore): preserve configured Windows disk roots

* fix(ecstore): flush Windows shards with write access

* fix(ecstore): stage Windows rollback backup replacement

* fix(ecstore): defer Windows staged file cleanup

* fix(ecstore): type Windows staged write result

* fix(ecstore): retry Windows sharing violations

* fix(ecstore): share Windows staged deletes

* fix(ecstore): split Windows staged publication handles

* fix(ecstore): close Windows staged writer before rename

* fix(ecstore): share Windows staged publication deletes

* fix(ecstore): allow guarded Windows child publication

---------

Co-authored-by: Henry Guo <[email protected]>
Co-authored-by: cxymds <[email protected]>
Co-authored-by: houseme <[email protected]>
2026-08-09 22:56:37 +08:00
housemeandGitHub 08de165358 perf(get): reduce response body chunk overhead (#5897) 2026-08-09 22:36:39 +08:00
Zhengchao AnandGitHub 1e6f5f1e35 test: promote passing S3 compatibility cases (#5895)
test: promote passing s3 compatibility cases
2026-08-09 21:58:17 +08:00
Zhengchao AnandGitHub 5513dc75ee docs: update security advisory lessons (#5896) 2026-08-09 21:57:56 +08:00
d7f014cf5f fix(docker): support TZ environment variable (#5891)
Install tzdata in both published runtime variants and verify IANA timezone resolution during image builds.

Co-authored-by: Copilot App <[email protected]>
2026-08-09 21:54:59 +08:00
8f9633ee83 fix(rpc): negotiate authenticated file writes (#5880)
* fix(rpc): negotiate authenticated file writes

* fix(rpc): share capability probe failures

* test(rpc): cover dedicated capability route

* fix(rpc): satisfy capability cache lints

* fix(rpc): retry timed out capability probes

Co-Authored-By: heihutu <[email protected]>

---------

Co-authored-by: houseme <[email protected]>
Co-authored-by: heihutu <[email protected]>
2026-08-09 21:19:47 +08:00
1be636b914 fix(replication): make resync recovery resilient (#5883)
Co-authored-by: houseme <[email protected]>
2026-08-09 19:42:06 +08:00
ec7f5f7b7d perf(http): reduce tracing/logging hotpath overhead (#5893)
perf(http): reduce disabled tracing overhead

Co-authored-by: heihutu <[email protected]>
2026-08-09 11:35:55 +00:00
73e4ef4dd4 feat(replication): replicate managed-SSE objects via target re-encryption (#5885)
Open the managed-SSE replication gate (backlog#1783, PR-B of 3, after
#5872): the replication reader already decrypts through the injected
object-encryption resolver, so the source sends plaintext plus an
encryption intent header (AES256 / aws:kms, never the source key id) and
the target re-encrypts on its normal PUT path with its own KMS. No DEK
crosses sites.

- replication_put_object_options: fail closed only on Unsupported;
  insert the SSE intent after the strip loop.
- TargetClient::create_multipart_upload sends the full opts.header()
  set, fixing multipart replicas losing content-type/user metadata
  (plaintext included).
- Preserve source ETag and mtime on replicas (authorized replication
  only): receiver wires x-rustfs-source-etag into preserve_etag for PUT
  and CompleteMultipartUpload, resolve_complete_etag consumes it, and
  complete options carry source_etag/source_mtime (absent mtime
  degrades to epoch, not now_utc). Without this every replication HEAD
  comparison re-drives re-encrypted objects forever.
- e2e: managed SSE contracts flip to success on an independent-KMS
  dual-process pair (byte-identical plain GET proves target-owned
  envelopes; ETag/mtime preserved; version stable across scanner
  cycles; resync converges; multipart keeps structure and metadata);
  new target-without-KMS fail-closed contract; SSE-C stays FAILED.

Co-authored-by: houseme <[email protected]>
2026-08-09 10:21:35 +00:00
a71726ef49 perf(get): reduce response write allocations (#5890)
Avoid cloning cache-served GET bodies, preserve downstream vectored writes through the GET close-detection wrapper, and remove per-stripe EC decode sidecar allocations.

Co-authored-by: heihutu <[email protected]>
Co-authored-by: zhi22915 <[email protected]>
2026-08-09 08:58:41 +00:00
27ecdb88b1 fix(admin): allow owner service account updates (#5889)
* fix(admin): allow owner service account updates

* test(admin): cover console admin update scope

Co-Authored-By: heihutu <[email protected]>

---------

Co-authored-by: ccccpj <[email protected]>
Co-authored-by: heihutu <[email protected]>
2026-08-09 08:46:27 +00:00
housemeandGitHub 2c7d0fb2ce feat: add hotpath observability for S3 data paths (#5860) 2026-08-09 08:36:58 +00:00
f72ad77aa4 fix(ecstore): use existing two-set test fixture (#5887)
Co-authored-by: heihutu <[email protected]>
2026-08-09 07:59:02 +00:00
Zhengchao AnandGitHub 255f3395bc fix(ecstore): rename stale two_set_test_sets references to make_local_two_set_sets (#5886) 2026-08-09 07:56:51 +00:00
Zhengchao AnandGitHub a07ad4a9ff test(replication): cover rule id byte limit (#5873) 2026-08-09 14:48:44 +08:00
唐小鸭andGitHub c619d8f2d6 fix(replication): persist REPLICA status on inbound replication writes (#5878) 2026-08-09 14:10:34 +08:00
Zhengchao AnandGitHub 6ce0961780 fix(policy): accept object lock mode condition (#5874) 2026-08-09 14:10:25 +08:00
terem42andGitHub 578d02977e fix(heal): log the number of drives actually healed, not the drives consulted (#5871) 2026-08-09 14:10:11 +08:00
唐小鸭andGitHub eb377209c1 docs(ci): make e2e-replication-nightly test-count comments drift-resistant (#5866) 2026-08-09 14:09:44 +08:00
terem42andGitHub 9c1c44807d fix(admin): answer background-heal/status partially when peers are unreachable (#5862) 2026-08-09 14:09:34 +08:00
GatewayJandGitHub 70deb3284b fix(select): pin object snapshot for query lifetime (#5835) 2026-08-09 14:08:53 +08:00
housemeandGitHub b9d1ca3e4d chore(deps): update flake.lock (#5884) 2026-08-09 14:07:33 +08:00
cxymdsandGitHub 0cb9952aa0 fix(rpc): make authenticated file writes atomic (#5879) 2026-08-09 12:26:09 +08:00
cxymdsandGitHub 47369ff027 fix(heal): defer scoped repair on suspended pools (#5876) 2026-08-09 11:50:17 +08:00
唐小鸭andGitHub 10c7476883 fix(replication): rebuild SSE metadata boundary for encrypted objects (#5872)
Groundwork for encrypted-object replication (backlog#1783, PR-A of 3):

- classify_replication_source_encryption: accept the AES256 marker that
  every stored SSE-C object carries; the SseC arm was unreachable.
- Fail closed on sealed material without an SSE marker (MinIO-written
  objects) instead of replicating ciphertext as plaintext.
- Replace the dead VALID_SSE_REPLICATION_HEADERS table with a transport
  map keyed by the metadata keys the SSE writer actually persists, shared
  via the new rustfs_utils::http::object_encryption_keys module.
- Structurally strip all encryption metadata from outbound replication
  (x-rustfs-encryption-* envelopes previously passed the filters).
- Skip decrypt_checksums for encrypted objects at the boundary so its
  is_multipart=false (a response-path contract) cannot misroute
  encrypted multipart objects once managed replication opens.
- Redact X-Rustfs-Replication-* SSE transport values in FileInfo Debug.

A reconciliation test pins that every key encryption_material_to_metadata
produces is either transport-mapped or stripped. All four SSE replication
e2e contracts still assert FAILED unchanged.
2026-08-09 03:05:11 +00:00
9996d567d9 fix(build): support non-Linux Unix targets (illumos/Solaris/*BSD) (#5853)
* fix(build): support non-Linux Unix targets (illumos/Solaris/*BSD)

Two independent build-infrastructure blockers kept RustFS from building on
non-Linux Unix platforms. Neither touches runtime logic.

1. pulsar regenerates its protobuf bindings in build.rs on every build, which
   needs `protoc`. Platforms without a packaged protoc (illumos/Solaris/*BSD)
   now enable pulsar's `protobuf-src` feature via a cfg-gated dependency, which
   builds a vendored protoc from C++ sources. Mainstream targets keep the lean
   dependency and their existing system/CI protoc.

2. clocksource 0.8.3 (pulled in transitively by ratelimit 0.10) used the
   Linux-only `CLOCK_MONOTONIC_COARSE`. ratelimit 2.0 dropped the clocksource
   dependency entirely, so upgrading removes the portability problem at the
   root rather than patching clocksource. The bandwidth throttle's bulk
   `consume()` is rewritten onto ratelimit 2.0's `try_wait_n`, preserving the
   best-effort partial-consumption semantics.

Verified: cargo check + bandwidth monitor unit tests pass; cargo tree confirms
protobuf-src is enabled only for illumos/Solaris/*BSD and clocksource is gone
from the graph. The final illumos build must be confirmed on-platform.

Closes #3195

* fix(ecstore): guard ratelimit v2 capacity overflow

Co-Authored-By: heihutu <[email protected]>

* test(ecstore): avoid slow bandwidth reader timeout

Co-Authored-By: heihutu <[email protected]>

* fix(targets): drop vendored pulsar protobuf build

Co-Authored-By: heihutu <[email protected]>

---------
Co-authored-by: houseme <[email protected]>
Co-authored-by: heihutu <[email protected]>
2026-08-09 10:07:00 +08:00
6106cd3772 chore(hotpath): add samply symbol summary tools (#5875)
Co-authored-by: heihutu <[email protected]>
2026-08-09 09:25:29 +08:00
cxymdsandGitHub 3b9c67e79b fix(rpc): authenticate internode put file bodies (#5868) 2026-08-09 08:05:16 +08:00
cxymdsandGitHub d36166ffb5 fix(ecstore): bound decommission listing retries (#5861) 2026-08-09 08:05:12 +08:00
cxymdsandGitHub 963a107b33 fix(ecstore): fence bucket memo on live lock loss (#5852) 2026-08-09 08:00:46 +08:00
cxymdsandGitHub 02b4e082e8 fix(get): pin resume reads to resolved version (#5859) 2026-08-09 07:48:51 +08:00
cxymdsandGitHub b4133d69e6 fix(heal): respect scoped object repair limits (#5855) 2026-08-09 07:23:16 +08:00
134081b27b chore(deps): fix cargo shear dependency metadata (#5854)
Co-authored-by: heihutu <[email protected]>
2026-08-08 15:52:00 +00:00