aboutsummaryrefslogtreecommitdiff
path: root/src/rpc/layout/schema.rs
diff options
context:
space:
mode:
authorAlex Auvolat <alex@adnab.me>2023-11-09 14:53:34 +0100
committerAlex Auvolat <alex@adnab.me>2023-11-09 14:53:34 +0100
commit94caf9c0c1342ce1d2ba3ac7af39fb133721ee83 (patch)
treeb1ac2bff79fb0f05256f0636e2272442c7994b6d /src/rpc/layout/schema.rs
parentbfb1845fdc981a370539d641a5d80f438f184f07 (diff)
downloadgarage-94caf9c0c1342ce1d2ba3ac7af39fb133721ee83.tar.gz
garage-94caf9c0c1342ce1d2ba3ac7af39fb133721ee83.zip
layout: separate code path for synchronizing update trackers only
Diffstat (limited to 'src/rpc/layout/schema.rs')
-rw-r--r--src/rpc/layout/schema.rs23
1 files changed, 17 insertions, 6 deletions
diff --git a/src/rpc/layout/schema.rs b/src/rpc/layout/schema.rs
index d587a6cb..abae5bd8 100644
--- a/src/rpc/layout/schema.rs
+++ b/src/rpc/layout/schema.rs
@@ -233,6 +233,8 @@ mod v010 {
/// Update trackers
pub update_trackers: UpdateTrackers,
+ /// Hash of the update trackers
+ pub trackers_hash: Hash,
/// Staged changes for the next version
pub staging: Lww<LayoutStaging>,
@@ -289,10 +291,12 @@ mod v010 {
sync_map: update_tracker.clone(),
sync_ack_map: update_tracker.clone(),
},
+ trackers_hash: [0u8; 32].into(),
staging: Lww::raw(previous.version, staging),
staging_hash: [0u8; 32].into(),
};
ret.staging_hash = ret.calculate_staging_hash();
+ ret.trackers_hash = ret.calculate_trackers_hash();
ret
}
}
@@ -355,14 +359,20 @@ impl core::str::FromStr for ZoneRedundancy {
}
impl UpdateTracker {
- fn merge(&mut self, other: &UpdateTracker) {
+ fn merge(&mut self, other: &UpdateTracker) -> bool {
+ let mut changed = false;
for (k, v) in other.0.iter() {
if let Some(v_mut) = self.0.get_mut(k) {
- *v_mut = std::cmp::max(*v_mut, *v);
+ if *v > *v_mut {
+ *v_mut = *v;
+ changed = true;
+ }
} else {
self.0.insert(*k, *v);
+ changed = true;
}
}
+ changed
}
pub(crate) fn min(&self) -> u64 {
@@ -371,9 +381,10 @@ impl UpdateTracker {
}
impl UpdateTrackers {
- pub(crate) fn merge(&mut self, other: &UpdateTrackers) {
- self.ack_map.merge(&other.ack_map);
- self.sync_map.merge(&other.sync_map);
- self.sync_ack_map.merge(&other.sync_ack_map);
+ pub(crate) fn merge(&mut self, other: &UpdateTrackers) -> bool {
+ let c1 = self.ack_map.merge(&other.ack_map);
+ let c2 = self.sync_map.merge(&other.sync_map);
+ let c3 = self.sync_ack_map.merge(&other.sync_ack_map);
+ c1 || c2 || c3
}
}