Skip to content
Snippets Groups Projects
Commit cc39db60 authored by Georgy Moshkin's avatar Georgy Moshkin :speech_balloon: Committed by Georgy Moshkin
Browse files

feat(storage): Peers::peers_fields for iterating over given fields of all peers

parent 54703bba
No related branches found
No related tags found
1 merge request!299Feat/poor mans vshard
use ::tarantool::index::{Index, IteratorType}; use ::tarantool::index::{Index, IndexIterator, IteratorType};
use ::tarantool::space::{FieldType, Space}; use ::tarantool::space::{FieldType, Space};
use ::tarantool::tuple::{DecodeOwned, ToTupleBuffer, Tuple}; use ::tarantool::tuple::{DecodeOwned, ToTupleBuffer, Tuple};
use thiserror::Error; use thiserror::Error;
...@@ -10,6 +10,7 @@ use crate::traft::RaftId; ...@@ -10,6 +10,7 @@ use crate::traft::RaftId;
use crate::traft::RaftIndex; use crate::traft::RaftIndex;
use std::cell::UnsafeCell; use std::cell::UnsafeCell;
use std::marker::PhantomData;
use super::RaftSpaceAccess; use super::RaftSpaceAccess;
...@@ -287,6 +288,17 @@ impl Peers { ...@@ -287,6 +288,17 @@ impl Peers {
Ok(res) Ok(res)
} }
/// Return an iterator over all peers. Items of the iterator are
/// specified by `F` (see `PeerFieldDef` & `peer_field` module).
#[inline(always)]
pub fn peers_fields<F>(&self) -> Result<PeersFields<F>, TraftError>
where
F: PeerFieldDef,
{
let iter = self.space().select(IteratorType::All, &())?;
Ok(PeersFields::new(iter))
}
#[inline] #[inline]
pub fn all_peers(&self) -> tarantool::Result<Vec<traft::Peer>> { pub fn all_peers(&self) -> tarantool::Result<Vec<traft::Peer>> {
self.space() self.space()
...@@ -515,6 +527,35 @@ impl PeerId for traft::InstanceId { ...@@ -515,6 +527,35 @@ impl PeerId for traft::InstanceId {
} }
} }
////////////////////////////////////////////////////////////////////////////////
// PeersFields
////////////////////////////////////////////////////////////////////////////////
pub struct PeersFields<F> {
iter: IndexIterator,
marker: PhantomData<F>,
}
impl<F> PeersFields<F> {
fn new(iter: IndexIterator) -> Self {
Self {
iter,
marker: PhantomData,
}
}
}
impl<F> Iterator for PeersFields<F>
where
F: PeerFieldDef,
{
type Item = F::Type;
fn next(&mut self) -> Option<Self::Item> {
self.iter.next().as_ref().map(F::get_in).map(Result::unwrap)
}
}
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
// tests // tests
//////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment