@@ -27,7 +27,7 @@ import Cardano.Network.ConsensusMode (ConsensusMode (..))
2727import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (.. ))
2828import Cardano.Network.Types (LedgerStateJudgement (.. ))
2929import Control.Applicative (Alternative )
30- import Data.Functor (($>) )
30+ import Data.Functor (void , ($>) )
3131import Data.Monoid.Synchronisation (FirstToFinish (.. ))
3232import Ouroboros.Cardano.Network.LedgerPeerConsensusInterface qualified as Cardano
3333import Ouroboros.Cardano.Network.PeerSelection.Churn.ExtraArguments qualified as Churn
@@ -175,7 +175,7 @@ peerChurnGovernor PeerChurnArgs {
175175 -- ^ update counters function
176176 -> CheckPeerSelectionCounters extraCounters
177177 -- ^ check counters
178- -> m ()
178+ -> m Int
179179 updateTargets churnAction getCounter timeoutDelay modifyTargets checkCounters = do
180180 -- update targets, and return the new targets
181181 startTime <- getMonotonicTime
@@ -207,12 +207,14 @@ peerChurnGovernor PeerChurnArgs {
207207 endTime <- getMonotonicTime
208208 traceWith tracer (TraceChurnAction (endTime `diffTime` startTime) churnAction r)
209209 traceWith churnTracer (ChurnCounter churnAction r)
210+ return $ abs r
210211 Left c' -> do
211212 endTime <- getMonotonicTime
212213 cancelTimeout
213214 let r = c' - c
214215 traceWith tracer (TraceChurnTimeout (endTime `diffTime` startTime) churnAction r)
215216 traceWith churnTracer (ChurnCounter churnAction r)
217+ return $ abs r
216218 )
217219
218220 --
@@ -301,11 +303,12 @@ peerChurnGovernor PeerChurnArgs {
301303 numberOfEstablishedBigLedgerPeers >= targetNumberOfEstablishedBigLedgerPeers
302304
303305 decreaseEstablishedPeers
304- :: ChurnRegime
306+ :: Int
307+ -> ChurnRegime
305308 -> HotValency
306309 -> PeerSelectionTargets
307310 -> ModifyPeerSelectionTargets
308- decreaseEstablishedPeers regime _ base targets =
311+ decreaseEstablishedPeers minDecrease regime _ base targets =
309312 targets {
310313 targetNumberOfEstablishedPeers =
311314 case regime of
@@ -317,7 +320,9 @@ peerChurnGovernor PeerChurnArgs {
317320 -- all warm peers to speed up the time to find the best performers.
318321 -- That is why we use the number of active peers in current targets
319322 -- as the upper bound on the number of established peers during this action.
320- _otherwise -> decrease (targetNumberOfEstablishedPeers base - targetNumberOfActivePeers base)
323+ _otherwise -> decreaseWithMin minDecrease
324+ (targetNumberOfEstablishedPeers base -
325+ targetNumberOfActivePeers base)
321326 + targetNumberOfActivePeers base }
322327
323328 checkEstablishedPeersDecreased
@@ -372,15 +377,17 @@ peerChurnGovernor PeerChurnArgs {
372377 numberOfActiveBigLedgerPeers
373378 <= targetNumberOfActiveBigLedgerPeers
374379
375- decreaseEstablishedBigLedgerPeers :: ChurnRegime
380+ decreaseEstablishedBigLedgerPeers :: Int
381+ -> ChurnRegime
376382 -> HotValency
377383 -> PeerSelectionTargets
378384 -> ModifyPeerSelectionTargets
379- decreaseEstablishedBigLedgerPeers _ _ base targets =
385+ decreaseEstablishedBigLedgerPeers minDecrease _ _ base targets =
380386 targets {
381387 targetNumberOfEstablishedBigLedgerPeers =
382- decrease (targetNumberOfEstablishedBigLedgerPeers base -
383- targetNumberOfActiveBigLedgerPeers base)
388+ decreaseWithMin minDecrease
389+ (targetNumberOfEstablishedBigLedgerPeers base -
390+ targetNumberOfActiveBigLedgerPeers base)
384391 + targetNumberOfActiveBigLedgerPeers base
385392 }
386393
@@ -395,19 +402,21 @@ peerChurnGovernor PeerChurnArgs {
395402
396403
397404 decreaseKnownPeers
398- :: ChurnRegime
405+ :: Int
406+ -> ChurnRegime
399407 -> HotValency
400408 -> PeerSelectionTargets
401409 -> ModifyPeerSelectionTargets
402- decreaseKnownPeers _ _ base targets =
410+ decreaseKnownPeers minDecrease _ _ base targets =
403411 targets {
404412 -- we clamp from above to not accidentally actually increase
405413 -- the number of root peers
406414 targetNumberOfRootPeers = min (targetNumberOfRootPeers base) $
407415 decrease (targetNumberOfRootPeers base - targetNumberOfEstablishedPeers base)
408416 + targetNumberOfEstablishedPeers base
409417 , targetNumberOfKnownPeers =
410- decrease (targetNumberOfKnownPeers base - targetNumberOfEstablishedPeers base)
418+ decreaseWithMin minDecrease
419+ (targetNumberOfKnownPeers base - targetNumberOfEstablishedPeers base)
411420 + targetNumberOfEstablishedPeers base
412421 }
413422
@@ -422,15 +431,17 @@ peerChurnGovernor PeerChurnArgs {
422431 numberOfKnownPeers <= targetNumberOfKnownPeers
423432
424433 decreaseKnownBigLedgerPeers
425- :: ChurnRegime
434+ :: Int
435+ -> ChurnRegime
426436 -> HotValency
427437 -> PeerSelectionTargets
428438 -> ModifyPeerSelectionTargets
429- decreaseKnownBigLedgerPeers _ _ base targets =
439+ decreaseKnownBigLedgerPeers minDecrease _ _ base targets =
430440 targets {
431441 targetNumberOfKnownBigLedgerPeers =
432- decrease (targetNumberOfKnownBigLedgerPeers base -
433- targetNumberOfEstablishedBigLedgerPeers base)
442+ decreaseWithMin minDecrease
443+ (targetNumberOfKnownBigLedgerPeers base -
444+ targetNumberOfEstablishedBigLedgerPeers base)
434445 + targetNumberOfEstablishedBigLedgerPeers base
435446 }
436447
@@ -496,84 +507,84 @@ peerChurnGovernor PeerChurnArgs {
496507 traceWith tracer $ TraceChurnMode churnMode
497508
498509 -- Purge the worst active big ledger peers.
499- updateTargets DecreasedActiveBigLedgerPeers
510+ activeBigLedgerDecreased <- updateTargets DecreasedActiveBigLedgerPeers
500511 numberOfActiveBigLedgerPeers
501512 deactivateTimeout
502513 decreaseActiveBigLedgerPeers
503514 checkActiveBigLedgerPeersDecreased
504515
505516 -- Pick new active big ledger peers.
506- updateTargets IncreasedActiveBigLedgerPeers
517+ void $ updateTargets IncreasedActiveBigLedgerPeers
507518 numberOfActiveBigLedgerPeers
508519 shortTimeout
509520 increaseActiveBigLedgerPeers
510521 checkActiveBigLedgerPeersIncreased
511522
512523 -- Forget the worst performing established big ledger peers.
513- updateTargets DecreasedEstablishedBigLedgerPeers
524+ establishedBigLedgerDecreased <- updateTargets DecreasedEstablishedBigLedgerPeers
514525 numberOfEstablishedBigLedgerPeers
515526 (1 + closeConnectionTimeout)
516- decreaseEstablishedBigLedgerPeers
527+ ( decreaseEstablishedBigLedgerPeers activeBigLedgerDecreased)
517528 checkEstablishedBigLedgerPeersDecreased
518529
519530 -- Forget the worst performing known big ledger peers.
520- updateTargets DecreasedKnownBigLedgerPeers
531+ void $ updateTargets DecreasedKnownBigLedgerPeers
521532 numberOfKnownBigLedgerPeers
522533 shortTimeout
523- decreaseKnownBigLedgerPeers
534+ ( decreaseKnownBigLedgerPeers establishedBigLedgerDecreased)
524535 checkKnownBigLedgerPeersDecreased
525536
526537 -- Pick new known big ledger peers
527- updateTargets IncreasedKnownBigLedgerPeers
538+ void $ updateTargets IncreasedKnownBigLedgerPeers
528539 numberOfKnownBigLedgerPeers
529540 (2 * requestPeersTimeout + shortTimeout)
530541 increaseKnownBigLedgerPeers
531542 checkKnownBigLedgerPeersIncreased
532543
533544 -- Pick new non-active big ledger peers
534- updateTargets IncreasedEstablishedBigLedgerPeers
545+ void $ updateTargets IncreasedEstablishedBigLedgerPeers
535546 numberOfEstablishedBigLedgerPeers
536547 churnEstablishConnectionTimeout
537548 increaseEstablishedBigLedgerPeers
538549 checkEstablishedBigLedgerPeersIncreased
539550
540551 -- Purge the worst active peers.
541- updateTargets DecreasedActivePeers
552+ activePeersDecreased <- updateTargets DecreasedActivePeers
542553 numberOfActivePeers
543554 deactivateTimeout
544555 decreaseActivePeers
545556 checkActivePeersDecreased
546557
547558 -- Pick new active peers.
548- updateTargets IncreasedActivePeers
559+ void $ updateTargets IncreasedActivePeers
549560 numberOfActivePeers
550561 shortTimeout
551562 increaseActivePeers
552563 checkActivePeersIncreased
553564
554565 -- Forget the worst performing established peers.
555- updateTargets DecreasedEstablishedPeers
566+ establishedPeersDecreased <- updateTargets DecreasedEstablishedPeers
556567 numberOfEstablishedPeers
557568 (1 + closeConnectionTimeout)
558- decreaseEstablishedPeers
569+ ( decreaseEstablishedPeers activePeersDecreased)
559570 checkEstablishedPeersDecreased
560571
561572 -- Forget the worst performing known peers (root peers, ledger peers)
562- updateTargets DecreasedKnownPeers
573+ void $ updateTargets DecreasedKnownPeers
563574 numberOfKnownPeers
564575 shortTimeout
565- decreaseKnownPeers
576+ ( decreaseKnownPeers establishedPeersDecreased)
566577 checkKnownPeersDecreased
567578
568579 -- Pick new known peers
569- updateTargets IncreasedKnownPeers
580+ void $ updateTargets IncreasedKnownPeers
570581 numberOfKnownPeers
571582 (2 * requestPeersTimeout + shortTimeout)
572583 increaseKnownPeers
573584 checkKnownPeersIncreased
574585
575586 -- Pick new non-active peers
576- updateTargets IncreasedEstablishedPeers
587+ void $ updateTargets IncreasedEstablishedPeers
577588 numberOfEstablishedPeers
578589 churnEstablishConnectionTimeout
579590 increaseEstablishedPeers
@@ -620,4 +631,8 @@ peerChurnGovernor PeerChurnArgs {
620631
621632 -- Replace 20% or at least one peer every churnInterval.
622633 decrease :: Int -> Int
623- decrease v = max 0 $ v - max 1 (v `div` 5 )
634+ decrease = decreaseWithMin 1
635+
636+ -- Replace 20% or at least `u` or at least one peer every churnInterval.
637+ decreaseWithMin :: Int -> Int -> Int
638+ decreaseWithMin u v = max 0 $ v - max u (max 1 (v `div` 5 ))
0 commit comments