From 09be06a4d2dfed814ef4f773ff6fa70d27df977c Mon Sep 17 00:00:00 2001 From: GatewayJ <835269233@qq.com> Date: Mon, 27 Apr 2026 22:13:40 +0800 Subject: [PATCH] fix(ecstore): log walk failures in IAM listing path (#2705) Co-authored-by: GatewayJ <8352692332qq.com> Co-authored-by: loverustfs Co-authored-by: houseme --- crates/ecstore/src/store_list_objects.rs | 26 +++++++++++++++++------- crates/iam/src/store/object.rs | 10 ++++++++- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/crates/ecstore/src/store_list_objects.rs b/crates/ecstore/src/store_list_objects.rs index 98a031c36..57a5f5ac4 100644 --- a/crates/ecstore/src/store_list_objects.rs +++ b/crates/ecstore/src/store_list_objects.rs @@ -829,6 +829,7 @@ impl ECStore { let (merge_tx, mut merge_rx) = mpsc::channel::(100); let bucket = bucket.to_owned(); + let bucket_clone = bucket.clone(); let vcf = match get_versioning_config(&bucket).await { Ok((res, _)) => Some(res), @@ -839,7 +840,7 @@ impl ECStore { let mut sent_err = false; while let Some(entry) = merge_rx.recv().await { if opts.latest_only { - let fi = match entry.to_fileinfo(&bucket) { + let fi = match entry.to_fileinfo(&bucket_clone) { Ok(res) => res, Err(err) => { if !sent_err { @@ -864,7 +865,7 @@ impl ECStore { if let Some(filter) = opts.filter { if filter(&fi) { let item = ObjectInfoOrErr { - item: Some(ObjectInfo::from_file_info(&fi, &bucket, &fi.name, { + item: Some(ObjectInfo::from_file_info(&fi, &bucket_clone, &fi.name, { if let Some(v) = &vcf { v.versioned(&fi.name) } else { false } })), err: None, @@ -876,7 +877,7 @@ impl ECStore { } } else { let item = ObjectInfoOrErr { - item: Some(ObjectInfo::from_file_info(&fi, &bucket, &fi.name, { + item: Some(ObjectInfo::from_file_info(&fi, &bucket_clone, &fi.name, { if let Some(v) = &vcf { v.versioned(&fi.name) } else { false } })), err: None, @@ -889,7 +890,7 @@ impl ECStore { continue; } - let fvs = match entry.file_info_versions(&bucket) { + let fvs = match entry.file_info_versions(&bucket_clone) { Ok(res) => res, Err(err) => { let item = ObjectInfoOrErr { @@ -912,7 +913,7 @@ impl ECStore { if let Some(filter) = opts.filter { if filter(fi) { let item = ObjectInfoOrErr { - item: Some(ObjectInfo::from_file_info(fi, &bucket, &fi.name, { + item: Some(ObjectInfo::from_file_info(fi, &bucket_clone, &fi.name, { if let Some(v) = &vcf { v.versioned(&fi.name) } else { false } })), err: None, @@ -924,7 +925,7 @@ impl ECStore { } } else { let item = ObjectInfoOrErr { - item: Some(ObjectInfo::from_file_info(fi, &bucket, &fi.name, { + item: Some(ObjectInfo::from_file_info(fi, &bucket_clone, &fi.name, { if let Some(v) = &vcf { v.versioned(&fi.name) } else { false } })), err: None, @@ -940,7 +941,18 @@ impl ECStore { tokio::spawn(async move { merge_entry_channels(rx, inputs, merge_tx, 1).await }); - join_all(futures).await; + let walk_results = join_all(futures).await; + for (idx, walk_result) in walk_results.into_iter().enumerate() { + if let Err(err) = walk_result { + error!( + bucket = %bucket, + prefix = %prefix, + set_task_index = idx, + error = ?err, + "walk_internal list_path_raw task failed" + ); + } + } Ok(()) } diff --git a/crates/iam/src/store/object.rs b/crates/iam/src/store/object.rs index e18aed0fa..2ac778dac 100644 --- a/crates/iam/src/store/object.rs +++ b/crates/iam/src/store/object.rs @@ -369,9 +369,17 @@ impl ObjectStore { let path = prefix.to_owned(); tokio::spawn(async move { - store + if let Err(err) = store .walk(ctx.clone(), Self::BUCKET_NAME, &path, tx, WalkOptions::default()) .await + { + error!( + bucket = Self::BUCKET_NAME, + prefix = %path, + error = ?err, + "list_iam_config_items walk task failed" + ); + } }); let prefix = prefix.to_owned();