mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-09 14:49:25 +00:00
@@ -139,7 +139,7 @@ pub async fn list_path_raw(mut rx: B_Receiver<bool>, opts: ListPathRawOptions) -
|
||||
});
|
||||
}
|
||||
|
||||
let errs: Vec<Option<Error>> = Vec::with_capacity(readers.len());
|
||||
let errs: Vec<Option<Error>> = vec![None; readers.len()];
|
||||
loop {
|
||||
let mut current = MetaCacheEntry::default();
|
||||
let (mut at_eof, mut has_err, mut agree) = (0, 0, 0);
|
||||
|
||||
@@ -37,6 +37,7 @@ pub async fn init_auto_heal() {
|
||||
init_background_healing().await;
|
||||
if let Ok(v) = env::var("_RUSTFS_AUTO_DRIVE_HEALING") {
|
||||
if v == "on" {
|
||||
info!("start monitor local disks and heal");
|
||||
GLOBAL_BackgroundHealState
|
||||
.write()
|
||||
.await
|
||||
|
||||
@@ -511,9 +511,7 @@ impl FolderScanner {
|
||||
let this_hash = hash_path(&folder.name);
|
||||
let was_compacted = into.compacted;
|
||||
|
||||
// do not really loop
|
||||
let mut times = 1;
|
||||
while times > 0 {
|
||||
'outer: {
|
||||
let mut abandoned_children: DataUsageHashMap = if !into.compacted {
|
||||
self.old_cache.find_children_copy(this_hash.clone())
|
||||
} else {
|
||||
@@ -622,7 +620,7 @@ impl FolderScanner {
|
||||
}
|
||||
if found_objects && *GLOBAL_IsErasure.read().await {
|
||||
// If we found an object in erasure mode, we skip subdirs (only datadirs)...
|
||||
break;
|
||||
break 'outer;
|
||||
}
|
||||
|
||||
let should_compact = self.new_cache.info.name != folder.name
|
||||
@@ -714,11 +712,11 @@ impl FolderScanner {
|
||||
|
||||
// Scan for healing
|
||||
if abandoned_children.is_empty() || !self.should_heal().await {
|
||||
break;
|
||||
break 'outer;
|
||||
}
|
||||
|
||||
if self.disks.is_empty() || self.disks_quorum == 0 {
|
||||
break;
|
||||
break 'outer;
|
||||
}
|
||||
|
||||
let (bg_seq, found) = GLOBAL_BackgroundHealState
|
||||
@@ -727,7 +725,7 @@ impl FolderScanner {
|
||||
.get_heal_sequence_by_token(BG_HEALING_UUID)
|
||||
.await;
|
||||
if !found {
|
||||
break;
|
||||
break 'outer;
|
||||
}
|
||||
let bg_seq = bg_seq.unwrap();
|
||||
|
||||
@@ -901,7 +899,6 @@ impl FolderScanner {
|
||||
scan(&this, into, self).await;
|
||||
}
|
||||
}
|
||||
times -= 1;
|
||||
}
|
||||
if !was_compacted {
|
||||
self.new_cache.replace_hashed(&this_hash, &Some(folder.parent.clone()), into);
|
||||
|
||||
@@ -7,6 +7,8 @@ use super::{
|
||||
HEAL_ITEM_BUCKET_METADATA,
|
||||
},
|
||||
};
|
||||
use crate::heal::heal_commands::{HEAL_DEEP_SCAN, HEAL_ITEM_BUCKET, HEAL_ITEM_OBJECT};
|
||||
use crate::store_api::StorageAPI;
|
||||
use crate::{
|
||||
config::common::CONFIG_PREFIX,
|
||||
disk::RUSTFS_META_BUCKET,
|
||||
@@ -25,10 +27,6 @@ use crate::{
|
||||
new_object_layer_fn,
|
||||
utils::path::has_profix,
|
||||
};
|
||||
use crate::{
|
||||
heal::heal_commands::{HEAL_ITEM_BUCKET, HEAL_ITEM_OBJECT},
|
||||
store_api::StorageAPI,
|
||||
};
|
||||
use lazy_static::lazy_static;
|
||||
use std::{
|
||||
collections::HashMap,
|
||||
@@ -140,6 +138,32 @@ pub fn new_bg_heal_sequence() -> HealSequence {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn new_heal_sequence(bucket: &str, obj_prefix: &str, client_addr: &str, hs: HealOpts, force_start: bool) -> HealSequence {
|
||||
let client_token = Uuid::new_v4().to_string();
|
||||
let (tx, rx) = mpsc::channel(10);
|
||||
HealSequence {
|
||||
bucket: bucket.to_string(),
|
||||
object: obj_prefix.to_string(),
|
||||
report_progress: true,
|
||||
start_time: SystemTime::now(),
|
||||
client_token,
|
||||
client_address: client_addr.to_string(),
|
||||
force_started: force_start,
|
||||
setting: hs.clone(),
|
||||
current_status: Arc::new(RwLock::new(HealSequenceStatus {
|
||||
summary: HEAL_NOT_STARTED_STATUS.to_string(),
|
||||
heal_setting: hs,
|
||||
..Default::default()
|
||||
})),
|
||||
traverse_and_heal_done_tx: Arc::new(RwLock::new(tx)),
|
||||
traverse_and_heal_done_rx: Arc::new(RwLock::new(rx)),
|
||||
scanned_items_map: HashMap::new(),
|
||||
healed_items_map: HashMap::new(),
|
||||
heal_failed_items_map: HashMap::new(),
|
||||
..Default::default()
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for HealSequence {
|
||||
fn default() -> Self {
|
||||
let (h_tx, h_rx) = mpsc::channel(1);
|
||||
|
||||
@@ -2173,7 +2173,7 @@ async fn init_local_peer(endpoint_pools: &EndpointServerPools, host: &String, po
|
||||
*GLOBAL_Local_Node_Name.write().await = peer_set[0].clone();
|
||||
}
|
||||
|
||||
fn is_valid_object_prefix(object: &str) -> bool {
|
||||
pub fn is_valid_object_prefix(object: &str) -> bool {
|
||||
// Implement object prefix validation
|
||||
!object.is_empty() // Placeholder
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user