aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlex <lx@deuxfleurs.fr>2025-02-14 16:53:01 +0000
committerAlex <lx@deuxfleurs.fr>2025-02-14 16:53:01 +0000
commita94adf804f79f8dcc0c704b4c061b8f79df7c88a (patch)
treebdfe98d8fae409f3c4aa9ca6eb13e2efaa29675e /src
parent9312c6bbcbd9c47bffa57baaee4efd40d418f62b (diff)
parente4c9a8cd5391ced427cb69ebd5f96e4482cc1536 (diff)
downloadgarage-a94adf804f79f8dcc0c704b4c061b8f79df7c88a.tar.gz
garage-a94adf804f79f8dcc0c704b4c061b8f79df7c88a.zip
Merge pull request 'block manager: avoid deadlock in fix_block_location (fix #845)' (#957) from fix-845 into main
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/957
Diffstat (limited to 'src')
-rw-r--r--src/block/manager.rs18
1 files changed, 4 insertions, 14 deletions
diff --git a/src/block/manager.rs b/src/block/manager.rs
index 572bdadd..41b2f02a 100644
--- a/src/block/manager.rs
+++ b/src/block/manager.rs
@@ -668,10 +668,12 @@ impl BlockManager {
hash: &Hash,
wrong_path: DataBlockPath,
) -> Result<usize, Error> {
+ let data = self.read_block_from(hash, &wrong_path).await?;
self.lock_mutate(hash)
.await
- .fix_block_location(hash, wrong_path, self)
- .await
+ .write_block_inner(hash, &data, self, Some(wrong_path))
+ .await?;
+ Ok(data.as_parts_ref().1.len())
}
async fn lock_mutate(&self, hash: &Hash) -> MutexGuard<'_, BlockManagerLocked> {
@@ -827,18 +829,6 @@ impl BlockManagerLocked {
}
Ok(())
}
-
- async fn fix_block_location(
- &self,
- hash: &Hash,
- wrong_path: DataBlockPath,
- mgr: &BlockManager,
- ) -> Result<usize, Error> {
- let data = mgr.read_block_from(hash, &wrong_path).await?;
- self.write_block_inner(hash, &data, mgr, Some(wrong_path))
- .await?;
- Ok(data.as_parts_ref().1.len())
- }
}
struct DeleteOnDrop(Option<PathBuf>);