diff --git a/src/main.rs b/src/main.rs index e38f354a5ead7ecdcb06dabf0314ab0684348c46..7b5c8bda4149d4d2040133d7f9f23d80bffeb609 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 94db0ff5c89389b4e41497ad1fffbba2825835e2..375a7931028946caab3f6407a900732dbc8c9e4f 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 d05266300c6fb853ae6c0fdbc805e9f8666c05b6..c576090fac073bc31f5f8b3ccb10d3544cdc9678 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 3d59c7fc35e3a1e4fe167dba332ca054909a1c25..71997947bd76399ba63cbd58acf47997a96c11ff 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, } ),*] };