Skip to content
This repository has been archived by the owner on Jun 25, 2021. It is now read-only.

Commit

Permalink
feat(event): update elders_changed event
Browse files Browse the repository at this point in the history
  • Loading branch information
oetyng authored and joshuef committed Mar 22, 2021
1 parent a6a665c commit af37d06
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 41 deletions.
8 changes: 3 additions & 5 deletions examples/minimal.rs
Original file line number Diff line number Diff line change
Expand Up @@ -240,15 +240,13 @@ async fn handle_event(index: usize, node: &mut Routing, event: Event) -> bool {
info!("Node #{} member left - name: {}, age: {}", index, name, age);
}
Event::EldersChanged {
prefix,
key,
sibling_key,
elders,
sibling_elders,
self_status_change,
} => {
info!(
"Node #{} elders changed - prefix: {:b}, key: {:?}, sibling key: {:?}, elders: {:?}, node elder status change: {:?}",
index, prefix, key, sibling_key, elders, self_status_change
"Node #{} elders changed - prefix: {:b}, key: {:?}, sibling elders: {:?}, elders: {:?}, node elder status change: {:?}",
index, elders.prefix, elders.key, sibling_elders, elders.elders, self_status_change
);
}
Event::MessageReceived { content, src, dst } => info!(
Expand Down
14 changes: 7 additions & 7 deletions examples/stress.rs
Original file line number Diff line number Diff line change
Expand Up @@ -300,8 +300,8 @@ impl Network {
}
Event::Routing { id, event } => match event {
RoutingEvent::EldersChanged {
prefix: new_prefix,
key,
// prefix: new_prefix,
// key,
elders,
self_status_change,
..
Expand All @@ -313,12 +313,12 @@ impl Network {
..
}) = self.nodes.get_mut(&id)
{
*prefix = new_prefix;
*prefix = elders.prefix;

if elders.contains(name) {
if elders.elders.contains(name) {
*elder = Some(ElderState {
key,
num_elders: elders.len(),
key: elders.key,
num_elders: elders.elders.len(),
});
} else {
*elder = None;
Expand Down Expand Up @@ -356,7 +356,7 @@ impl Network {
let dst = match dst {
DstLocation::Section(name) => name,
DstLocation::Node(name) => name,
DstLocation::Direct | DstLocation::EndUser(_) | DstLocation::ElderPeers => {
DstLocation::Direct | DstLocation::EndUser(_) => {
return Err(format_err!("unexpected probe message dst: {:?}", dst))
}
};
Expand Down
50 changes: 35 additions & 15 deletions src/event.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2018 MaidSafe.net limited.
// Copyright 2021 MaidSafe.net limited.
//
// This SAFE Network Software is licensed to you under The General Public License (GPL), version 3.
// Unless required by applicable law or agreed to in writing, the SAFE Network Software distributed
Expand Down Expand Up @@ -31,6 +31,34 @@ pub enum NodeElderChange {
None,
}

///
#[derive(Debug, Clone, PartialEq)]
pub struct Elders {
/// The prefix of the section.
pub prefix: Prefix,
/// The BLS public key of a section.
pub key: bls::PublicKey,
/// The set of elders of a section.
pub elders: BTreeSet<XorName>,
}

impl Elders {
/// The BLS public key
pub fn key(&self) -> sn_data_types::PublicKey {
sn_data_types::PublicKey::Bls(self.key)
}

/// The BLS based name
pub fn name(&self) -> XorName {
self.key().into()
}

/// The prefix based address
pub fn address(&self) -> XorName {
self.prefix.name()
}
}

/// An Event raised by a `Node` or `Client` via its event sender.
///
/// These are sent by sn_routing to the library's user. It allows the user to handle requests and
Expand Down Expand Up @@ -69,15 +97,11 @@ pub enum Event {
},
/// The set of elders in our section has changed.
EldersChanged {
/// The prefix of our section.
prefix: Prefix,
/// The BLS public key of our section.
key: bls::PublicKey,
/// The BLS public key of the sibling section, if this event is fired during a split.
/// The Elders of our section.
elders: Elders,
/// The Elders of the sibling section, if this event is fired during a split.
/// Otherwise `None`.
sibling_key: Option<bls::PublicKey>,
/// The set of elders of our section.
elders: BTreeSet<XorName>,
sibling_elders: Option<Elders>,
/// Promoted, demoted or no change?
self_status_change: NodeElderChange,
},
Expand Down Expand Up @@ -135,17 +159,13 @@ impl Debug for Event {
.field("age", age)
.finish(),
Self::EldersChanged {
prefix,
key,
sibling_key,
elders,
sibling_elders,
self_status_change,
} => formatter
.debug_struct("EldersChanged")
.field("prefix", prefix)
.field("key", key)
.field("sibling_key", sibling_key)
.field("elders", elders)
.field("sibling_elders", sibling_elders)
.field("self_status_change", self_status_change)
.finish(),
Self::RelocationStarted { previous_name } => formatter
Expand Down
4 changes: 2 additions & 2 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// Copyright 2018 MaidSafe.net limited.
// Copyright 2021 MaidSafe.net limited.
//
// This SAFE Network Software is licensed to you under The General Public License (GPL), version 3.
// Unless required by applicable law or agreed to in writing, the SAFE Network Software distributed
Expand Down Expand Up @@ -72,7 +72,7 @@ extern crate tracing;
// ############################################################################
pub use self::{
error::{Error, Result},
event::{Event, NodeElderChange, SendStream},
event::{Elders, Event, NodeElderChange, SendStream},
routing::{Config, EventStream, Routing},
section::{SectionChain, SectionChainError, MIN_AGE},
};
Expand Down
26 changes: 21 additions & 5 deletions src/routing/approved.rs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ use crate::{
},
crypto, delivery_group,
error::{Error, Result},
event::{Event, NodeElderChange},
event::{Elders, Event, NodeElderChange},
message_filter::MessageFilter,
messages::{
JoinRequest, Message, MessageHash, MessageStatus, PlainMessage, ResourceProofResponse,
Expand Down Expand Up @@ -1787,8 +1787,20 @@ impl Approved {
commands.extend(self.send_sync(self.section.clone(), self.network.clone())?);
}

let sibling_key = if new_prefix != old_prefix {
self.section_key(&new_prefix.sibling()).copied()
let sibling_elders = if new_prefix != old_prefix {
if let Some(sibling_key) = self.section_key(&new_prefix.sibling()).copied() {
if let Some(info) = self.network.get(&new_prefix.sibling()).cloned() {
Some(Elders {
prefix: new_prefix.sibling(),
key: sibling_key,
elders: info.elders.keys().copied().collect(),
})
} else {
None
}
} else {
None
}
} else {
None
};
Expand All @@ -1806,11 +1818,15 @@ impl Approved {
NodeElderChange::None
};

self.send_event(Event::EldersChanged {
let elders = Elders {
prefix: new_prefix,
key: new_last_key,
sibling_key,
elders: self.section.elders_info().elders.keys().copied().collect(),
};

self.send_event(Event::EldersChanged {
elders,
sibling_elders,
self_status_change,
});
}
Expand Down
12 changes: 6 additions & 6 deletions src/routing/tests/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1270,9 +1270,9 @@ async fn handle_sync() -> Result<()> {
// Verify our `Section` got updated.
assert_matches!(
event_rx.recv().await,
Some(Event::EldersChanged { key, elders, .. }) => {
assert_eq!(key, pk2);
assert_eq!(elders, new_elders);
Some(Event::EldersChanged { elders, .. }) => {
assert_eq!(elders.key, pk2);
assert_eq!(elders.elders, new_elders);
}
);

Expand Down Expand Up @@ -1685,9 +1685,9 @@ async fn handle_elders_update() -> Result<()> {

assert_matches!(
event_rx.recv().await,
Some(Event::EldersChanged { key, elders, .. }) => {
assert_eq!(key, pk1);
assert_eq!(elders, elder_names1);
Some(Event::EldersChanged { elders, .. }) => {
assert_eq!(elders.key, pk1);
assert_eq!(elders.elders, elder_names1);
}
);

Expand Down
2 changes: 1 addition & 1 deletion tests/drop.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ async fn test_node_drop() -> Result<()> {
continue;
}

assert_event!(events, Event::EldersChanged { elders, .. } if elders.len() == node_count);
assert_event!(events, Event::EldersChanged { elders, .. } if elders.elders.len() == node_count);
}

// Drop one node
Expand Down

0 comments on commit af37d06

Please sign in to comment.