aboutsummaryrefslogtreecommitdiff
path: root/src/block/resync.rs
diff options
context:
space:
mode:
authorAlex <lx@deuxfleurs.fr>2025-02-14 15:53:16 +0000
committerAlex <lx@deuxfleurs.fr>2025-02-14 15:53:16 +0000
commit9312c6bbcbd9c47bffa57baaee4efd40d418f62b (patch)
tree039d580983ae1f04235e7e5e36cbf64f23e89e7e /src/block/resync.rs
parent3fe8db9e52bf7fd069d8fa11d6a0c90a7d2944b6 (diff)
parentfdf4dad72833264be6bc4bae70f4e743e656d2df (diff)
downloadgarage-9312c6bbcbd9c47bffa57baaee4efd40d418f62b.tar.gz
garage-9312c6bbcbd9c47bffa57baaee4efd40d418f62b.zip
Merge pull request 'Store data blocks only on nodes in the latest cluster layout version (fix #815)' (#956) from fix-815 into main
Reviewed-on: https://git.deuxfleurs.fr/Deuxfleurs/garage/pulls/956
Diffstat (limited to 'src/block/resync.rs')
-rw-r--r--src/block/resync.rs24
1 files changed, 23 insertions, 1 deletions
diff --git a/src/block/resync.rs b/src/block/resync.rs
index 947c68de..b476a0b8 100644
--- a/src/block/resync.rs
+++ b/src/block/resync.rs
@@ -377,7 +377,10 @@ impl BlockResyncManager {
info!("Resync block {:?}: offloading and deleting", hash);
let existing_path = existing_path.unwrap();
- let mut who = manager.replication.storage_nodes(hash);
+ let mut who = manager
+ .system
+ .cluster_layout()
+ .current_storage_nodes_of(hash);
if who.len() < manager.replication.write_quorum() {
return Err(Error::Message("Not trying to offload block because we don't have a quorum of nodes to write to".to_string()));
}
@@ -455,6 +458,25 @@ impl BlockResyncManager {
}
if rc.is_nonzero() && !exists {
+ // The refcount is > 0, and the block is not present locally.
+ // We might need to fetch it from another node.
+
+ // First, check whether we are still supposed to store that
+ // block in the latest cluster layout version.
+ let storage_nodes = manager
+ .system
+ .cluster_layout()
+ .current_storage_nodes_of(&hash);
+
+ if !storage_nodes.contains(&manager.system.id) {
+ info!(
+ "Resync block {:?}: block is absent with refcount > 0, but it will drop to zero after all metadata is synced. Not fetching the block.",
+ hash
+ );
+ return Ok(());
+ }
+
+ // We know we need the block. Fetch it.
info!(
"Resync block {:?}: fetching absent but needed block (refcount > 0)",
hash