From c71e33514b6a580cdc94e1f08dcdcdda61642d27 Mon Sep 17 00:00:00 2001 From: Yaroslav Dynnikov <yaroslav.dynnikov@gmail.com> Date: Sun, 22 May 2022 23:31:17 +0300 Subject: [PATCH] feature: support replicaset_uuid - Add corresponding field to the Peer struct. - Generate it in the topology module. - Use it in `box.cfg`. Close https://git.picodata.io/picodata/picodata/picodata/-/issues/51 --- src/main.rs | 2 +- src/traft/mod.rs | 11 ++++++++++- src/traft/storage.rs | 2 +- src/traft/topology.rs | 7 ++++++- 4 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/main.rs b/src/main.rs index e38f354a5e..7b5c8bda41 100644 --- a/src/main.rs +++ b/src/main.rs @@ -473,7 +473,7 @@ fn start_join(args: &args::Run, leader_address: String) { listen: None, read_only: false, instance_uuid: Some(resp.peer.instance_uuid.clone()), - // replicaset_uuid: resp.replicaset_uuid + replicaset_uuid: Some(resp.peer.replicaset_uuid.clone()), replication: resp.box_replication.clone(), wal_dir: args.data_dir.clone(), memtx_dir: args.data_dir.clone(), diff --git a/src/traft/mod.rs b/src/traft/mod.rs index 94db0ff5c8..375a793102 100644 --- a/src/traft/mod.rs +++ b/src/traft/mod.rs @@ -71,7 +71,7 @@ pub struct Peer { pub instance_id: String, pub replicaset_id: String, pub instance_uuid: String, - // pub replicaset_uuid: String, + pub replicaset_uuid: String, /// `0` means it's not committed yet. pub commit_index: u64, } @@ -303,6 +303,8 @@ impl AsTuple for JoinResponse {} lazy_static::lazy_static! { static ref NAMESPACE_INSTANCE_UUID: Uuid = Uuid::new_v3(&Uuid::nil(), "INSTANCE_UUID".as_bytes()); + static ref NAMESPACE_REPLICASET_UUID: Uuid = + Uuid::new_v3(&Uuid::nil(), "REPLICASET_UUID".as_bytes()); } /// Generate UUID for an instance from `instance_id` (String). @@ -311,3 +313,10 @@ pub fn instance_uuid(instance_id: &str) -> String { let uuid = Uuid::new_v3(&NAMESPACE_INSTANCE_UUID, instance_id.as_bytes()); uuid.hyphenated().to_string() } + +/// Generate UUID for a replicaset from `replicaset_id` (String). +/// Use Version-3 (MD5) UUID. +pub fn replicaset_uuid(replicaset_id: &str) -> String { + let uuid = Uuid::new_v3(&NAMESPACE_REPLICASET_UUID, replicaset_id.as_bytes()); + uuid.hyphenated().to_string() +} diff --git a/src/traft/storage.rs b/src/traft/storage.rs index d05266300c..c576090fac 100644 --- a/src/traft/storage.rs +++ b/src/traft/storage.rs @@ -78,7 +78,7 @@ impl Storage { {name = 'instance_id', type = 'string', is_nullable = false}, {name = 'replicaset_id', type = 'string', is_nullable = false}, {name = 'instance_uuid', type = 'string', is_nullable = false}, - -- {name = 'replicaset_uuid', type = 'string', is_nullable = false}, + {name = 'replicaset_uuid', type = 'string', is_nullable = false}, {name = 'commit_index', type = 'unsigned', is_nullable = false}, } }) diff --git a/src/traft/topology.rs b/src/traft/topology.rs index 3d59c7fc35..71997947bd 100644 --- a/src/traft/topology.rs +++ b/src/traft/topology.rs @@ -2,6 +2,7 @@ use std::collections::BTreeMap; use std::collections::BTreeSet; use crate::traft::instance_uuid; +use crate::traft::replicaset_uuid; use crate::traft::JoinRequest; use crate::traft::Peer; use crate::traft::RaftId; @@ -106,6 +107,7 @@ impl Topology { Some(v) => v.clone(), None => self.choose_replicaset_id(), }; + let replicaset_uuid = replicaset_uuid(&replicaset_id); let peer = Peer { raft_id, @@ -113,6 +115,7 @@ impl Topology { replicaset_id, commit_index: INVALID_INDEX, instance_uuid: instance_uuid(&req.instance_id), + replicaset_uuid, peer_address: req.advertise_address.clone(), voter: req.voter, }; @@ -133,6 +136,7 @@ impl Topology { mod tests { use super::Topology; use crate::traft::instance_uuid; + use crate::traft::replicaset_uuid; use crate::traft::JoinRequest; use crate::traft::Peer; @@ -151,8 +155,9 @@ mod tests { voter: $voter, instance_id: $instance_id.into(), replicaset_id: $replicaset_id.into(), - commit_index: raft::INVALID_INDEX, instance_uuid: instance_uuid($instance_id), + replicaset_uuid: replicaset_uuid($replicaset_id), + commit_index: raft::INVALID_INDEX, } ),*] }; -- GitLab