From 9bb58638f044722b58c7a88711fa474152d716b6 Mon Sep 17 00:00:00 2001 From: Alex Auvolat Date: Fri, 3 Jun 2022 12:56:35 +0200 Subject: [PATCH] Fix block repair to not deadlock with sqlite --- src/block/manager.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/block/manager.rs b/src/block/manager.rs index 73dd453f..decf33cc 100644 --- a/src/block/manager.rs +++ b/src/block/manager.rs @@ -218,9 +218,17 @@ impl BlockManager { /// to fix any mismatch between the two. pub async fn repair_data_store(&self, must_exit: &watch::Receiver) -> Result<(), Error> { // 1. Repair blocks from RC table. + // TODO don't do this like this + let mut hashes = vec![]; for (i, entry) in self.rc.rc.iter()?.enumerate() { let (hash, _) = entry?; let hash = Hash::try_from(&hash[..]).unwrap(); + hashes.push(hash); + if i & 0xFF == 0 && *must_exit.borrow() { + return Ok(()); + } + } + for (i, hash) in hashes.into_iter().enumerate() { self.put_to_resync(&hash, Duration::from_secs(0))?; if i & 0xFF == 0 && *must_exit.borrow() { return Ok(());