mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-04 12:27:43 +00:00
918fd29711
* fix(object-capacity): stop cancelled/remote-disk refreshes from corrupting capacity Two independent capacity-refresh bugs (backlog rustfs/backlog#805): - refresh_or_join set the singleflight `running` flag then awaited the refresh future with no drop guard. When the admin request that became leader was cancelled (client disconnect) mid-await, `running` stayed true forever: joiners blocked indefinitely and the 120s scheduled refresh could never start again. catch_unwind covered panics but not cancellation. A RefreshLeaderGuard now resets the state and publishes an error on drop. - capacity_disk_refs mapped the cluster-wide storage_info disk list without filtering non-local disks, so admin-triggered refreshes ran a local WalkDir over remote disks' drive_path. On multi-node clusters this double-counted local bytes (shared mount layout) or hit NotFound (per-node layouts), and poisoned the per-disk cache the scheduled local-only refresh depends on, making the cached total oscillate. Filter to local disks. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> * fix(rio): harden internode HTTP client build, cache, and PUT body integrity Follow-ups from the internode HTTP review (backlog rustfs/backlog#805): - handle_put_file accepted a truncated body as success: a HttpWriter dropped mid-stream closes the chunked body cleanly, indistinguishable from EOF, and the server never compared bytes copied against the declared size. Reject size mismatches on the create path (append/unknown-size writes send size<=0 and are exempt). - build_http_client used `.expect()` on ClientBuilder::build(), which runs lazily on the first request and on every TLS generation bump (cert rotation), so a build failure panicked a serving task. It now returns an io::Error; get_http_client falls back to the previous TLS generation when a rebuild fails instead of failing the request. - CLIENT_CACHE was a tokio::Mutex taken on every stream open (data_shards times per GET). Replaced with arc_swap::ArcSwapOption for lock-free reads on the hot path; the generation-monotonic replacement guard is preserved via rcu. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
64 lines
2.1 KiB
TOML
64 lines
2.1 KiB
TOML
# Copyright 2024 RustFS Team
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
[package]
|
|
name = "rustfs-rio"
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
rust-version.workspace = true
|
|
version.workspace = true
|
|
homepage.workspace = true
|
|
description = "Rio is a RustFS component that provides a high-performance, asynchronous I/O framework for building scalable and efficient applications."
|
|
keywords = ["asynchronous", "IO", "framework", "rustfs", "Minio"]
|
|
categories = ["web-programming", "development-tools", "asynchronous"]
|
|
documentation = "https://docs.rs/rustfs-rio/latest/rustfs_rio/"
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
arc-swap.workspace = true
|
|
tokio = { workspace = true, features = ["full"] }
|
|
rand = { workspace = true }
|
|
http.workspace = true
|
|
aes-gcm = { workspace = true }
|
|
crc-fast = { workspace = true }
|
|
pin-project-lite.workspace = true
|
|
serde = { workspace = true }
|
|
bytes.workspace = true
|
|
reqwest.workspace = true
|
|
rustls-pki-types.workspace = true
|
|
tokio-util.workspace = true
|
|
faster-hex.workspace = true
|
|
futures.workspace = true
|
|
rustfs-config = { workspace = true, features = ["constants"] }
|
|
rustfs-io-metrics.workspace = true
|
|
rustfs-tls-runtime.workspace = true
|
|
rustfs-utils = { workspace = true, features = ["io", "hash", "compress"] }
|
|
serde_json.workspace = true
|
|
md-5 = { workspace = true }
|
|
tracing.workspace = true
|
|
thiserror.workspace = true
|
|
base64.workspace = true
|
|
sha1.workspace = true
|
|
sha2.workspace = true
|
|
s3s.workspace = true
|
|
hex-simd.workspace = true
|
|
|
|
[dev-dependencies]
|
|
tokio-test = { workspace = true }
|
|
axum = { workspace = true }
|
|
http-body-util = { workspace = true }
|