mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-25 13:36:50 +00:00
@@ -2384,16 +2384,16 @@ impl DiskAPI for LocalDisk {
|
|||||||
}
|
}
|
||||||
let stop_fn = ScannerMetrics::log(ScannerMetric::ScanObject);
|
let stop_fn = ScannerMetrics::log(ScannerMetric::ScanObject);
|
||||||
let mut res = HashMap::new();
|
let mut res = HashMap::new();
|
||||||
let done_sz = ScannerMetrics::time_size(ScannerMetric::ReadMetadata).await;
|
let done_sz = ScannerMetrics::time_size(ScannerMetric::ReadMetadata);
|
||||||
let buf = match disk.read_metadata(item.path.clone()).await {
|
let buf = match disk.read_metadata(item.path.clone()).await {
|
||||||
Ok(buf) => buf,
|
Ok(buf) => buf,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
res.insert("err".to_string(), err.to_string());
|
res.insert("err".to_string(), err.to_string());
|
||||||
stop_fn(&res).await;
|
stop_fn(&res);
|
||||||
return Err(Error::from_string(ERR_SKIP_FILE));
|
return Err(Error::from_string(ERR_SKIP_FILE));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
done_sz(buf.len() as u64).await;
|
done_sz(buf.len() as u64);
|
||||||
res.insert("metasize".to_string(), buf.len().to_string());
|
res.insert("metasize".to_string(), buf.len().to_string());
|
||||||
item.transform_meda_dir();
|
item.transform_meda_dir();
|
||||||
let meta_cache = MetaCacheEntry {
|
let meta_cache = MetaCacheEntry {
|
||||||
@@ -2405,7 +2405,7 @@ impl DiskAPI for LocalDisk {
|
|||||||
Ok(fivs) => fivs,
|
Ok(fivs) => fivs,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
res.insert("err".to_string(), err.to_string());
|
res.insert("err".to_string(), err.to_string());
|
||||||
stop_fn(&res).await;
|
stop_fn(&res);
|
||||||
return Err(Error::from_string(ERR_SKIP_FILE));
|
return Err(Error::from_string(ERR_SKIP_FILE));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2415,7 +2415,7 @@ impl DiskAPI for LocalDisk {
|
|||||||
Ok(obj_infos) => obj_infos,
|
Ok(obj_infos) => obj_infos,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
res.insert("err".to_string(), err.to_string());
|
res.insert("err".to_string(), err.to_string());
|
||||||
stop_fn(&res).await;
|
stop_fn(&res);
|
||||||
return Err(Error::from_string(ERR_SKIP_FILE));
|
return Err(Error::from_string(ERR_SKIP_FILE));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -2431,7 +2431,7 @@ impl DiskAPI for LocalDisk {
|
|||||||
let done = ScannerMetrics::time(ScannerMetric::ApplyVersion);
|
let done = ScannerMetrics::time(ScannerMetric::ApplyVersion);
|
||||||
let sz: usize;
|
let sz: usize;
|
||||||
(obj_deleted, sz) = item.apply_actions(info, &size_s).await;
|
(obj_deleted, sz) = item.apply_actions(info, &size_s).await;
|
||||||
done().await;
|
done();
|
||||||
|
|
||||||
if obj_deleted {
|
if obj_deleted {
|
||||||
break;
|
break;
|
||||||
@@ -2461,14 +2461,14 @@ impl DiskAPI for LocalDisk {
|
|||||||
let _obj_info =
|
let _obj_info =
|
||||||
frer_version.to_object_info(&item.bucket, &item.object_path().to_string_lossy(), versioned);
|
frer_version.to_object_info(&item.bucket, &item.object_path().to_string_lossy(), versioned);
|
||||||
let done = ScannerMetrics::time(ScannerMetric::TierObjSweep);
|
let done = ScannerMetrics::time(ScannerMetric::TierObjSweep);
|
||||||
done().await;
|
done();
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo: global trace
|
// todo: global trace
|
||||||
if obj_deleted {
|
if obj_deleted {
|
||||||
return Err(Error::from_string(ERR_IGNORE_FILE_CONTRIB));
|
return Err(Error::from_string(ERR_IGNORE_FILE_CONTRIB));
|
||||||
}
|
}
|
||||||
done().await;
|
done();
|
||||||
Ok(size_s)
|
Ok(size_s)
|
||||||
})
|
})
|
||||||
}),
|
}),
|
||||||
|
|||||||
+13
-7
@@ -2893,7 +2893,7 @@ impl SetDisks {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub async fn ns_scanner(
|
pub async fn ns_scanner(
|
||||||
&self,
|
self: Arc<Self>,
|
||||||
buckets: &[BucketInfo],
|
buckets: &[BucketInfo],
|
||||||
want_cycle: u32,
|
want_cycle: u32,
|
||||||
updates: Sender<DataUsageCache>,
|
updates: Sender<DataUsageCache>,
|
||||||
@@ -2911,7 +2911,7 @@ impl SetDisks {
|
|||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
let old_cache = DataUsageCache::load(self, DATA_USAGE_CACHE_NAME).await?;
|
let old_cache = DataUsageCache::load(&self, DATA_USAGE_CACHE_NAME).await?;
|
||||||
let mut cache = DataUsageCache {
|
let mut cache = DataUsageCache {
|
||||||
info: DataUsageCacheInfo {
|
info: DataUsageCacheInfo {
|
||||||
name: DATA_USAGE_ROOT.to_string(),
|
name: DATA_USAGE_ROOT.to_string(),
|
||||||
@@ -2934,6 +2934,7 @@ impl SetDisks {
|
|||||||
permutes.shuffle(&mut rng);
|
permutes.shuffle(&mut rng);
|
||||||
permutes
|
permutes
|
||||||
};
|
};
|
||||||
|
|
||||||
// Add new buckets first
|
// Add new buckets first
|
||||||
for idx in permutes.iter() {
|
for idx in permutes.iter() {
|
||||||
let b = buckets[*idx].clone();
|
let b = buckets[*idx].clone();
|
||||||
@@ -2954,6 +2955,7 @@ impl SetDisks {
|
|||||||
Duration::from_secs(30) + Duration::from_secs_f64(10.0 * rng.gen_range(0.0..1.0))
|
Duration::from_secs(30) + Duration::from_secs_f64(10.0 * rng.gen_range(0.0..1.0))
|
||||||
};
|
};
|
||||||
let mut ticker = interval(update_time);
|
let mut ticker = interval(update_time);
|
||||||
|
|
||||||
let task = tokio::spawn(async move {
|
let task = tokio::spawn(async move {
|
||||||
let last_save = Some(SystemTime::now());
|
let last_save = Some(SystemTime::now());
|
||||||
let mut need_loop = true;
|
let mut need_loop = true;
|
||||||
@@ -2983,8 +2985,8 @@ impl SetDisks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Restrict parallelism for disk usage scanner
|
// Restrict parallelism for disk usage scanner
|
||||||
// upto GOMAXPROCS if GOMAXPROCS is < len(disks)
|
|
||||||
let max_procs = num_cpus::get();
|
let max_procs = num_cpus::get();
|
||||||
if max_procs < disks.len() {
|
if max_procs < disks.len() {
|
||||||
disks = disks[0..max_procs].to_vec();
|
disks = disks[0..max_procs].to_vec();
|
||||||
@@ -2997,15 +2999,16 @@ impl SetDisks {
|
|||||||
Some(disk) => disk.clone(),
|
Some(disk) => disk.clone(),
|
||||||
None => continue,
|
None => continue,
|
||||||
};
|
};
|
||||||
|
let self_clone = Arc::clone(&self);
|
||||||
let bucket_rx_clone = bucket_rx.clone();
|
let bucket_rx_clone = bucket_rx.clone();
|
||||||
let buckets_results_tx_clone = buckets_results_tx.clone();
|
let buckets_results_tx_clone = buckets_results_tx.clone();
|
||||||
futures.push(async move {
|
futures.push(tokio::spawn(async move {
|
||||||
loop {
|
loop {
|
||||||
match bucket_rx_clone.write().await.try_recv() {
|
match bucket_rx_clone.write().await.try_recv() {
|
||||||
Err(_) => return,
|
Err(_) => return,
|
||||||
Ok(bucket_info) => {
|
Ok(bucket_info) => {
|
||||||
let cache_name = Path::new(&bucket_info.name).join(DATA_USAGE_CACHE_NAME);
|
let cache_name = Path::new(&bucket_info.name).join(DATA_USAGE_CACHE_NAME);
|
||||||
let mut cache = match DataUsageCache::load(self, &cache_name.to_string_lossy()).await {
|
let mut cache = match DataUsageCache::load(&self_clone, &cache_name.to_string_lossy()).await {
|
||||||
Ok(cache) => cache,
|
Ok(cache) => cache,
|
||||||
Err(_) => continue,
|
Err(_) => continue,
|
||||||
};
|
};
|
||||||
@@ -3022,6 +3025,7 @@ impl SetDisks {
|
|||||||
..Default::default()
|
..Default::default()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect updates.
|
// Collect updates.
|
||||||
let (tx, mut rx) = mpsc::channel(1);
|
let (tx, mut rx) = mpsc::channel(1);
|
||||||
let buckets_results_tx_inner_clone = buckets_results_tx_clone.clone();
|
let buckets_results_tx_inner_clone = buckets_results_tx_clone.clone();
|
||||||
@@ -3042,9 +3046,10 @@ impl SetDisks {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
// Calc usage
|
// Calc usage
|
||||||
let before = cache.info.last_update;
|
let before = cache.info.last_update;
|
||||||
let mut cache = match disk.clone().ns_scanner(&cache, tx, heal_scan_mode, None).await {
|
let mut cache = match disk.ns_scanner(&cache, tx, heal_scan_mode, None).await {
|
||||||
Ok(cache) => cache,
|
Ok(cache) => cache,
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
if cache.info.last_update > before {
|
if cache.info.last_update > before {
|
||||||
@@ -3078,8 +3083,9 @@ impl SetDisks {
|
|||||||
}
|
}
|
||||||
info!("continue scanner");
|
info!("continue scanner");
|
||||||
}
|
}
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("ns_scanner start");
|
info!("ns_scanner start");
|
||||||
let _ = join_all(futures).await;
|
let _ = join_all(futures).await;
|
||||||
drop(buckets_results_tx);
|
drop(buckets_results_tx);
|
||||||
|
|||||||
@@ -827,7 +827,7 @@ impl ECStore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
if let Err(err) = set
|
if let Err(err) = set.clone()
|
||||||
.ns_scanner(&all_buckets_clone, want_cycle as u32, tx, heal_scan_mode)
|
.ns_scanner(&all_buckets_clone, want_cycle as u32, tx, heal_scan_mode)
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user