aboutsummaryrefslogtreecommitdiff
path: root/src/block/repair.rs
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2022-09-05 12:40:17 +0200
committerAlex Auvolat <alex@adnab.me>2022-09-05 12:40:17 +0200
commit07e6bcde85bd1b24ec62b4f4cb552a7a20247370 (patch)
tree9eaf8de338f9aac41ae499517a2adf1159a48864 /src/block/repair.rs
parent6226f5ceca7828d096890c3dbc5b9fbc3f7c4b14 (diff)
parent0009fd136c744944888df15d706ca08ca251aed7 (diff)
downloadgarage-07e6bcde85bd1b24ec62b4f4cb552a7a20247370.tar.gz
garage-07e6bcde85bd1b24ec62b4f4cb552a7a20247370.zip
Merge branch 'main' into lx-perf-improvements
Diffstat (limited to 'src/block/repair.rs')
-rw-r--r--src/block/repair.rs34
1 files changed, 28 insertions, 6 deletions
diff --git a/src/block/repair.rs b/src/block/repair.rs
index 07ff6772..e2884b69 100644
--- a/src/block/repair.rs
+++ b/src/block/repair.rs
@@ -19,7 +19,17 @@ use garage_util::tranquilizer::Tranquilizer;
use crate::manager::*;
-const SCRUB_INTERVAL: Duration = Duration::from_secs(3600 * 24 * 30); // full scrub every 30 days
+// Full scrub every 30 days
+const SCRUB_INTERVAL: Duration = Duration::from_secs(3600 * 24 * 30);
+// Scrub tranquility is initially set to 4, but can be changed in the CLI
+// and the updated version is persisted over Garage restarts
+const INITIAL_SCRUB_TRANQUILITY: u32 = 4;
+
+// ---- ---- ----
+// FIRST KIND OF REPAIR: FINDING MISSING BLOCKS/USELESS BLOCKS
+// This is a one-shot repair operation that can be launched,
+// checks everything, and then exits.
+// ---- ---- ----
pub struct RepairWorker {
manager: Arc<BlockManager>,
@@ -102,7 +112,9 @@ impl Worker for RepairWorker {
}
for hash in batch_of_hashes.into_iter() {
- self.manager.put_to_resync(&hash, Duration::from_secs(0))?;
+ self.manager
+ .resync
+ .put_to_resync(&hash, Duration::from_secs(0))?;
self.next_start = Some(hash)
}
@@ -114,7 +126,9 @@ impl Worker for RepairWorker {
// This allows us to find blocks we are storing but don't actually need,
// so that we can offload them if necessary and then delete them locally.
if let Some(hash) = bi.next().await? {
- self.manager.put_to_resync(&hash, Duration::from_secs(0))?;
+ self.manager
+ .resync
+ .put_to_resync(&hash, Duration::from_secs(0))?;
Ok(WorkerState::Busy)
} else {
Ok(WorkerState::Done)
@@ -128,7 +142,13 @@ impl Worker for RepairWorker {
}
}
-// ----
+// ---- ---- ----
+// SECOND KIND OF REPAIR: SCRUBBING THE DATASTORE
+// This is significantly more complex than the process above,
+// as it is a continuously-running task that triggers automatically
+// every SCRUB_INTERVAL, but can also be triggered manually
+// and whose parameter (esp. speed) can be controlled at runtime.
+// ---- ---- ----
pub struct ScrubWorker {
manager: Arc<BlockManager>,
@@ -176,7 +196,7 @@ impl ScrubWorker {
Ok(v) => v,
Err(_) => ScrubWorkerPersisted {
time_last_complete_scrub: 0,
- tranquility: 4,
+ tranquility: INITIAL_SCRUB_TRANQUILITY,
corruptions_detected: 0,
},
};
@@ -343,7 +363,9 @@ impl Worker for ScrubWorker {
}
}
-// ----
+// ---- ---- ----
+// UTILITY FOR ENUMERATING THE BLOCK STORE
+// ---- ---- ----
struct BlockStoreIterator {
path: Vec<ReadingDir>,