Safe Haskell | None |
---|---|
Language | Haskell2010 |
Ouroboros.Network.PeerSelection.State.LocalRootPeers
Synopsis
- data LocalRootPeers extraFlags peeraddr = LocalRootPeers (Map peeraddr (LocalRootConfig extraFlags)) [(HotValency, WarmValency, Set peeraddr)]
- data LocalRootConfig extraFlags = LocalRootConfig {
- peerAdvertise :: !PeerAdvertise
- diffusionMode :: !DiffusionMode
- extraFlags :: !extraFlags
- newtype HotValency = HotValency {
- getHotValency :: Int
- newtype WarmValency = WarmValency {}
- type Config extraFlags peeraddr = [(HotValency, WarmValency, Map peeraddr (LocalRootConfig extraFlags))]
- invariant :: Ord peeraddr => LocalRootPeers extraFlags peeraddr -> Bool
- mapPeers :: Ord b => (a -> b) -> LocalRootPeers extraFlags a -> LocalRootPeers extraFlags b
- empty :: LocalRootPeers extraFlags peeraddr
- null :: LocalRootPeers extraFlags peeraddr -> Bool
- size :: LocalRootPeers extraFlags peeraddr -> Int
- member :: Ord peeraddr => peeraddr -> LocalRootPeers extraFlags peeraddr -> Bool
- hotTarget :: LocalRootPeers extraFlags peeraddr -> HotValency
- warmTarget :: LocalRootPeers extraFlags peeraddr -> WarmValency
- fromGroups :: Ord peeraddr => [(HotValency, WarmValency, Map peeraddr (LocalRootConfig extraFlags))] -> LocalRootPeers extraFlags peeraddr
- toGroups :: Ord peeraddr => LocalRootPeers extraFlags peeraddr -> [(HotValency, WarmValency, Map peeraddr (LocalRootConfig extraFlags))]
- toGroupSets :: LocalRootPeers extraFlags peeraddr -> [(HotValency, WarmValency, Set peeraddr)]
- toMap :: LocalRootPeers extraFlags peeraddr -> Map peeraddr (LocalRootConfig extraFlags)
- keysSet :: LocalRootPeers extraFlags peeraddr -> Set peeraddr
- trustableKeysSet :: LocalRootPeers PeerTrustable peeraddr -> Set peeraddr
- clampToLimit :: Ord peeraddr => Int -> LocalRootPeers extraFlags peeraddr -> LocalRootPeers extraFlags peeraddr
- clampToTrustable :: Ord peeraddr => LocalRootPeers PeerTrustable peeraddr -> LocalRootPeers PeerTrustable peeraddr
- isPeerTrustable :: Ord peeraddr => peeraddr -> LocalRootPeers PeerTrustable peeraddr -> Bool
Types
data LocalRootPeers extraFlags peeraddr Source #
Constructors
LocalRootPeers (Map peeraddr (LocalRootConfig extraFlags)) [(HotValency, WarmValency, Set peeraddr)] |
Instances
(Show extraFlags, Show peeraddr, Ord peeraddr) => Show (LocalRootPeers extraFlags peeraddr) Source # | |
Defined in Ouroboros.Network.PeerSelection.State.LocalRootPeers Methods showsPrec :: Int -> LocalRootPeers extraFlags peeraddr -> ShowS # show :: LocalRootPeers extraFlags peeraddr -> String # showList :: [LocalRootPeers extraFlags peeraddr] -> ShowS # | |
(Eq peeraddr, Eq extraFlags) => Eq (LocalRootPeers extraFlags peeraddr) Source # | |
Defined in Ouroboros.Network.PeerSelection.State.LocalRootPeers Methods (==) :: LocalRootPeers extraFlags peeraddr -> LocalRootPeers extraFlags peeraddr -> Bool # (/=) :: LocalRootPeers extraFlags peeraddr -> LocalRootPeers extraFlags peeraddr -> Bool # |
data LocalRootConfig extraFlags Source #
Constructors
LocalRootConfig | |
Fields
|
Instances
Show extraFlags => Show (LocalRootConfig extraFlags) Source # | |
Defined in Ouroboros.Network.PeerSelection.State.LocalRootPeers Methods showsPrec :: Int -> LocalRootConfig extraFlags -> ShowS # show :: LocalRootConfig extraFlags -> String # showList :: [LocalRootConfig extraFlags] -> ShowS # | |
Eq extraFlags => Eq (LocalRootConfig extraFlags) Source # | |
Defined in Ouroboros.Network.PeerSelection.State.LocalRootPeers Methods (==) :: LocalRootConfig extraFlags -> LocalRootConfig extraFlags -> Bool # (/=) :: LocalRootConfig extraFlags -> LocalRootConfig extraFlags -> Bool # |
newtype HotValency Source #
Newtype wrapper representing hot valency value from local root group configuration
Constructors
HotValency | |
Fields
|
Instances
newtype WarmValency Source #
Newtype wrapper representing warm valency value from local root group configuration
Constructors
WarmValency | |
Fields |
Instances
type Config extraFlags peeraddr = [(HotValency, WarmValency, Map peeraddr (LocalRootConfig extraFlags))] Source #
Data available from topology file.
Basic operations
mapPeers :: Ord b => (a -> b) -> LocalRootPeers extraFlags a -> LocalRootPeers extraFlags b Source #
empty :: LocalRootPeers extraFlags peeraddr Source #
null :: LocalRootPeers extraFlags peeraddr -> Bool Source #
size :: LocalRootPeers extraFlags peeraddr -> Int Source #
hotTarget :: LocalRootPeers extraFlags peeraddr -> HotValency Source #
warmTarget :: LocalRootPeers extraFlags peeraddr -> WarmValency Source #
fromGroups :: Ord peeraddr => [(HotValency, WarmValency, Map peeraddr (LocalRootConfig extraFlags))] -> LocalRootPeers extraFlags peeraddr Source #
The local root peers info has some invariants that are not directly enforced in the types, and the config comes from an external source. Of course it's good to validate that at source, but here we need to not fail if we're given imperfect data.
So what we do is bash it until it is valid. We don't need to be too careful about how we do it, it's ok to be brutal. We should however make sure we trace a warning about dodgy config.
toGroups :: Ord peeraddr => LocalRootPeers extraFlags peeraddr -> [(HotValency, WarmValency, Map peeraddr (LocalRootConfig extraFlags))] Source #
Inverse of fromGroups
, for the subset of inputs to fromGroups
that
satisfy the invariant.
toGroupSets :: LocalRootPeers extraFlags peeraddr -> [(HotValency, WarmValency, Set peeraddr)] Source #
toMap :: LocalRootPeers extraFlags peeraddr -> Map peeraddr (LocalRootConfig extraFlags) Source #
keysSet :: LocalRootPeers extraFlags peeraddr -> Set peeraddr Source #
trustableKeysSet :: LocalRootPeers PeerTrustable peeraddr -> Set peeraddr Source #
Special operations
Arguments
:: Ord peeraddr | |
=> Int | The limit on the total number of local peers |
-> LocalRootPeers extraFlags peeraddr | |
-> LocalRootPeers extraFlags peeraddr |
Limit the size of the root peers collection to fit within given bounds.
The governor needs to be able to do this to enforce its invariant that:
LocalRootPeers.size localRootPeers <= targetNumberOfKnownPeers
It needs to be able to establish that invariant given arbitrary configuration for local root peers. It makes sense to do it this way rather than just enforce that local root peers config fits the invariant because the invariant depends on both the targets and the local root peers config and these can both vary dynamically and independently.
It is unlikely in practice that there are so many local root peers configured that it goes over this targets, so it's ok to resolve it pretty arbitrarily. We just take the local roots in left to right order up to the limit. So we have the property that
LocalRootPeers.size (LocalRootPeers.clampToLimit sz lrps) == min sz (LocalRootPeers.size lrps)
clampToTrustable :: Ord peeraddr => LocalRootPeers PeerTrustable peeraddr -> LocalRootPeers PeerTrustable peeraddr Source #
isPeerTrustable :: Ord peeraddr => peeraddr -> LocalRootPeers PeerTrustable peeraddr -> Bool Source #