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 76 77
// 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::{error::Error, peer::Peer}; use serde::{Deserialize, Serialize}; 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. #[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, Debug)] pub struct MemberInfo { pub peer: Peer, pub state: PeerState, } impl MemberInfo { // Creates a `MemberInfo` in the `Joined` state. pub fn joined(peer: Peer) -> Self { Self { peer, state: PeerState::Joined, } } // Is the age > `MIN_AGE`? pub fn is_mature(&self) -> bool { self.peer.age() > MIN_AGE } pub fn leave(self) -> Result<Self, Error> { // Do not allow switching to `Left` when already relocated, to avoid rejoining with the // same name. if let PeerState::Relocated(_) = self.state { return Err(Error::InvalidState); } Ok(Self { state: PeerState::Left, ..self }) } // Convert this info into one with the state changed to `Relocated`. pub fn relocate(self, destination: XorName) -> Self { Self { state: PeerState::Relocated(destination), ..self } } } #[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Serialize, Deserialize, Debug)] pub enum PeerState { // Node is active member of the section. Joined, // Node went offline. Left, // Node was relocated to a different section. Relocated(XorName), }