From 72787c37538d15bd63147abaa62e323649d0babe Mon Sep 17 00:00:00 2001 From: Yaroslav Dynnikov <yaroslav.dynnikov@gmail.com> Date: Thu, 30 Jun 2022 13:52:42 +0300 Subject: [PATCH] fix: conftest cluster deploying --- src/main.rs | 15 ++++++++------- src/traft/node.rs | 2 +- src/traft/storage.rs | 30 ++++++++++++++++++++++-------- test/int/conftest.py | 5 +---- 4 files changed, 32 insertions(+), 20 deletions(-) diff --git a/src/main.rs b/src/main.rs index d048dc0b72..809d4e7cf7 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,8 +15,6 @@ use std::time::Duration; use clap::StructOpt as _; use protobuf::Message as _; -use crate::traft::{EntryContextNormal, LogicalClock}; - mod app; mod args; mod cache; @@ -382,7 +380,7 @@ fn start_discover(args: &args::Run, to_supervisor: ipc::Sender<IpcMessage>) { let role = discovery::wait_global(); // TODO assert traft::Storage::instance_id == (null || args.instance_id) - if traft::Storage::id().unwrap().is_some() { + if traft::Storage::raft_id().unwrap().is_some() { return postjoin(args); } @@ -419,6 +417,7 @@ fn start_boot(args: &args::Run) { args.advertise_address(), ); let raft_id = peer.raft_id; + let instance_id = peer.instance_id.clone(); picolib_setup(args); assert!(tarantool::cfg().is_none()); @@ -449,7 +448,7 @@ fn start_boot(args: &args::Run) { let e1 = { let ctx = traft::EntryContextNormal { op: traft::Op::PersistPeer { peer }, - lc: LogicalClock::new(raft_id, 0), + lc: traft::LogicalClock::new(raft_id, 0), }; let e = traft::Entry { entry_type: raft::EntryType::EntryNormal, @@ -483,7 +482,8 @@ fn start_boot(args: &args::Run) { traft::Storage::persist_entries(&[e1, e2]).unwrap(); traft::Storage::persist_commit(2).unwrap(); traft::Storage::persist_term(1).unwrap(); - traft::Storage::persist_id(raft_id).unwrap(); + traft::Storage::persist_raft_id(raft_id).unwrap(); + traft::Storage::persist_instance_id(&instance_id).unwrap(); traft::Storage::persist_cluster_id(&args.cluster_id).unwrap(); Ok(()) }) @@ -532,7 +532,8 @@ fn start_join(args: &args::Run, leader_address: String) { for peer in resp.raft_group { traft::Storage::persist_peer(&peer).unwrap(); } - traft::Storage::persist_id(raft_id).unwrap(); + traft::Storage::persist_raft_id(raft_id).unwrap(); + traft::Storage::persist_instance_id(&resp.peer.instance_id).unwrap(); traft::Storage::persist_cluster_id(&args.cluster_id).unwrap(); Ok(()) }) @@ -551,7 +552,7 @@ fn postjoin(args: &args::Run) { box_cfg.replication_connect_quorum = 0; tarantool::set_cfg(&box_cfg); - let raft_id = traft::Storage::id().unwrap().unwrap(); + let raft_id = traft::Storage::raft_id().unwrap().unwrap(); let applied = traft::Storage::applied().unwrap().unwrap_or(0); let raft_cfg = raft::Config { id: raft_id, diff --git a/src/traft/node.rs b/src/traft/node.rs index 6c676788bc..b8f580222b 100644 --- a/src/traft/node.rs +++ b/src/traft/node.rs @@ -556,7 +556,7 @@ fn raft_main_loop( let mut notifications: HashMap<LogicalClock, Notify> = HashMap::new(); let mut lc = { - let id = Storage::id().unwrap().unwrap(); + let id = Storage::raft_id().unwrap().unwrap(); let gen = Storage::gen().unwrap().unwrap_or(0) + 1; Storage::persist_gen(gen).unwrap(); LogicalClock::new(id, gen) diff --git a/src/traft/storage.rs b/src/traft/storage.rs index dfa669666d..bbef207a9d 100644 --- a/src/traft/storage.rs +++ b/src/traft/storage.rs @@ -207,8 +207,12 @@ impl Storage { Ok(ret) } - pub fn id() -> Result<Option<u64>, StorageError> { - Storage::raft_state("id") + pub fn raft_id() -> Result<Option<u64>, StorageError> { + Storage::raft_state("raft_id") + } + + pub fn instance_id() -> Result<Option<String>, StorageError> { + Storage::raft_state("instance_id") } pub fn cluster_id() -> Result<Option<String>, StorageError> { @@ -257,11 +261,21 @@ impl Storage { Storage::persist_raft_state("gen", gen) } - pub fn persist_id(id: u64) -> Result<(), StorageError> { + pub fn persist_raft_id(id: u64) -> Result<(), StorageError> { + Storage::space(RAFT_STATE)? + // We use `insert` instead of `replace` here + // because `raft_id` can never be changed. + .insert(&("raft_id", id)) + .map_err(box_err!())?; + + Ok(()) + } + + pub fn persist_instance_id(id: &str) -> Result<(), StorageError> { Storage::space(RAFT_STATE)? // We use `insert` instead of `replace` here - // because `id` can never be changed. - .insert(&("id", id)) + // because `instance_id` can never be changed. + .insert(&("instance_id", id)) .map_err(box_err!())?; Ok(()) @@ -521,11 +535,11 @@ inventory::submit!(crate::InnerTest { let mut raft_state = Storage::space("raft_state").unwrap(); raft_state.delete(&("id",)).unwrap(); - assert_eq!(Storage::id(), Ok(None)); + assert_eq!(Storage::raft_id(), Ok(None)); - Storage::persist_id(16).unwrap(); + Storage::persist_raft_id(16).unwrap(); assert_err!( - Storage::persist_id(32), + Storage::persist_raft_id(32), concat!( "unknown error", " Tarantool error:", diff --git a/test/int/conftest.py b/test/int/conftest.py index c70c54445d..f73ddf9870 100644 --- a/test/int/conftest.py +++ b/test/int/conftest.py @@ -335,10 +335,7 @@ class Instance: assert status.is_ready self.raft_id = status.id with self.connect(timeout=1) as conn: - self.instance_id = conn.space("raft_group").select((self.raft_id,))[0][ - POSITION_IN_SPACE_INSTANCE_ID - ] - eprint(f"{self.instance_id=}") + self.instance_id = conn.space("raft_state").select(("instance_id",))[0][1] eprint(f"{self} is ready") @funcy.retry(tries=4, timeout=0.1, errors=AssertionError) -- GitLab