Skip to content

Commit

Permalink
p2p-governor: Replace one use of Signal.primitiveTransformEvents
Browse files Browse the repository at this point in the history
  • Loading branch information
dcoutts authored and coot committed Sep 28, 2021
1 parent a9c3d3a commit 321e6d9
Showing 1 changed file with 12 additions and 39 deletions.
51 changes: 12 additions & 39 deletions ouroboros-network/test/Test/Ouroboros/Network/PeerSelection.hs
Expand Up @@ -780,8 +780,16 @@ prop_governor_target_known_1_valid_subset env =

envKnownPeersSig :: Signal (Set PeerAddr)
envKnownPeersSig =
environmentAllKnownPeers
(LocalRootPeers.keysSet (localRootPeers env))
Signal.nubBy ((==) `on` Set.size)
. Signal.scanl Set.union Set.empty
. Signal.fromChangeEvents Set.empty
. Signal.selectEvents
(\case
TraceEnvSetLocalRoots x -> Just (LocalRootPeers.keysSet x)
TraceEnvRootsResult x -> Just (Set.fromList x)
TraceEnvGossipResult _ x -> Just (Set.fromList x)
_ -> Nothing
)
. selectEnvEvents
$ events

Expand All @@ -801,43 +809,6 @@ prop_governor_target_known_1_valid_subset env =
<*> govKnownPeersSig


-- | Look at the trace of events from the mock environment and produce a
-- derived trace of the set of peers that could in principle be known by the
-- governor at any point in time. It is maximal in the sense it is all such
-- peers, without respect for any governor targets as limits.
--
-- This trace depends on what the governor actually does, it is not about what
-- it could do. The set starts with the root peers and is extended each time
-- the governor successfully gossips with a peer and finds new peers.
--
-- This trace transformer assumes the root peers do not change. It will need
-- to be adjusted when the the mock environment is extended with dynamic root
-- peers.
--
environmentAllKnownPeers :: Set PeerAddr
-> Events TraceMockEnv
-> Signal (Set PeerAddr)
environmentAllKnownPeers localRootPeers =
--TODO: implement this as a generic signalScanl style combinator
Signal.fromChangeEvents localRootPeers
. Signal.primitiveTransformEvents (go localRootPeers)
where
go :: Set PeerAddr -> [E TraceMockEnv] -> [E (Set PeerAddr)]
go !_ [] = []

go !known (E t (TraceEnvRootsResult peeraddrs) : es)
| let known' = Set.union known (Set.fromList peeraddrs)
, Set.size known' > Set.size known
= E t known' : go known' es

go !known (E t (TraceEnvGossipResult _ peeraddrs) : es)
| let known' = Set.union known (Set.fromList peeraddrs)
, Set.size known' > Set.size known
= E t known' : go known' es

go !known (_ : es) = go known es


-- | If the governor is below target and has the opportunity to gossip then
-- within a bounded time it should perform a gossip with one of its known peers.
--
Expand Down Expand Up @@ -1001,6 +972,8 @@ recentGossipActivity :: DiffTime
recentGossipActivity d =
Signal.fromChangeEvents (Nothing, Set.empty)
. Signal.primitiveTransformEvents (go Set.empty PSQ.empty)
--TODO: we should be able to avoid primitiveTransformEvents and express
-- this as some combo of keyed linger and keyed until.
where
go :: Set PeerAddr
-> PSQ.OrdPSQ PeerAddr Time ()
Expand Down

0 comments on commit 321e6d9

Please sign in to comment.