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