mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-08-31 17:28:13 +00:00
block manager: avoid deadlock in fix_block_location (fix #845)
This commit is contained in:
+4
-14
@@ -668,10 +668,12 @@ impl BlockManager {
|
|||||||
hash: &Hash,
|
hash: &Hash,
|
||||||
wrong_path: DataBlockPath,
|
wrong_path: DataBlockPath,
|
||||||
) -> Result<usize, Error> {
|
) -> Result<usize, Error> {
|
||||||
|
let data = self.read_block_from(hash, &wrong_path).await?;
|
||||||
self.lock_mutate(hash)
|
self.lock_mutate(hash)
|
||||||
.await
|
.await
|
||||||
.fix_block_location(hash, wrong_path, self)
|
.write_block_inner(hash, &data, self, Some(wrong_path))
|
||||||
.await
|
.await?;
|
||||||
|
Ok(data.as_parts_ref().1.len())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn lock_mutate(&self, hash: &Hash) -> MutexGuard<'_, BlockManagerLocked> {
|
async fn lock_mutate(&self, hash: &Hash) -> MutexGuard<'_, BlockManagerLocked> {
|
||||||
@@ -827,18 +829,6 @@ impl BlockManagerLocked {
|
|||||||
}
|
}
|
||||||
Ok(())
|
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>);
|
struct DeleteOnDrop(Option<PathBuf>);
|
||||||
|
|||||||
Reference in New Issue
Block a user