aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2022-06-24 10:49:52 +0200
committerAlex Auvolat <alex@adnab.me>2022-06-24 10:49:52 +0200
commit0837b3dacd994b35dbccbfefdd68be044eb4b5ac (patch)
treece55e8978b852b69d9281bc170c20356e3c5dcfb
parent95ffba343f14d7274e08099b9aca5a85da2259ed (diff)
downloadgarage-0837b3dacd994b35dbccbfefdd68be044eb4b5ac.tar.gz
garage-0837b3dacd994b35dbccbfefdd68be044eb4b5ac.zip
Slightly improve blocking code, add info to resync worker
-rw-r--r--src/block/manager.rs17
-rw-r--r--src/table/merkle.rs13
2 files changed, 29 insertions, 1 deletions
diff --git a/src/block/manager.rs b/src/block/manager.rs
index db73ecbc..4a595cc8 100644
--- a/src/block/manager.rs
+++ b/src/block/manager.rs
@@ -728,6 +728,23 @@ impl Worker for ResyncWorker {
"Block resync worker".into()
}
+ fn info(&self) -> Option<String> {
+ let mut ret = vec![];
+ let qlen = self.manager.resync_queue_len().unwrap_or(0);
+ let elen = self.manager.resync_errors_len().unwrap_or(0);
+ if qlen > 0 {
+ ret.push(format!("{} blocks in queue", qlen));
+ }
+ if elen > 0 {
+ ret.push(format!("{} blocks in error state", elen));
+ }
+ if ret.len() > 0 {
+ Some(ret.join(", "))
+ } else {
+ None
+ }
+ }
+
async fn work(
&mut self,
_must_exit: &mut watch::Receiver<bool>,
diff --git a/src/table/merkle.rs b/src/table/merkle.rs
index 4c84933a..21186220 100644
--- a/src/table/merkle.rs
+++ b/src/table/merkle.rs
@@ -326,7 +326,18 @@ where
&mut self,
_must_exit: &mut watch::Receiver<bool>,
) -> Result<WorkerStatus, Error> {
- self.0.updater_loop_iter()
+ let updater = self.0.clone();
+ tokio::task::spawn_blocking(move || {
+ for _i in 0..100 {
+ let s = updater.updater_loop_iter();
+ if !matches!(s, Ok(WorkerStatus::Busy)) {
+ return s;
+ }
+ }
+ Ok(WorkerStatus::Busy)
+ })
+ .await
+ .unwrap()
}
async fn wait_for_work(&mut self, must_exit: &watch::Receiver<bool>) -> WorkerStatus {