From f8d0affd826da4ac40541dfc8a9c9d3b1454eeee Mon Sep 17 00:00:00 2001 From: Dominik Grygiel Date: Thu, 15 Aug 2024 17:47:16 +0200 Subject: [PATCH 1/3] Include `old_versions` when merging layouts, don't remove old layout versions --- src/rpc/layout/history.rs | 7 +------ src/rpc/layout/mod.rs | 3 --- 2 files changed, 1 insertion(+), 9 deletions(-) diff --git a/src/rpc/layout/history.rs b/src/rpc/layout/history.rs index af2cbc63..dc454727 100644 --- a/src/rpc/layout/history.rs +++ b/src/rpc/layout/history.rs @@ -107,11 +107,6 @@ impl LayoutHistory { ); self.old_versions.push(removed); } - - while self.old_versions.len() > OLD_VERSION_COUNT { - let removed = self.old_versions.remove(0); - info!("Layout history: removing old_version {}", removed.version); - } } pub(crate) fn clamp_update_trackers(&mut self, nodes: &[Uuid]) { @@ -230,7 +225,7 @@ impl LayoutHistory { let mut changed = false; // Add any new versions to history - for v2 in other.versions.iter() { + for v2 in other.old_versions.iter().chain(other.versions.iter()) { if let Some(v1) = self.versions.iter().find(|v| v.version == v2.version) { // Version is already present, check consistency if v1 != v2 { diff --git a/src/rpc/layout/mod.rs b/src/rpc/layout/mod.rs index 33676c37..37a558fe 100644 --- a/src/rpc/layout/mod.rs +++ b/src/rpc/layout/mod.rs @@ -231,9 +231,6 @@ mod v010 { use std::collections::BTreeMap; pub use v09::{LayoutParameters, NodeRole, NodeRoleV, ZoneRedundancy}; - /// Number of old (non-live) versions to keep, see LayoutHistory::old_versions - pub const OLD_VERSION_COUNT: usize = 5; - /// The history of cluster layouts, with trackers to keep a record /// of which nodes are up-to-date to current cluster data #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] -- 2.45.2 From 824e4738091813f605274a2a5404c83f40bd9c4f Mon Sep 17 00:00:00 2001 From: Dominik Grygiel Date: Mon, 19 Aug 2024 18:37:09 +0200 Subject: [PATCH 2/3] Consider both old and current versions when verifying layout history --- src/rpc/layout/history.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/rpc/layout/history.rs b/src/rpc/layout/history.rs index dc454727..157ef475 100644 --- a/src/rpc/layout/history.rs +++ b/src/rpc/layout/history.rs @@ -226,12 +226,12 @@ impl LayoutHistory { // Add any new versions to history for v2 in other.old_versions.iter().chain(other.versions.iter()) { - if let Some(v1) = self.versions.iter().find(|v| v.version == v2.version) { + if let Some(v1) = self.old_versions.iter().chain(self.versions.iter()).find(|v| v.version == v2.version) { // Version is already present, check consistency if v1 != v2 { error!("Inconsistent layout histories: different layout compositions for version {}. Your cluster will be broken as long as this layout version is not replaced.", v2.version); } - } else if self.versions.iter().all(|v| v.version != v2.version - 1) { + } else if self.old_versions.iter().chain(self.versions.iter()).all(|v| v.version != v2.version - 1) { error!( "Cannot receive new layout version {}, version {} is missing", v2.version, -- 2.45.2 From b5cefc0a991713341811029848b523b43b5f43b3 Mon Sep 17 00:00:00 2001 From: Dominik Grygiel Date: Mon, 19 Aug 2024 20:32:35 +0200 Subject: [PATCH 3/3] Fix fmt --- src/rpc/layout/history.rs | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/rpc/layout/history.rs b/src/rpc/layout/history.rs index 157ef475..515eefad 100644 --- a/src/rpc/layout/history.rs +++ b/src/rpc/layout/history.rs @@ -226,12 +226,22 @@ impl LayoutHistory { // Add any new versions to history for v2 in other.old_versions.iter().chain(other.versions.iter()) { - if let Some(v1) = self.old_versions.iter().chain(self.versions.iter()).find(|v| v.version == v2.version) { + if let Some(v1) = self + .old_versions + .iter() + .chain(self.versions.iter()) + .find(|v| v.version == v2.version) + { // Version is already present, check consistency if v1 != v2 { error!("Inconsistent layout histories: different layout compositions for version {}. Your cluster will be broken as long as this layout version is not replaced.", v2.version); } - } else if self.old_versions.iter().chain(self.versions.iter()).all(|v| v.version != v2.version - 1) { + } else if self + .old_versions + .iter() + .chain(self.versions.iter()) + .all(|v| v.version != v2.version - 1) + { error!( "Cannot receive new layout version {}, version {} is missing", v2.version, -- 2.45.2