Skip to content

Commit eef41ec

Browse files
MockEnv: Randomized inbound peers
1 parent 2211ca1 commit eef41ec

File tree

2 files changed

+71
-18
lines changed

2 files changed

+71
-18
lines changed

ouroboros-network/testlib/Test/Ouroboros/Network/PeerSelection.hs

Lines changed: 48 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2471,7 +2471,7 @@ prop_governor_target_known_big_ledger_peers_above (MaxTime maxTime) env =
24712471
-- test to assert that this happens in some fraction of test cases.
24722472
--
24732473
prop_governor_target_established_below :: MaxTime -> GovernorMockEnvironment -> Property
2474-
prop_governor_target_established_below (MaxTime maxTime) env =
2474+
prop_governor_target_established_below (MaxTime maxTime) env@GovernorMockEnvironment{inboundPeers} =
24752475
let events = Signal.eventsFromListUpToTime maxTime
24762476
. selectPeerSelectionTraceEvents
24772477
@Cardano.ExtraState
@@ -2487,6 +2487,27 @@ prop_governor_target_established_below (MaxTime maxTime) env =
24872487
(Cardano.ExtraState.empty (consensusMode env) (NumberOfBigLedgerPeers 0)) Cardano.ExtraPeers.empty
24882488
events
24892489

