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