1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
// Copyright 2019 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
// under the GPL Licence is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. Please review the Licences for the specific language governing
// permissions and limitations relating to use of the SAFE Network Software.
use crate::messaging::system::{MembershipState, NodeState, Peer};
use crate::routing::{error::Error, peer::PeerUtils};
use xor_name::XorName;
/// The minimum age a node can have. The Infants will start at age 4. This is to prevent frequent
/// relocations during the beginning of a node's lifetime.
pub const MIN_AGE: u8 = 4;
/// The minimum age a node becomes an adult node.
pub const MIN_ADULT_AGE: u8 = MIN_AGE + 1;
/// During the first section, nodes can start at a range of age to avoid too many nodes having the
/// same time get relocated at the same time.
/// Defines the lower bound of this range.
pub const FIRST_SECTION_MIN_AGE: u8 = MIN_ADULT_AGE + 1;
/// Defines the higher bound of this range.
pub const FIRST_SECTION_MAX_AGE: u8 = 100;
/// Information about a member of our section.
pub(crate) trait NodeStateUtils {
// Creates a `NodeState` in the `Joined` state.
fn joined(peer: Peer, previous_name: Option<XorName>) -> NodeState;
// Is the age > `MIN_AGE`?
fn is_mature(&self) -> bool;
fn leave(self) -> Result<NodeState, Error>;
// Convert this info into one with the state changed to `Relocated`.
fn relocate(self, dst: XorName) -> NodeState;
}
impl NodeStateUtils for NodeState {
// Creates a `NodeState` in the `Joined` state.
fn joined(peer: Peer, previous_name: Option<XorName>) -> NodeState {
NodeState {
peer,
state: MembershipState::Joined,
previous_name,
}
}
// Is the age > `MIN_AGE`?
fn is_mature(&self) -> bool {
self.peer.age() > MIN_AGE
}
fn leave(self) -> Result<NodeState, Error> {
// Do not allow switching to `Left` when already relocated, to avoid rejoining with the
// same name.
if let MembershipState::Relocated(_) = self.state {
return Err(Error::InvalidState);
}
Ok(NodeState {
state: MembershipState::Left,
..self
})
}
// Convert this info into one with the state changed to `Relocated`.
fn relocate(self, dst: XorName) -> NodeState {
NodeState {
state: MembershipState::Relocated(dst),
..self
}
}
}