mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-23 04:39:04 +00:00
f7003dfddd
* fix(admin): send versioningEnabled on site replication make-bucket ops The outbound make-with-versioning bucket-op query only carried operation/createdAt/lockEnabled. MinIO's own create-bucket hook sends versioningEnabled=true on this op, so align the outbound query with MinIO's site-replication make-bucket wire contract. Route both outbound builders (bootstrap plan and create-bucket hook) through one shared builder that always appends versioningEnabled=true. RustFS's own inbound handler force-enables versioning either way, so RustFS-to-RustFS behavior is unchanged; the MinIO release verified against (RELEASE.2025-09-07) also force-enables versioning regardless of the flag, so this aligns the wire contract rather than changing observable behavior there. * fix(admin): propagate purge-deleted-bucket errors in site replication The purge-deleted-bucket branch of the peer bucket-ops handler dropped the delete_bucket error and answered 200, so a peer-driven purge that failed (disk full, quorum loss) was reported as success while the bucket survived on this site. Tolerate only bucket-not-found (the purge raced an earlier replay or a local delete) and propagate every other error through ApiError like the sibling delete branches do. * fix(admin): derive fallback site deployment ID with UUIDv5 deployment_id_for_endpoint used DefaultHasher, whose algorithm is not guaranteed stable across Rust releases. The fallback fires when a peer response carries an empty deploymentID; the result is persisted in site-replication state, used for collision disambiguation, and broadcast to peers, so a toolchain bump could re-derive a different ID for the same endpoint. Note that the add preflight currently rejects that case upstream of this fallback. Derive UUIDv5 (NAMESPACE_URL) over the canonical endpoint instead, and log a structured warn when a peer metainfo response arrives without a deploymentID. Already persisted fallback IDs are non-empty and therefore never re-derived, so existing state is unaffected. * fix(admin): stream site replication devnull body without 1MB cap The site-replication devnull endpoint buffered the request body through read_plain_admin_body, which enforces the 1MB admin body cap. MinIO peers stream multi-megabyte probe bodies to this endpoint during site netperf link checks and expect an unbounded discard, so any larger probe got a 400 and was misreported as a broken link. Stream and discard the body chunk by chunk with no size cap instead, mirroring MinIO's io.Discard drain. The response stays 204 with an empty body.
381 lines
14 KiB
TOML
381 lines
14 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"
|
|
version.workspace = true
|
|
edition.workspace = true
|
|
license.workspace = true
|
|
repository.workspace = true
|
|
rust-version.workspace = true
|
|
homepage.workspace = true
|
|
default-run = "rustfs"
|
|
description = "RustFS is a high-performance, distributed file system designed for modern cloud-native applications, providing efficient data storage and retrieval with advanced features like S3 Select, IAM, and policy management."
|
|
keywords.workspace = true
|
|
categories.workspace = true
|
|
documentation = "https://docs.rustfs.com/"
|
|
|
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
|
[lib]
|
|
name = "rustfs"
|
|
path = "src/lib.rs"
|
|
|
|
[[bin]]
|
|
name = "rustfs"
|
|
path = "src/main.rs"
|
|
|
|
[[bin]]
|
|
name = "rustfs-cli"
|
|
path = "src/bin/rustfs-cli.rs"
|
|
|
|
[features]
|
|
default = ["ftps", "webdav"]
|
|
metrics-gpu = ["rustfs-obs/gpu"]
|
|
ftps = ["rustfs-protocols/ftps"]
|
|
swift = ["rustfs-protocols/swift"]
|
|
webdav = ["rustfs-protocols/webdav"]
|
|
sftp = ["rustfs-protocols/sftp"]
|
|
license = []
|
|
io-scheduler-debug = [] # Enable debug information in I/O scheduler
|
|
tracing-chunk-debug = [] # Enable per-chunk tracing in data plane (high noise, for debugging only)
|
|
full = ["metrics-gpu", "ftps", "swift", "webdav", "sftp", "pyroscope"]
|
|
manual-test-runners = []
|
|
e2e-test-hooks = []
|
|
rio-v2 = ["rustfs-ecstore/rio-v2"]
|
|
pyroscope = ["rustfs-obs/pyroscope"]
|
|
# Tokio runtime telemetry. Requires `--cfg tokio_unstable`; use `make build-profiling`.
|
|
dial9 = ["rustfs-obs/dial9"]
|
|
hotpath = [
|
|
"hotpath/hotpath",
|
|
"hotpath/tokio",
|
|
"hotpath/futures",
|
|
"hotpath/async-channel",
|
|
"hotpath/crossbeam",
|
|
"hotpath/parking_lot",
|
|
"hotpath/reqwest-0-13",
|
|
"rustfs-audit/hotpath",
|
|
"rustfs-common/hotpath",
|
|
"rustfs-concurrency/hotpath",
|
|
"rustfs-config/hotpath",
|
|
"rustfs-credentials/hotpath",
|
|
"rustfs-crypto/hotpath",
|
|
"rustfs-data-usage/hotpath",
|
|
"rustfs-ecstore/hotpath",
|
|
"rustfs-extension-schema/hotpath",
|
|
"rustfs-filemeta/hotpath",
|
|
"rustfs-heal/hotpath",
|
|
"rustfs-iam/hotpath",
|
|
"rustfs-io-core/hotpath",
|
|
"rustfs-io-metrics/hotpath",
|
|
"rustfs-keystone/hotpath",
|
|
"rustfs-kms/hotpath",
|
|
"rustfs-lock/hotpath",
|
|
"rustfs-log-analyzer/hotpath",
|
|
"rustfs-madmin/hotpath",
|
|
"rustfs-notify/hotpath",
|
|
"rustfs-object-capacity/hotpath",
|
|
"rustfs-object-data-cache/hotpath",
|
|
"rustfs-obs/hotpath",
|
|
"rustfs-policy/hotpath",
|
|
"rustfs-protocols/hotpath",
|
|
"rustfs-protos/hotpath",
|
|
"rustfs-rio/hotpath",
|
|
"rustfs-s3-ops/hotpath",
|
|
"rustfs-s3-types/hotpath",
|
|
"rustfs-s3select-api/hotpath",
|
|
"rustfs-s3select-query/hotpath",
|
|
"rustfs-scanner/hotpath",
|
|
"rustfs-security-governance/hotpath",
|
|
"rustfs-signer/hotpath",
|
|
"rustfs-storage-api/hotpath",
|
|
"rustfs-targets/hotpath",
|
|
"rustfs-tls-runtime/hotpath",
|
|
"rustfs-trusted-proxies/hotpath",
|
|
"rustfs-utils/hotpath",
|
|
"rustfs-zip/hotpath",
|
|
"rustfs-test-utils/hotpath",
|
|
]
|
|
hotpath-alloc = [
|
|
"hotpath",
|
|
"hotpath/hotpath-alloc",
|
|
"rustfs-audit/hotpath-alloc",
|
|
"rustfs-common/hotpath-alloc",
|
|
"rustfs-concurrency/hotpath-alloc",
|
|
"rustfs-config/hotpath-alloc",
|
|
"rustfs-credentials/hotpath-alloc",
|
|
"rustfs-crypto/hotpath-alloc",
|
|
"rustfs-data-usage/hotpath-alloc",
|
|
"rustfs-ecstore/hotpath-alloc",
|
|
"rustfs-extension-schema/hotpath-alloc",
|
|
"rustfs-filemeta/hotpath-alloc",
|
|
"rustfs-heal/hotpath-alloc",
|
|
"rustfs-iam/hotpath-alloc",
|
|
"rustfs-io-core/hotpath-alloc",
|
|
"rustfs-io-metrics/hotpath-alloc",
|
|
"rustfs-keystone/hotpath-alloc",
|
|
"rustfs-kms/hotpath-alloc",
|
|
"rustfs-lock/hotpath-alloc",
|
|
"rustfs-log-analyzer/hotpath-alloc",
|
|
"rustfs-madmin/hotpath-alloc",
|
|
"rustfs-notify/hotpath-alloc",
|
|
"rustfs-object-capacity/hotpath-alloc",
|
|
"rustfs-object-data-cache/hotpath-alloc",
|
|
"rustfs-obs/hotpath-alloc",
|
|
"rustfs-policy/hotpath-alloc",
|
|
"rustfs-protocols/hotpath-alloc",
|
|
"rustfs-protos/hotpath-alloc",
|
|
"rustfs-rio/hotpath-alloc",
|
|
"rustfs-s3-ops/hotpath-alloc",
|
|
"rustfs-s3-types/hotpath-alloc",
|
|
"rustfs-s3select-api/hotpath-alloc",
|
|
"rustfs-s3select-query/hotpath-alloc",
|
|
"rustfs-scanner/hotpath-alloc",
|
|
"rustfs-security-governance/hotpath-alloc",
|
|
"rustfs-signer/hotpath-alloc",
|
|
"rustfs-storage-api/hotpath-alloc",
|
|
"rustfs-targets/hotpath-alloc",
|
|
"rustfs-tls-runtime/hotpath-alloc",
|
|
"rustfs-trusted-proxies/hotpath-alloc",
|
|
"rustfs-utils/hotpath-alloc",
|
|
"rustfs-zip/hotpath-alloc",
|
|
"rustfs-test-utils/hotpath-alloc",
|
|
]
|
|
hotpath-cpu = [
|
|
"hotpath",
|
|
"hotpath/hotpath-cpu",
|
|
"rustfs-audit/hotpath-cpu",
|
|
"rustfs-common/hotpath-cpu",
|
|
"rustfs-concurrency/hotpath-cpu",
|
|
"rustfs-config/hotpath-cpu",
|
|
"rustfs-credentials/hotpath-cpu",
|
|
"rustfs-crypto/hotpath-cpu",
|
|
"rustfs-data-usage/hotpath-cpu",
|
|
"rustfs-ecstore/hotpath-cpu",
|
|
"rustfs-extension-schema/hotpath-cpu",
|
|
"rustfs-filemeta/hotpath-cpu",
|
|
"rustfs-heal/hotpath-cpu",
|
|
"rustfs-iam/hotpath-cpu",
|
|
"rustfs-io-core/hotpath-cpu",
|
|
"rustfs-io-metrics/hotpath-cpu",
|
|
"rustfs-keystone/hotpath-cpu",
|
|
"rustfs-kms/hotpath-cpu",
|
|
"rustfs-lock/hotpath-cpu",
|
|
"rustfs-log-analyzer/hotpath-cpu",
|
|
"rustfs-madmin/hotpath-cpu",
|
|
"rustfs-notify/hotpath-cpu",
|
|
"rustfs-object-capacity/hotpath-cpu",
|
|
"rustfs-object-data-cache/hotpath-cpu",
|
|
"rustfs-obs/hotpath-cpu",
|
|
"rustfs-policy/hotpath-cpu",
|
|
"rustfs-protocols/hotpath-cpu",
|
|
"rustfs-protos/hotpath-cpu",
|
|
"rustfs-rio/hotpath-cpu",
|
|
"rustfs-s3-ops/hotpath-cpu",
|
|
"rustfs-s3-types/hotpath-cpu",
|
|
"rustfs-s3select-api/hotpath-cpu",
|
|
"rustfs-s3select-query/hotpath-cpu",
|
|
"rustfs-scanner/hotpath-cpu",
|
|
"rustfs-security-governance/hotpath-cpu",
|
|
"rustfs-signer/hotpath-cpu",
|
|
"rustfs-storage-api/hotpath-cpu",
|
|
"rustfs-targets/hotpath-cpu",
|
|
"rustfs-tls-runtime/hotpath-cpu",
|
|
"rustfs-trusted-proxies/hotpath-cpu",
|
|
"rustfs-utils/hotpath-cpu",
|
|
"rustfs-zip/hotpath-cpu",
|
|
"rustfs-test-utils/hotpath-cpu",
|
|
]
|
|
|
|
[lints]
|
|
workspace = true
|
|
|
|
[dependencies]
|
|
hotpath.workspace = true
|
|
# RustFS Internal Crates
|
|
rustfs-heal = { workspace = true }
|
|
rustfs-audit = { workspace = true }
|
|
rustfs-common = { workspace = true }
|
|
rustfs-config = { workspace = true, features = ["notify", "server-config-model"] }
|
|
rustfs-crypto = { workspace = true }
|
|
rustfs-credentials = { workspace = true }
|
|
rustfs-ecstore = { workspace = true }
|
|
rustfs-filemeta.workspace = true
|
|
rustfs-iam = { workspace = true }
|
|
rustfs-keystone = { workspace = true }
|
|
rustfs-kms = { workspace = true }
|
|
rustfs-lock.workspace = true
|
|
rustfs-log-analyzer = { workspace = true }
|
|
rustfs-madmin = { workspace = true }
|
|
rustfs-notify = { workspace = true }
|
|
rustfs-obs = { workspace = true }
|
|
rustfs-policy = { workspace = true }
|
|
rustfs-protocols = { workspace = true }
|
|
rustfs-protos = { workspace = true }
|
|
rustfs-rio = { workspace = true }
|
|
rustfs-s3-types = { workspace = true }
|
|
rustfs-s3-ops = { workspace = true }
|
|
rustfs-security-governance = { workspace = true }
|
|
rustfs-data-usage = { workspace = true }
|
|
rustfs-s3select-api = { workspace = true }
|
|
rustfs-s3select-query = { workspace = true }
|
|
rustfs-extension-schema = { workspace = true }
|
|
rustfs-targets = { workspace = true }
|
|
rustfs-storage-api = { workspace = true }
|
|
rustfs-tls-runtime = { workspace = true }
|
|
rustfs-trusted-proxies = { workspace = true }
|
|
rustfs-utils = { workspace = true, features = ["full"] }
|
|
rustfs-zip = { workspace = true }
|
|
rustfs-io-core = { workspace = true }
|
|
rustfs-io-metrics = { workspace = true }
|
|
rustfs-object-capacity = { workspace = true }
|
|
rustfs-object-data-cache = { workspace = true, features = ["cache"] }
|
|
rustfs-concurrency = { workspace = true }
|
|
rustfs-scanner = { workspace = true }
|
|
tempfile = { workspace = true }
|
|
|
|
# Connect device identity: P-256 keys, PKCS#10 certificate requests, ES256 proofs.
|
|
p256 = { version = "0.13.2", features = ["ecdsa", "pkcs8"] }
|
|
rcgen = { workspace = true }
|
|
|
|
# Async Runtime and Networking
|
|
async-trait = { workspace = true }
|
|
axum.workspace = true
|
|
futures.workspace = true
|
|
futures-lite.workspace = true
|
|
futures-util.workspace = true
|
|
hyper = { workspace = true, features = ["http2", "http1", "server"] }
|
|
hyper-util = { workspace = true, features = ["tokio", "server-auto", "server-graceful", "tracing"] }
|
|
http.workspace = true
|
|
http-body.workspace = true
|
|
http-body-util.workspace = true
|
|
reqwest = { workspace = true, features = ["json", "stream"] }
|
|
socket2 = { workspace = true, features = ["all"] }
|
|
tokio = { workspace = true, features = ["rt-multi-thread", "macros", "net", "signal", "process", "io-util", "fs"] }
|
|
tokio-rustls = { workspace = true, default-features = false, features = ["logging", "tls12", "aws-lc-rs"] }
|
|
aws-sdk-s3 = { workspace = true, default-features = false, features = ["sigv4a", "default-https-client", "rt-tokio"] }
|
|
tokio-stream.workspace = true
|
|
tokio-util = { workspace = true, features = ["io", "compat", "time"] }
|
|
tonic = { workspace = true, features = ["gzip", "deflate"] }
|
|
tower = { workspace = true, features = ["timeout"] }
|
|
tower-http = { workspace = true, features = ["trace", "compression-full", "cors", "catch-panic", "timeout", "limit", "request-id", "add-extension"] }
|
|
|
|
# Serialization and Data Formats
|
|
apache-avro = { workspace = true }
|
|
bytes = { workspace = true, features = ["serde"] }
|
|
chrono = { workspace = true, features = ["serde"] }
|
|
flate2 = { workspace = true }
|
|
flatbuffers.workspace = true
|
|
rmp-serde.workspace = true
|
|
quick-xml.workspace = true
|
|
rustfs-signer.workspace = true
|
|
serde = { workspace = true, features = ["derive"] }
|
|
serde_json = { workspace = true, features = ["raw_value"] }
|
|
serde_urlencoded = { workspace = true }
|
|
snap.workspace = true
|
|
zstd.workspace = true
|
|
|
|
# Cryptography and Security
|
|
rustls = { workspace = true, default-features = false, features = ["aws-lc-rs", "logging", "tls12", "prefer-post-quantum", "std"] }
|
|
rustls-pki-types = { workspace = true }
|
|
x509-parser = { workspace = true }
|
|
subtle = { workspace = true }
|
|
jiff = { workspace = true, features = ["serde"] }
|
|
time = { workspace = true, features = ["parsing", "formatting", "serde", "macros"] }
|
|
|
|
# Utilities and Tools
|
|
astral-tokio-tar = { workspace = true }
|
|
atoi = { workspace = true }
|
|
atomic_enum = { workspace = true }
|
|
async_zip = { workspace = true, default-features = false, features = ["tokio", "deflate"] }
|
|
base64 = { workspace = true }
|
|
zeroize = { workspace = true }
|
|
hmac = { workspace = true }
|
|
sha2 = { workspace = true }
|
|
rsa = { workspace = true, features = ["sha2"] }
|
|
base64-simd.workspace = true
|
|
clap = { workspace = true, features = ["derive", "env"] }
|
|
const-str = { workspace = true, features = ["std", "proc"] }
|
|
datafusion = { workspace = true, default-features = false, features = ["parquet", "recursive_protection", "sql"] }
|
|
hex-simd.workspace = true
|
|
matchit = { workspace = true }
|
|
md-5 = { workspace = true }
|
|
mime_guess = { workspace = true }
|
|
percent-encoding = { workspace = true }
|
|
pin-project-lite.workspace = true
|
|
parking_lot = { workspace = true }
|
|
rust-embed = { workspace = true, features = ["interpolate-folder-path"] }
|
|
s3s = { workspace = true, features = ["minio"] }
|
|
shadow-rs = { workspace = true, default-features = false, features = ["build", "metadata"] }
|
|
sysinfo = { workspace = true, features = ["multithread"] }
|
|
thiserror = { workspace = true }
|
|
tracing.workspace = true
|
|
url = { workspace = true }
|
|
urlencoding = { workspace = true }
|
|
uuid = { workspace = true, features = ["v4", "v5", "fast-rng", "macro-diagnostics"] }
|
|
zip = { workspace = true }
|
|
libc = { workspace = true }
|
|
rand = { workspace = true, features = ["serde"] }
|
|
regex = { workspace = true }
|
|
aes-gcm = { workspace = true, features = ["rand_core"] }
|
|
chacha20poly1305 = { workspace = true }
|
|
|
|
# Observability and Metrics
|
|
metrics = { workspace = true }
|
|
opentelemetry = { workspace = true }
|
|
tracing-opentelemetry = { workspace = true }
|
|
# Data structures
|
|
hashbrown = { workspace = true, features = ["serde", "rayon"] }
|
|
mimalloc = { workspace = true }
|
|
|
|
[target.'cfg(target_os = "linux")'.dependencies]
|
|
libsystemd.workspace = true
|
|
|
|
[target.'cfg(not(target_os = "windows"))'.dependencies]
|
|
libmimalloc-sys.workspace = true
|
|
|
|
[dev-dependencies]
|
|
uuid = { workspace = true, features = ["v4", "v5", "fast-rng", "macro-diagnostics"] }
|
|
serial_test = { workspace = true }
|
|
tempfile = { workspace = true }
|
|
aws-config = { workspace = true }
|
|
anyhow = { workspace = true }
|
|
insta = { workspace = true, features = ["yaml", "json"] }
|
|
proptest = "1"
|
|
tokio = { workspace = true, features = ["test-util", "fs", "rt-multi-thread"] }
|
|
temp-env = { workspace = true, features = ["async_closure"] }
|
|
tracing-subscriber = { workspace = true, features = ["env-filter", "time"] }
|
|
metrics-util = { workspace = true, features = ["debugging"] }
|
|
opentelemetry_sdk = { workspace = true, features = ["rt-tokio"] }
|
|
rsa = { workspace = true }
|
|
rcgen = { workspace = true }
|
|
rustfs-test-utils.workspace = true
|
|
# diagnose_e2e fixtures (archives are generated in-test, never checked in)
|
|
zip = { workspace = true }
|
|
# Enables the shared MockWarmBackend / xl.meta assertion helpers exposed via
|
|
# the ecstore `api::tier::test_util` facade module (rustfs/backlog#1148 ilm-6).
|
|
rustfs-ecstore = { workspace = true, features = ["test-util"] }
|
|
|
|
[build-dependencies]
|
|
http.workspace = true
|
|
futures.workspace = true
|
|
s3s = { workspace = true, features = ["minio"] }
|
|
clap = { workspace = true, features = ["derive", "env"] }
|
|
hyper-util = { workspace = true, features = [
|
|
"tokio",
|
|
"server-auto",
|
|
"server-graceful",
|
|
"tracing",
|
|
] }
|
|
shadow-rs = { workspace = true, default-features = false, features = ["build"] }
|