aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Auvolat <lx@deuxfleurs.fr>2025-02-14 16:27:12 +0100
committerAlex Auvolat <lx@deuxfleurs.fr>2025-02-14 16:45:55 +0100
commitfdf4dad72833264be6bc4bae70f4e743e656d2df (patch)
tree039d580983ae1f04235e7e5e36cbf64f23e89e7e
parent6820b69f305728cab10065e403afd94a240c7c46 (diff)
downloadgarage-fdf4dad72833264be6bc4bae70f4e743e656d2df.tar.gz
garage-fdf4dad72833264be6bc4bae70f4e743e656d2df.zip
block resync: avoid saving blocks to draining nodes
-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