mirror of
https://github.com/rustfs/rustfs.git
synced 2026-07-26 08:18:18 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user