improve scanner(1)

Signed-off-by: junxiang Mu <1948535941@qq.com>
This commit is contained in:
junxiang Mu
2025-05-28 10:57:59 +00:00
parent 059a546604
commit 155cb546ac
3 changed files with 22 additions and 16 deletions
+8 -8
View File
@@ -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
View File
@@ -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);
+1 -1
View File
@@ -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
{ {