support bitrot

Signed-off-by: junxiang Mu <1948535941@qq.com>
This commit is contained in:
junxiang Mu
2024-10-31 11:18:00 +08:00
parent c0e6751893
commit 640cf1caf3
5 changed files with 93 additions and 58 deletions
+14 -14
View File
@@ -160,7 +160,7 @@ impl HealingTracker {
}
pub async fn reset_healing(&mut self) {
self.mu.write().await;
let _ = self.mu.write().await;
self.items_healed = 0;
self.items_failed = 0;
self.bytes_done = 0;
@@ -178,37 +178,37 @@ impl HealingTracker {
}
pub async fn get_last_update(&self) -> u64 {
self.mu.read().await;
let _ = self.mu.read().await;
self.last_update
}
pub async fn get_bucket(&self) -> String {
self.mu.read().await;
let _ = self.mu.read().await;
self.bucket.clone()
}
pub async fn set_bucket(&mut self, bucket: &str) {
self.mu.write().await;
let _ = self.mu.write().await;
self.bucket = bucket.to_string();
}
pub async fn get_object(&self) -> String {
self.mu.read().await;
let _ = self.mu.read().await;
self.object.clone()
}
pub async fn set_object(&mut self, object: &str) {
self.mu.write().await;
let _ = self.mu.write().await;
self.object = object.to_string();
}
pub async fn update_progress(&mut self, success: bool, skipped: bool, by: u64) {
self.mu.write().await;
let _ = self.mu.write().await;
if success {
self.items_healed += 1;
@@ -227,7 +227,7 @@ impl HealingTracker {
if healing(&disk.path().to_string_lossy().to_string()).await?.is_none() {
return Err(Error::from_string(format!("healingTracker: drive {} is not marked as healing", self.id)));
}
self.mu.write().await;
let _ = self.mu.write().await;
if self.id.is_empty() || self.pool_index.is_none() || self.set_index.is_none() || self.disk_index.is_none() {
self.id = disk.get_disk_id().await?.map_or("".to_string(), |id| id.to_string());
let disk_location = disk.get_disk_location();
@@ -241,7 +241,7 @@ impl HealingTracker {
}
pub async fn save(&mut self) -> Result<()> {
self.mu.write().await;
let _ = self.mu.write().await;
if self.pool_index.is_none() || self.set_index.is_none() || self.disk_index.is_none() {
let layer = new_object_layer_fn();
let lock = layer.read().await;
@@ -290,7 +290,7 @@ impl HealingTracker {
}
async fn is_healed(&self, bucket: &str) -> bool {
self.mu.read().await;
let _ = self.mu.read().await;
for v in self.healed_buckets.iter() {
if v == bucket {
return true;
@@ -301,7 +301,7 @@ impl HealingTracker {
}
async fn resume(&mut self) {
self.mu.write().await;
let _ = self.mu.write().await;
self.items_healed = self.resume_items_healed;
self.items_failed = self.resume_items_failed;
@@ -312,7 +312,7 @@ impl HealingTracker {
}
async fn bucket_done(&mut self, bucket: &str) {
self.mu.write().await;
let _ = self.mu.write().await;
self.resume_items_healed = self.items_healed;
self.resume_items_failed = self.items_failed;
@@ -326,7 +326,7 @@ impl HealingTracker {
}
async fn set_queue_buckets(&mut self, buckets: &[BucketInfo]) {
self.mu.write().await;
let _ = self.mu.write().await;
buckets.iter().for_each(|bucket| {
if !self.healed_buckets.contains(&bucket.name) {
@@ -336,7 +336,7 @@ impl HealingTracker {
}
pub async fn to_healing_disk(&self) -> HealingDisk {
self.mu.read().await;
let _ = self.mu.read().await;
HealingDisk {
id: self.id.clone(),
+12 -12
View File
@@ -13,7 +13,7 @@ use std::{
path::Path,
pin::Pin,
sync::Arc,
time::{Duration, Instant, SystemTime, UNIX_EPOCH},
time::{Duration, SystemTime, UNIX_EPOCH},
};
use tokio::{
select, spawn,
@@ -202,7 +202,7 @@ impl HealSequence {
async fn stop(&self) {
let w = self.tx.write().await;
w.send(true);
let _ = w.send(true);
}
async fn push_heal_result_item(&self, r: &HealResultItem) -> Result<()> {
@@ -363,7 +363,7 @@ impl AllHealState {
}
async fn pop_heal_local_disks(&mut self, heal_local_disks: &[Endpoint]) {
self.mu.write().await;
let _ = self.mu.write().await;
self.heal_local_disks.retain(|k, _| {
if heal_local_disks.contains(k) {
@@ -383,14 +383,14 @@ impl AllHealState {
}
async fn update_heal_status(&mut self, tracker: &HealingTracker) {
self.mu.write().await;
tracker.mu.read().await;
let _ = self.mu.write().await;
let _ = tracker.mu.read().await;
self.heal_status.insert(tracker.id.clone(), tracker.clone());
}
async fn get_local_healing_disks(&self) -> HashMap<String, HealingDisk> {
self.mu.read().await;
let _ = self.mu.read().await;
let mut dst = HashMap::new();
for v in self.heal_status.values() {
@@ -401,7 +401,7 @@ impl AllHealState {
}
async fn get_heal_local_disk_endpoints(&self) -> Endpoints {
self.mu.read().await;
let _ = self.mu.read().await;
let mut endpoints = Vec::new();
self.heal_local_disks.iter().for_each(|(k, v)| {
@@ -414,13 +414,13 @@ impl AllHealState {
}
async fn set_disk_healing_status(&mut self, ep: Endpoint, healing: bool) {
self.mu.write().await;
let _ = self.mu.write().await;
self.heal_local_disks.insert(ep, healing);
}
async fn push_heal_local_disks(&mut self, heal_local_disks: &[Endpoint]) {
self.mu.write().await;
let _ = self.mu.write().await;
heal_local_disks.iter().for_each(|heal_local_disk| {
self.heal_local_disks.insert(heal_local_disk.clone(), false);
@@ -436,7 +436,7 @@ impl AllHealState {
}
}
_ = sleep(Duration::from_secs(5 * 60)) => {
self.mu.write().await;
let _ = self.mu.write().await;
let now = SystemTime::now();
let mut keys_to_reomve = Vec::new();
@@ -454,7 +454,7 @@ impl AllHealState {
}
async fn get_heal_sequence_by_token(&self, token: &str) -> (Option<HealSequence>, bool) {
self.mu.read().await;
let _ = self.mu.read().await;
for v in self.heal_seq_map.values() {
if v.client_token == token {
@@ -466,7 +466,7 @@ impl AllHealState {
}
async fn get_heal_sequence(&self, path: &str) -> Option<HealSequence> {
self.mu.read().await;
let _ = self.mu.read().await;
self.heal_seq_map.get(path).cloned()
}