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.
This commit is contained in:
houseme
2026-06-04 18:35:33 +08:00
committed by GitHub
parent 542720a1f7
commit fde519910d
2 changed files with 77 additions and 0 deletions
+34
View File
@@ -1204,12 +1204,46 @@ impl ObjectIO for SetDisks {
fi.is_latest = true;
if issue3031_diag_enabled() {
let online_success_count = online_disks.iter().filter(|disk| disk.is_some()).count();
warn!(
target: "rustfs_ecstore::set_disk",
bucket = %bucket,
object = %object,
tmp_dir = %tmp_dir,
data_dir = ?fi.data_dir,
write_quorum,
online_success_count,
op_old_dir = ?op_old_dir,
"issue3031_put_object_commit_succeeded"
);
}
Ok(ObjectInfo::from_file_info(&fi, bucket, object, opts.versioned || opts.version_suspended))
}
.await;
if issue3031_diag_enabled() {
warn!(
target: "rustfs_ecstore::set_disk",
bucket = %bucket,
object = %object,
tmp_dir = %tmp_dir,
result = ?result.as_ref().map(|_| ()).map_err(|err| err.to_string()),
"issue3031_put_object_tmp_cleanup_start"
);
}
if let Err(err) = self.delete_all(RUSTFS_META_TMP_BUCKET, &tmp_dir).await {
warn!(tmp_dir = %tmp_dir, error = ?err, "failed to cleanup put_object temporary data");
} else if issue3031_diag_enabled() {
warn!(
target: "rustfs_ecstore::set_disk",
bucket = %bucket,
object = %object,
tmp_dir = %tmp_dir,
"issue3031_put_object_tmp_cleanup_done"
);
}
result
+43
View File
@@ -92,6 +92,34 @@ impl SetDisks {
}
}
if issue3031_diag_enabled() {
let success_count = errs.iter().filter(|err| err.is_none()).count();
let failure_count = errs.len().saturating_sub(success_count);
let ignored_failure_count = errs
.iter()
.filter(|err| err.as_ref().is_some_and(|err| OBJECT_OP_IGNORED_ERRS.contains(err)))
.count();
let data_dir_vote_count = data_dirs.iter().filter(|data_dir| data_dir.is_some()).count();
let reduced_data_dir = Self::reduce_common_data_dir(&data_dirs, write_quorum);
warn!(
target: "rustfs_ecstore::set_disk",
src_bucket = %src_bucket,
src_object = %src_object,
dst_bucket = %dst_bucket,
dst_object = %dst_object,
write_quorum,
disk_count = errs.len(),
success_count,
failure_count,
ignored_failure_count,
data_dir_vote_count,
reduced_data_dir = ?reduced_data_dir,
errs = ?errs,
data_dirs = ?data_dirs,
"issue3031_rename_data_quorum_context"
);
}
let mut futures = Vec::with_capacity(disks.len());
if let Some(ret_err) = reduce_write_quorum_errs(&errs, OBJECT_OP_IGNORED_ERRS, write_quorum) {
// TODO: add concurrency
@@ -128,6 +156,21 @@ impl SetDisks {
}
}
if issue3031_diag_enabled() {
warn!(
target: "rustfs_ecstore::set_disk",
src_bucket = %src_bucket,
src_object = %src_object,
dst_bucket = %dst_bucket,
dst_object = %dst_object,
write_quorum,
ret_err = %ret_err,
errs = ?errs,
data_dirs = ?data_dirs,
"issue3031_rename_data_quorum_failed"
);
}
let _ = join_all(futures).await;
return Err(ret_err);
}