diff options
Diffstat (limited to 'src/rpc')
-rw-r--r-- | src/rpc/Cargo.toml | 6 | ||||
-rw-r--r-- | src/rpc/membership.rs | 20 | ||||
-rw-r--r-- | src/rpc/ring.rs | 28 |
3 files changed, 45 insertions, 9 deletions
diff --git a/src/rpc/Cargo.toml b/src/rpc/Cargo.toml index 622f8ebc..f1204cdf 100644 --- a/src/rpc/Cargo.toml +++ b/src/rpc/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "garage_rpc" -version = "0.2.1" +version = "0.3.0" authors = ["Alex Auvolat <alex@adnab.me>"] edition = "2018" license = "AGPL-3.0" @@ -13,7 +13,9 @@ path = "lib.rs" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -garage_util = { version = "0.2.1", path = "../util" } +garage_util = { version = "0.3.0", path = "../util" } + +garage_rpc_021 = { package = "garage_rpc", version = "0.2.1" } arc-swap = "1.0" bytes = "1.0" diff --git a/src/rpc/membership.rs b/src/rpc/membership.rs index 37cf8105..72477539 100644 --- a/src/rpc/membership.rs +++ b/src/rpc/membership.rs @@ -240,11 +240,21 @@ impl System { let net_config = match persist_config.load() { Ok(x) => x, Err(e) => { - info!( - "No valid previous network configuration stored ({}), starting fresh.", - e - ); - NetworkConfig::new() + match Persister::<garage_rpc_021::ring::NetworkConfig>::new( + &metadata_dir, + "network_config", + ) + .load() + { + Ok(old_config) => NetworkConfig::migrate_from_021(old_config), + Err(e2) => { + info!( + "No valid previous network configuration stored ({}, {}), starting fresh.", + e, e2 + ); + NetworkConfig::new() + } + } } }; diff --git a/src/rpc/ring.rs b/src/rpc/ring.rs index a5e5d4af..90db8fd2 100644 --- a/src/rpc/ring.rs +++ b/src/rpc/ring.rs @@ -38,6 +38,31 @@ impl NetworkConfig { version: 0, } } + + pub(crate) fn migrate_from_021(old: garage_rpc_021::ring::NetworkConfig) -> Self { + let members = old + .members + .into_iter() + .map(|(id, conf)| { + ( + Hash::try_from(id.as_slice()).unwrap(), + NetworkConfigEntry { + zone: conf.datacenter, + capacity: if conf.capacity == 0 { + None + } else { + Some(conf.capacity) + }, + tag: conf.tag, + }, + ) + }) + .collect(); + Self { + members, + version: old.version, + } + } } /// The overall configuration of one (possibly remote) node @@ -178,8 +203,7 @@ impl Ring { .iter() .map(|(_id, info)| info.zone.as_str()) .collect::<HashSet<&str>>(); - if (p_zns.len() < n_zones - && !p_zns.contains(&node_info.zone.as_str())) + if (p_zns.len() < n_zones && !p_zns.contains(&node_info.zone.as_str())) || (p_zns.len() == n_zones && !partitions[qv].iter().any(|(id, _i)| id == node_id)) { |