From 6bf9d204c3f4b90f54cbb39a26b6f6d73187e33d Mon Sep 17 00:00:00 2001
From: Georgy Moshkin <gmoshkin@picodata.io>
Date: Thu, 20 Oct 2022 16:34:20 +0300
Subject: [PATCH] refactor: you really shouldn't optimize prematurely :(

---
 src/traft/rpc/sharding.rs | 18 ++++++++----------
 src/traft/storage.rs      | 31 +++++++++++++++++++++++++++++++
 2 files changed, 39 insertions(+), 10 deletions(-)

diff --git a/src/traft/rpc/sharding.rs b/src/traft/rpc/sharding.rs
index d396561fdd..1a3920ebdb 100644
--- a/src/traft/rpc/sharding.rs
+++ b/src/traft/rpc/sharding.rs
@@ -64,7 +64,6 @@ impl super::Request for Request {
 #[rustfmt::skip]
 pub mod cfg {
     use crate::traft::error::Error;
-    use crate::traft::storage::peer_field;
     use crate::traft::storage::{Peers, Storage};
 
     use ::tarantool::tlua;
@@ -123,19 +122,18 @@ pub mod cfg {
         }
 
         pub fn new(peers: &Peers, replicaset_weights: ReplicasetWeights) -> Result<Self, Error> {
-            use peer_field::{InstanceId, InstanceUuid, PeerAddress, ReplicasetUuid, ReplicasetId, IsMaster};
-            type Fields = (InstanceId, InstanceUuid, PeerAddress, ReplicasetUuid, ReplicasetId, IsMaster);
             let mut sharding: HashMap<String, Replicaset> = HashMap::new();
-            for (id, uuid, addr, rset, rset_id, is_master) in peers.peers_fields::<Fields>()? {
-                let replicaset = sharding.entry(rset).or_insert_with(||
-                    Replicaset::with_weight(replicaset_weights.get(&rset_id).copied())
+            for peer in peers.iter()? {
+                let replicaset_id = peer.replicaset_id;
+                let replicaset = sharding.entry(peer.replicaset_uuid).or_insert_with(||
+                    Replicaset::with_weight(replicaset_weights.get(&replicaset_id).copied())
                 );
                 replicaset.replicas.insert(
-                    uuid,
+                    peer.instance_uuid,
                     Replica {
-                        uri: format!("guest:@{addr}"),
-                        name: id.into(),
-                        master: is_master,
+                        uri: format!("guest:@{}", peer.peer_address),
+                        name: peer.instance_id.into(),
+                        master: peer.is_master,
                     },
                 );
             }
diff --git a/src/traft/storage.rs b/src/traft/storage.rs
index c1db966409..4bde4480ee 100644
--- a/src/traft/storage.rs
+++ b/src/traft/storage.rs
@@ -327,6 +327,12 @@ impl Peers {
         Ok(PeersFields::new(iter))
     }
 
+    #[inline]
+    pub fn iter(&self) -> tarantool::Result<PeerIter> {
+        let iter = self.space().select(IteratorType::All, &())?;
+        Ok(PeerIter::new(iter))
+    }
+
     #[inline]
     pub fn all_peers(&self) -> tarantool::Result<Vec<traft::Peer>> {
         self.space()
@@ -555,6 +561,31 @@ impl PeerId for traft::InstanceId {
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+// PeerIter
+////////////////////////////////////////////////////////////////////////////////
+
+pub struct PeerIter {
+    iter: IndexIterator,
+}
+
+impl PeerIter {
+    fn new(iter: IndexIterator) -> Self {
+        Self { iter }
+    }
+}
+
+impl Iterator for PeerIter {
+    type Item = traft::Peer;
+    fn next(&mut self) -> Option<Self::Item> {
+        self.iter
+            .next()
+            .as_ref()
+            .map(Tuple::decode)
+            .map(Result::unwrap)
+    }
+}
+
 ////////////////////////////////////////////////////////////////////////////////
 // PeersFields
 ////////////////////////////////////////////////////////////////////////////////
-- 
GitLab