mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-06 13:27:43 +00:00
f00898d070
* fix(tier): stop sending nil/garbage versionId to warm backend S3 Three bugs caused NoSuchVersion errors when reading tiered objects: 1. warm_backend_s3sdk: GET and DELETE ignored rv/range opts entirely — fixed to forward version_id and byte-range to the SDK request. 2. version.rs (MetaObject + MetaDeleteMarker): transition_version_id was parsed with unwrap_or_default(), turning invalid/wrong-length bytes into Uuid::nil(). The nil UUID was then serialized and sent as ?versionId=00000000-... to the tier backend -> NoSuchVersion. Fixed: .and_then(.ok()).filter(!is_nil()) so only valid non-nil UUIDs are forwarded as versionId. 3. bucket_lifecycle_ops: add debug/error logs in get_transitioned_object_reader to record tier, tier_object, and tier_version_id before and on failure of the tier GET. Also adds tier transition fields to dump_fileinfo example for offline xl.meta inspection, and fixes Docker build (cargo path + entrypoint). Adds CLAUDE.md with tier architecture and debugging notes. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * more fixes for versionId * Potential fix for pull request finding Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Marcelo Bartsch <marcelo@bartsch.cl> * remove branch * Add tests and fix cargo path, add load to build-docker * update documentation (CLAUDE.md) * more fixes for recover * More fixes to ILM recover * final fix * chore: add missing-shard first-scene diagnostics (#3213) chore(ecstore): add missing-shard first-scene diagnostics Log rename_data quorum context behind RUSTFS_ISSUE3031_DIAG_ENABLE so partial-disk success can be correlated with later missing shard reads. Also log put_object commit success and tmp cleanup boundaries to capture when successful quorum writes are followed by tmp_dir cleanup. * fix test anmd fmt * fix cargo path fix test * fix(tier): format copy_object self-copy guard --------- Signed-off-by: Marcelo Bartsch <marcelo@bartsch.cl> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: 安正超 <anzhengchao@gmail.com> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Co-authored-by: houseme <housemecn@gmail.com> Co-authored-by: cxymds <Cxymds@qq.com> Co-authored-by: loverustfs <hello@rustfs.com>
64 lines
2.2 KiB
Rust
64 lines
2.2 KiB
Rust
// 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.
|
|
|
|
use rustfs_filemeta::{FileInfoOpts, get_file_info};
|
|
use std::{env, fs, path::PathBuf};
|
|
fn main() {
|
|
let path = env::args()
|
|
.nth(1)
|
|
.map(PathBuf::from)
|
|
.expect("usage: dump_fileinfo <xl.meta path>");
|
|
let data = fs::read(&path).expect("read xl.meta");
|
|
let fi = get_file_info(
|
|
&data,
|
|
"debug-bucket",
|
|
"debug-object",
|
|
"",
|
|
FileInfoOpts {
|
|
data: false,
|
|
include_free_versions: true,
|
|
},
|
|
)
|
|
.expect("decode file info");
|
|
println!("path: {}", path.display());
|
|
println!("size: {}", fi.size);
|
|
println!("etag: {:?}", fi.get_etag());
|
|
println!("parts: {}", fi.parts.len());
|
|
for (idx, part) in fi.parts.iter().enumerate() {
|
|
println!(
|
|
"part#{idx}: number={} size={} actual_size={} etag={}",
|
|
part.number, part.size, part.actual_size, part.etag
|
|
);
|
|
}
|
|
// Tier / transition fields
|
|
if !fi.transition_status.is_empty() {
|
|
println!("transition_status: {}", fi.transition_status);
|
|
println!("transition_tier: {}", fi.transition_tier);
|
|
println!("transitioned_obj: {}", fi.transitioned_objname);
|
|
println!(
|
|
"transition_ver_id: {}",
|
|
fi.transition_version_id
|
|
.map(|u| u.to_string())
|
|
.unwrap_or_else(|| "<none>".into())
|
|
);
|
|
}
|
|
|
|
println!("metadata entries: {}", fi.metadata.len());
|
|
let mut keys = fi.metadata.keys().cloned().collect::<Vec<_>>();
|
|
keys.sort();
|
|
for key in keys {
|
|
println!("meta[{key}]={}", fi.metadata.get(&key).unwrap());
|
|
}
|
|
}
|