2490+
govLocalRootPeersSig :: Signal (LocalRootPeers PeerTrustable PeerAddr)
2491+
govLocalRootPeersSig =
2492+
selectGovState Governor.localRootPeers
2493+
(Cardano.ExtraState.empty (consensusMode env) (NumberOfBigLedgerPeers 0)) Cardano.ExtraPeers.empty
2494+
events
2495+
2496+
govUnreachablePeersSig :: Signal (Set PeerAddr)
2497+
govUnreachablePeersSig =
2498+
(\local ->
2499+
let
2500+
isUnreachablePeer addr (LocalRootConfig {behindFirewall}) =
2501+
behindFirewall && not (Set.member addr inboundPeers)
2502+
2503+
unreachablePeers =
2504+
Map.keysSet
2505+
$ Map.filterWithKey isUnreachablePeer
2506+
$ LocalRootPeers.toMap local
2507+
in
2508+
unreachablePeers
2509+
) <$> govLocalRootPeersSig
2510+
24902511
govKnownPeersSig :: Signal (Set PeerAddr)
24912512
govKnownPeersSig =
24922513
selectGovState (dropBigLedgerPeers $
@@ -2538,19 +2559,21 @@ prop_governor_target_established_below (MaxTime maxTime) env =
25382559

25392560
-- There are no opportunities if we're at or above target
25402561
--
2541-
promotionOpportunity target known established recentFailures
2562+
promotionOpportunity target known unreachable established recentFailures
25422563
| Set.size established >= target
25432564
= Set.empty
25442565

25452566
| otherwise
25462567
= known Set.\\ established
2568+
Set.\\ unreachable
25472569
Set.\\ recentFailures
25482570

25492571
promotionOpportunities :: Signal (Set PeerAddr)
25502572
promotionOpportunities =
25512573
promotionOpportunity
25522574
<$> govTargetsSig
25532575
<*> govKnownPeersSig
2576+
<*> govUnreachablePeersSig
25542577
<*> govEstablishedPeersSig
25552578
<*> govEstablishedFailuresSig
25562579

@@ -3218,7 +3241,7 @@ prop_governor_target_active_big_ledger_peers_above (MaxTime maxTime) env =
32183241
-- is not possible to exceed the target.
32193242
--
32203243
prop_governor_target_established_local :: MaxTime -> GovernorMockEnvironment -> Property
3221-
prop_governor_target_established_local (MaxTime maxTime) env =
3244+
prop_governor_target_established_local (MaxTime maxTime) env@GovernorMockEnvironment{inboundPeers} =
32223245
let events = Signal.eventsFromListUpToTime maxTime
32233246
. selectPeerSelectionTraceEvents
32243247
@Cardano.ExtraState
@@ -3234,6 +3257,21 @@ prop_governor_target_established_local (MaxTime maxTime) env =
32343257
(Cardano.ExtraState.empty (consensusMode env) (NumberOfBigLedgerPeers 0)) Cardano.ExtraPeers.empty
32353258
events
32363259

3260+
govUnreachablePeersSig :: Signal (Set PeerAddr)
3261+
govUnreachablePeersSig =
3262+
(\local ->
3263+
let
3264+
isUnreachablePeer addr (LocalRootConfig {behindFirewall}) =
3265+
behindFirewall && not (Set.member addr inboundPeers)
3266+
3267+
unreachablePeers =
3268+
Map.keysSet
3269+
$ Map.filterWithKey isUnreachablePeer
3270+
$ LocalRootPeers.toMap local
3271+
in
3272+
unreachablePeers
3273+
) <$> govLocalRootPeersSig
3274+
32373275
govEstablishedPeersSig :: Signal (Set PeerAddr)
32383276
govEstablishedPeersSig =
32393277
selectGovState
@@ -3281,18 +3319,20 @@ prop_governor_target_established_local (MaxTime maxTime) env =
32813319

32823320
promotionOpportunities :: Signal (Set PeerAddr)
32833321
promotionOpportunities =
3284-
(\local established recentFailures inProgressPromoteCold ->
3322+
(\local unreachable established recentFailures inProgressPromoteCold ->
32853323
Set.unions
32863324
[ -- There are no opportunities if we're at or above target
32873325
if Set.size groupEstablished >= warmTarget'
32883326
then Set.empty
32893327
else group Set.\\ established
3328+
Set.\\ unreachable
32903329
Set.\\ recentFailures
32913330
Set.\\ inProgressPromoteCold
32923331
| (_, WarmValency warmTarget', group) <- LocalRootPeers.toGroupSets local
32933332
, let groupEstablished = group `Set.intersection` established
32943333
]
32953334
) <$> govLocalRootPeersSig
3335+
<*> govUnreachablePeersSig
32963336
<*> govEstablishedPeersSig
32973337
<*> govEstablishedFailuresSig
32983338
<*> govInProgressPromoteColdSig
@@ -4079,6 +4119,7 @@ prop_issue_3550 = prop_governor_target_established_below defaultMaxTime $
40794119
targetNumberOfActivePeers = 3 },
40804120
nullPeerSelectionTargets),
40814121
NoDelay) :| []),
4122+
inboundPeers = Set.empty,
40824123
pickKnownPeersForPeerShare = Script (PickFirst :| []),
40834124
pickColdPeersToPromote = Script (PickFirst :| []),
40844125
pickWarmPeersToPromote = Script (PickFirst :| []),
@@ -4114,6 +4155,7 @@ prop_issue_3515 = prop_governor_nolivelock $
41144155
localRootPeers = LocalRootPeers.fromGroups [(1,1,Map.fromList [(PeerAddr 10, LocalRootConfig DoAdvertisePeer InitiatorAndResponderDiffusionMode False IsNotTrustable)])],
41154156
publicRootPeers = PublicRootPeers.empty Cardano.ExtraPeers.empty,
41164157
targets = Script . NonEmpty.fromList $ targets'',
4158+
inboundPeers = Set.empty,
41174159
pickKnownPeersForPeerShare = Script (PickFirst :| []),
41184160
pickColdPeersToPromote = Script (PickFirst :| []),
41194161
pickWarmPeersToPromote = Script (PickFirst :| []),
@@ -4156,6 +4198,7 @@ prop_issue_3494 = prop_governor_nofail $
41564198
localRootPeers = LocalRootPeers.fromGroups [(1,1,Map.fromList [(PeerAddr 64, LocalRootConfig DoAdvertisePeer InitiatorAndResponderDiffusionMode False IsNotTrustable)])],
41574199
publicRootPeers = PublicRootPeers.empty Cardano.ExtraPeers.empty,
41584200
targets = Script . NonEmpty.fromList $ targets'',
4201+
inboundPeers = Set.empty,
41594202
pickKnownPeersForPeerShare = Script (PickFirst :| []),
41604203
pickColdPeersToPromote = Script (PickFirst :| []),
41614204
pickWarmPeersToPromote = Script (PickFirst :| []),
@@ -4209,6 +4252,7 @@ prop_issue_3233 = prop_governor_nolivelock $
42094252
publicRootPeers = Cardano.PublicRootPeers.fromPublicRootPeers
42104253
(Map.fromList [(PeerAddr 4, DoNotAdvertisePeer)]),
42114254
targets = Script . NonEmpty.fromList $ targets'',
4255+
inboundPeers = Set.empty,
42124256
pickKnownPeersForPeerShare = Script (PickFirst :| []),
42134257
pickColdPeersToPromote = Script (PickFirst :| []),
42144258
pickWarmPeersToPromote = Script (PickFirst :| []),

