Make auto_heal real: peer-fetch corrupted_object with verified swap, poison-fallback on no peer

This commit is contained in:
2026-04-25 17:14:38 +08:00
parent dd1e6d0409
commit 3a590e6639
14 changed files with 1670 additions and 274 deletions

View File

@@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize};
use tokio::sync::Semaphore;
use myfsio_common::types::ListParams;
use myfsio_storage::fs_backend::FsStorageBackend;
use myfsio_storage::fs_backend::{metadata_is_corrupted, FsStorageBackend};
use myfsio_storage::traits::StorageEngine;
use crate::services::s3_client::{build_client, check_endpoint_health, ClientOptions};
@@ -483,6 +483,17 @@ impl ReplicationManager {
return;
}
if let Ok(src_meta) = self.storage.get_object_metadata(bucket, object_key).await {
if metadata_is_corrupted(&src_meta) {
tracing::warn!(
"Replication skipped for {}/{}: source object is poisoned (corrupted)",
bucket,
object_key
);
return;
}
}
let src_path = match self.storage.get_object_path(bucket, object_key).await {
Ok(p) => p,
Err(_) => {