-
Notifications
You must be signed in to change notification settings - Fork 89
Peer selection bugfix and testing updates #5209
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
7c4cf48
187c732
511cb0c
170484a
9b5f074
328d8a8
f1f6b12
34b5569
054e3f4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
<!-- | ||
A new scriv changelog fragment. | ||
Uncomment the section that is right (remove the HTML comment wrapper). | ||
For top level release notes, leave all the headers commented out. | ||
--> | ||
|
||
<!-- | ||
### Breaking | ||
--> | ||
|
||
### Non-Breaking | ||
|
||
- fixed false positive in `prop_diffusion_target_active_below` testnet test | ||
- improved approach in general to target-chasing tests in diffusion testnet | ||
and PeerSelection mock environment tests. |
Large diffs are not rendered by default.
Large diffs are not rendered by default.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
<!-- | ||
A new scriv changelog fragment. | ||
|
||
Uncomment the section that is right (remove the HTML comment wrapper). | ||
For top level release notes, leave all the headers commented out. | ||
--> | ||
|
||
### Breaking | ||
|
||
- `linger` function's arm callback now returns a `Maybe Bool` | ||
- `keyedLinger'`s arm callback now returns a `Maybe (Set b)` | ||
- `keyedLinger'`'s arm callback now returns a `Maybe (Set b, DiffTime))` | ||
- The above changes allow those functions to reset signal state on `Nothing` | ||
|
||
### Non-Breaking | ||
|
||
- Added latch function to `Signal` | ||
- bugfix missed promotion/demotion opportunities in: | ||
- `ActivePeers.aboveTargetBigLedgerPeers` | ||
- `ActivePeers.aboveTargetOther` | ||
- `EstablishedPeers.aboveTargetOther` | ||
- `EstablishedPeers.aboveTargetBigLedgerPeers` | ||
- `EstablishedPeers.belowTargetLocal` | ||
- `EstablishedPeers.belowTargetOther` | ||
- `ActivePeers.belowTargetLocal` |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -159,7 +159,8 @@ belowTargetLocal actions@PeerSelectionActions { | |
, let membersAvailableToPromote = Set.intersection members availableToPromote | ||
numMembersToPromote = warmTarget | ||
- Set.size membersEstablished | ||
- numLocalConnectInProgress | ||
- Set.size (Set.intersection | ||
localConnectInProgress members) | ||
Comment on lines
+162
to
+163
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. good catch, we need to do the calculation per local group peer group. |
||
, not (Set.null membersAvailableToPromote) | ||
, numMembersToPromote > 0 | ||
] | ||
|
@@ -216,7 +217,7 @@ belowTargetLocal actions@PeerSelectionActions { | |
viewKnownLocalRootPeers = (localRootPeersSet, _), | ||
viewEstablishedLocalRootPeers = (localEstablishedPeers, _), | ||
viewAvailableToConnectLocalRootPeers = (localAvailableToConnect, _), | ||
viewColdLocalRootPeersPromotions = (localConnectInProgress, numLocalConnectInProgress) | ||
viewColdLocalRootPeersPromotions = (localConnectInProgress, _) | ||
} = peerSelectionStateToView extraPeersToSet extraStateToExtraCounters st | ||
|
||
|
||
|
@@ -256,6 +257,7 @@ belowTargetOther actions@PeerSelectionActions { | |
policyPickColdPeersToPromote | ||
} | ||
st@PeerSelectionState { | ||
localRootPeers, | ||
knownPeers, | ||
establishedPeers, | ||
inProgressPromoteCold, | ||
|
@@ -285,6 +287,7 @@ belowTargetOther actions@PeerSelectionActions { | |
availableToPromote = availableToConnect | ||
Set.\\ EstablishedPeers.toSet establishedPeers | ||
Set.\\ inProgressPromoteCold | ||
Set.\\ LocalRootPeers.keysSet localRootPeers | ||
numPeersToPromote = targetNumberOfEstablishedPeers | ||
- numEstablishedPeers | ||
- numConnectInProgress | ||
|
@@ -507,6 +510,7 @@ jobPromoteColdPeer PeerSelectionActions { | |
(fuzz, stdGen') = randomR (-2, 2 :: Double) stdGen | ||
|
||
-- exponential backoff: 5s, 10s, 20s, 40s, 80s, 160s. | ||
-- Don't forget to change in diffusion tests if changed here | ||
delay :: DiffTime | ||
delay = realToFrac fuzz | ||
+ fromIntegral | ||
|
@@ -698,20 +702,20 @@ aboveTargetOther actions@PeerSelectionActions { | |
-- Or more precisely, how many established peers could we demote? | ||
-- We only want to pick established peers that are not active, since for | ||
-- active one we need to demote them first. | ||
| let peerSelectionView = peerSelectionStateToView extraPeersToSet extraStateToExtraCounters st | ||
PeerSelectionView { | ||
| let peerSelectionView@PeerSelectionView { | ||
viewKnownBigLedgerPeers = (bigLedgerPeersSet, _), | ||
viewEstablishedPeers = (_, numEstablishedPeers), | ||
viewEstablishedPeers = (establishedPeersSet, numEstablishedPeers), | ||
viewActivePeers = (_, numActivePeers) | ||
} | ||
= | ||
peerSelectionView | ||
= peerSelectionStateToView extraPeersToSet extraStateToExtraCounters st | ||
PeerSelectionCountersHWC { | ||
numberOfWarmLocalRootPeers = numLocalWarmPeers | ||
} | ||
= | ||
snd <$> peerSelectionView | ||
|
||
warmPeers = | ||
establishedPeersSet | ||
Set.\\ Set.unions [activePeers, LocalRootPeers.keysSet localRootPeers, bigLedgerPeersSet] | ||
-- One constraint on how many to demote is the difference in the | ||
-- number we have now vs the target. The other constraint is that | ||
-- we pick established peers that are not also active. These | ||
|
@@ -725,17 +729,15 @@ aboveTargetOther actions@PeerSelectionActions { | |
- numActivePeers) | ||
- Set.size (inProgressDemoteWarm Set.\\ bigLedgerPeersSet) | ||
- Set.size (inProgressPromoteWarm Set.\\ bigLedgerPeersSet) | ||
- Set.size (Set.intersection warmPeers inProgressDemoteToCold) | ||
, numPeersToDemote > 0 | ||
|
||
availableToDemote :: Set peeraddr | ||
availableToDemote = EstablishedPeers.toSet establishedPeers | ||
Set.\\ activePeers | ||
Set.\\ LocalRootPeers.keysSet localRootPeers | ||
Set.\\ bigLedgerPeersSet | ||
, let availableToDemote :: Set peeraddr | ||
availableToDemote = warmPeers | ||
Set.\\ inProgressDemoteWarm | ||
Set.\\ inProgressPromoteWarm | ||
Set.\\ inProgressDemoteToCold | ||
, numPeersToDemote > 0 | ||
, not (Set.null availableToDemote) | ||
, assert (not . Set.null $ availableToDemote) not (Set.null availableToDemote) | ||
= Guarded Nothing $ do | ||
selectedToDemote <- pickPeers memberExtraPeers st | ||
policyPickWarmPeersToDemote | ||
|
@@ -814,6 +816,9 @@ aboveTargetBigLedgerPeers actions@PeerSelectionActions { | |
-- We only want to pick established peers that are not active, since for | ||
-- active one we need to demote them first. | ||
| let bigLedgerPeersSet = PublicRootPeers.getBigLedgerPeers publicRootPeers | ||
warmBigLedgerPeers = EstablishedPeers.toSet establishedPeers | ||
`Set.intersection` bigLedgerPeersSet | ||
Set.\\ activePeers | ||
PeerSelectionCounters { | ||
numberOfEstablishedBigLedgerPeers = numEstablishedBigLedgerPeers, | ||
numberOfActiveBigLedgerPeers = numActiveBigLedgerPeers | ||
|
@@ -825,25 +830,22 @@ aboveTargetBigLedgerPeers actions@PeerSelectionActions { | |
-- pick active peer. The `min` is taken so that `pickPeers` is given | ||
-- consistent number of peers with the set of peers available to demote, | ||
-- i.e. `availableToDemote`. | ||
numBigLedgerPeersToDemote = min ( numEstablishedBigLedgerPeers | ||
- targetNumberOfEstablishedBigLedgerPeers) | ||
( numEstablishedBigLedgerPeers | ||
- numActiveBigLedgerPeers) | ||
- Set.size inProgressDemoteWarm | ||
- Set.size inProgressPromoteWarm | ||
numBigLedgerPeersToDemote = | ||
min (numEstablishedBigLedgerPeers - targetNumberOfEstablishedBigLedgerPeers) | ||
(numEstablishedBigLedgerPeers - numActiveBigLedgerPeers) | ||
- Set.size inProgressDemoteWarm | ||
- Set.size inProgressPromoteWarm | ||
- Set.size (Set.intersection warmBigLedgerPeers inProgressDemoteToCold) | ||
Comment on lines
+836
to
+838
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I first thought that we're subtracting Yes, that's right: I checked that It would be good to extend the comment. |
||
|
||
availableToDemote :: Set peeraddr | ||
availableToDemote = EstablishedPeers.toSet establishedPeers | ||
`Set.intersection` bigLedgerPeersSet | ||
Set.\\ activePeers | ||
availableToDemote = warmBigLedgerPeers | ||
Set.\\ inProgressDemoteWarm | ||
Set.\\ inProgressPromoteWarm | ||
Set.\\ inProgressDemoteToCold | ||
|
||
, numBigLedgerPeersToDemote > 0 | ||
, not (Set.null availableToDemote) | ||
, assert (not $ Set.null availableToDemote) not (Set.null availableToDemote) | ||
= Guarded Nothing $ do | ||
|
||
selectedToDemote <- pickPeers memberExtraPeers st | ||
policyPickWarmPeersToDemote | ||
availableToDemote | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Have you considered fixing this in
peerSelectionStateToVie, so that
numberOfActiveBigLedgerPeersDemotions` already reflects to warm and to cold demotions?