ouroboros-network/testlib/Test/Ouroboros/Network/PeerSelection/Cardano/MockEnvironment.hs

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,7 @@ data GovernorMockEnvironment = GovernorMockEnvironment {
153153
localRootPeers :: !(LocalRootPeers PeerTrustable PeerAddr),
154154
publicRootPeers :: !(PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr),
155155
targets :: !(TimedScript (PeerSelectionTargets, PeerSelectionTargets)),
156+
inboundPeers :: !(Set PeerAddr),
156157
pickKnownPeersForPeerShare :: !(PickScript PeerAddr),
157158
pickColdPeersToPromote :: !(PickScript PeerAddr),
158159
pickWarmPeersToPromote :: !(PickScript PeerAddr),
@@ -460,7 +461,8 @@ mockPeerSelectionActions' tracer
460461
GovernorMockEnvironment {
461462
localRootPeers,
462463
publicRootPeers,
463-
peerSharingFlag
464+
peerSharingFlag,
465+
inboundPeers
464466
}
465467
(originalPeerTargets, _peerTargets)
466468
scripts
@@ -513,19 +515,6 @@ mockPeerSelectionActions' tracer
513515
extraStateToExtraCounters = Cardano.cardanoPeerSelectionStatetoCounters
514516
}
515517
where
516-
-- We simulate that all local root peers behind a firewall are connecting to us
517-
-- TODO: Assign proper peer sharing flag
518-
readInboundPeers :: m (Map PeerAddr PeerSharing)
519-
readInboundPeers =
520-
let
521-
behindFirewallPeersMap =
522-
Map.mapMaybe
523-
(\(LocalRootConfig {behindFirewall}) ->
524-
if behindFirewall then Just PeerSharingDisabled else Nothing
525-
)
526-
(LocalRootPeers.toMap localRootPeers)
527-
in pure behindFirewallPeersMap
528-
529518
-- TODO: make this dynamic
530519
requestPublicRootPeers ledgerPeersKind _rng _n = do
531520
traceWith tracer TraceEnvRequestPublicRootPeers
@@ -566,6 +555,15 @@ mockPeerSelectionActions' tracer
566555
traceWith tracer (TraceEnvRootsResult (Set.toList (PublicRootPeers.toSet Cardano.ExtraPeers.toSet result)))
567556
return (result, ttl)
568557

558+
readInboundPeers :: m (Map PeerAddr PeerSharing)
559+
readInboundPeers = sequence $
560+
Map.fromSet
561+
(\addr -> do
562+
let Just (_, peerSharingScript, _) = Map.lookup addr scripts
563+
stepScript peerSharingScript
564+
)
565+
inboundPeers
566+
569567
requestPeerShare :: PeerSharingAmount -> PeerAddr -> m (PeerSharingResult PeerAddr)
570568
requestPeerShare _ addr = do
571569
let Just (peerShareScript, _, _) = Map.lookup addr scripts
@@ -954,6 +952,7 @@ instance Arbitrary GovernorMockEnvironment where
954952
let peersSet = allPeers peerGraph
955953
(localRootPeers,
956954
publicRootPeers) <- arbitraryRootPeers peersSet
955+
inboundPeers <- arbitraryInboundPeers localRootPeers
957956

958957
let arbitrarySubsetOfPeers = arbitrarySubset peersSet
959958
pickKnownPeersForPeerShare <- arbitraryPickScript arbitrarySubsetOfPeers
@@ -976,6 +975,16 @@ instance Arbitrary GovernorMockEnvironment where
976975

977976
return GovernorMockEnvironment{..}
978977
where
978+
-- Subset of peers behind a firewall
979+
arbitraryInboundPeers :: LocalRootPeers PeerTrustable PeerAddr -> Gen (Set PeerAddr)
980+
arbitraryInboundPeers local =
981+
let
982+
behindFirewallPeers =
983+
Map.keysSet
984+
$ Map.filter (\LocalRootConfig {behindFirewall} -> behindFirewall)
985+
$ LocalRootPeers.toMap local
986+
in arbitrarySubset behindFirewallPeers
987+
979988
arbitraryRootPeers :: Set PeerAddr
980989
-> Gen (LocalRootPeers PeerTrustable PeerAddr, PublicRootPeers (Cardano.ExtraPeers PeerAddr) PeerAddr)
981990
arbitraryRootPeers peers | Set.null peers =

0 commit comments

Comments
 (0)