@@ -27,7 +27,7 @@ import Control.Monad.Class.MonadThrow
2727import Control.Monad.Class.MonadTime.SI
2828import Control.Monad.Class.MonadTimer.SI
2929import Control.Tracer (Tracer , traceWith )
30- import Data.Functor (($>) )
30+ import Data.Functor (void , ($>) )
3131import Data.Monoid.Synchronisation (FirstToFinish (.. ))
3232import System.Random
3333
@@ -207,7 +207,7 @@ peerChurnGovernor PeerChurnArgs {
207207 -- ^ update counters function
208208 -> CheckPeerSelectionCounters extraCounters
209209 -- ^ check counters
210- -> m ()
210+ -> m Int
211211 updateTargets churnAction getCounter timeoutDelay modifyTargets checkCounters = do
212212 -- update targets, and return the new targets
213213 startTime <- getMonotonicTime
@@ -241,12 +241,14 @@ peerChurnGovernor PeerChurnArgs {
241241 endTime <- getMonotonicTime
242242 traceWith tracer (TraceChurnAction (endTime `diffTime` startTime) churnAction r)
243243 traceWith churnTracer (ChurnCounter churnAction r)
244+ return $ abs r
244245 Left c' -> do
245246 endTime <- getMonotonicTime
246247 cancelTimeout
247248 let r = c' - c
248249 traceWith tracer (TraceChurnTimeout (endTime `diffTime` startTime) churnAction r)
249250 traceWith churnTracer (ChurnCounter churnAction r)
251+ return $ abs r
250252 )
251253
252254 --
@@ -335,11 +337,12 @@ peerChurnGovernor PeerChurnArgs {
335337 numberOfEstablishedBigLedgerPeers >= targetNumberOfEstablishedBigLedgerPeers
336338
337339 decreaseEstablishedPeers
338- :: ChurnRegime
340+ :: Int
341+ -> ChurnRegime
339342 -> HotValency
340343 -> PeerSelectionTargets
341344 -> ModifyPeerSelectionTargets
342- decreaseEstablishedPeers regime _ base targets =
345+ decreaseEstablishedPeers minDecrease regime _ base targets =
343346 targets {
344347 targetNumberOfEstablishedPeers =
345348 case regime of
@@ -351,7 +354,9 @@ peerChurnGovernor PeerChurnArgs {
351354 -- all warm peers to speed up the time to find the best performers.
352355 -- That is why we use the number of active peers in current targets
353356 -- as the upper bound on the number of established peers during this action.
354- _otherwise -> decrease (targetNumberOfEstablishedPeers base - targetNumberOfActivePeers base)
357+ _otherwise -> decreaseWithMin minDecrease
358+ (targetNumberOfEstablishedPeers base -
359+ targetNumberOfActivePeers base)
355360 + targetNumberOfActivePeers base }
356361
357362 checkEstablishedPeersDecreased
@@ -406,15 +411,17 @@ peerChurnGovernor PeerChurnArgs {
406411 numberOfActiveBigLedgerPeers
407412 <= targetNumberOfActiveBigLedgerPeers
408413
409- decreaseEstablishedBigLedgerPeers :: ChurnRegime
414+ decreaseEstablishedBigLedgerPeers :: Int
415+ -> ChurnRegime
410416 -> HotValency
411417 -> PeerSelectionTargets
412418 -> ModifyPeerSelectionTargets
413- decreaseEstablishedBigLedgerPeers _ _ base targets =
419+ decreaseEstablishedBigLedgerPeers minDecrease _ _ base targets =
414420 targets {
415421 targetNumberOfEstablishedBigLedgerPeers =
416- decrease (targetNumberOfEstablishedBigLedgerPeers base -
417- targetNumberOfActiveBigLedgerPeers base)
422+ decreaseWithMin minDecrease
423+ (targetNumberOfEstablishedBigLedgerPeers base -
424+ targetNumberOfActiveBigLedgerPeers base)
418425 + targetNumberOfActiveBigLedgerPeers base
419426 }
420427
@@ -429,19 +436,21 @@ peerChurnGovernor PeerChurnArgs {
429436
430437
431438 decreaseKnownPeers
432- :: ChurnRegime
439+ :: Int
440+ -> ChurnRegime
433441 -> HotValency
434442 -> PeerSelectionTargets
435443 -> ModifyPeerSelectionTargets
436- decreaseKnownPeers _ _ base targets =
444+ decreaseKnownPeers minDecrease _ _ base targets =
437445 targets {
438446 -- we clamp from above to not accidentally actually increase
439447 -- the number of root peers
440448 targetNumberOfRootPeers = min (targetNumberOfRootPeers base) $
441449 decrease (targetNumberOfRootPeers base - targetNumberOfEstablishedPeers base)
442450 + targetNumberOfEstablishedPeers base
443451 , targetNumberOfKnownPeers =
444- decrease (targetNumberOfKnownPeers base - targetNumberOfEstablishedPeers base)
452+ decreaseWithMin minDecrease
453+ (targetNumberOfKnownPeers base - targetNumberOfEstablishedPeers base)
445454 + targetNumberOfEstablishedPeers base
446455 }
447456
@@ -456,15 +465,17 @@ peerChurnGovernor PeerChurnArgs {
456465 numberOfKnownPeers <= targetNumberOfKnownPeers
457466
458467 decreaseKnownBigLedgerPeers
459- :: ChurnRegime
468+ :: Int
469+ -> ChurnRegime
460470 -> HotValency
461471 -> PeerSelectionTargets
462472 -> ModifyPeerSelectionTargets
463- decreaseKnownBigLedgerPeers _ _ base targets =
473+ decreaseKnownBigLedgerPeers minDecrease _ _ base targets =
464474 targets {
465475 targetNumberOfKnownBigLedgerPeers =
466- decrease (targetNumberOfKnownBigLedgerPeers base -
467- targetNumberOfEstablishedBigLedgerPeers base)
476+ decreaseWithMin minDecrease
477+ (targetNumberOfKnownBigLedgerPeers base -
478+ targetNumberOfEstablishedBigLedgerPeers base)
468479 + targetNumberOfEstablishedBigLedgerPeers base
469480 }
470481
@@ -530,84 +541,84 @@ peerChurnGovernor PeerChurnArgs {
530541 traceWith tracerChurnMode $ TraceChurnMode churnMode
531542
532543 -- Purge the worst active big ledger peers.
533- updateTargets DecreasedActiveBigLedgerPeers
544+ activeBigLedgerDecreased <- updateTargets DecreasedActiveBigLedgerPeers
534545 numberOfActiveBigLedgerPeers
535546 deactivateTimeout
536547 decreaseActiveBigLedgerPeers
537548 checkActiveBigLedgerPeersDecreased
538549
539550 -- Pick new active big ledger peers.
540- updateTargets IncreasedActiveBigLedgerPeers
551+ void $ updateTargets IncreasedActiveBigLedgerPeers
541552 numberOfActiveBigLedgerPeers
542553 shortTimeout
543554 increaseActiveBigLedgerPeers
544555 checkActiveBigLedgerPeersIncreased
545556
546557 -- Forget the worst performing established big ledger peers.
547- updateTargets DecreasedEstablishedBigLedgerPeers
558+ establishedBigLedgerDecreased <- updateTargets DecreasedEstablishedBigLedgerPeers
548559 numberOfEstablishedBigLedgerPeers
549560 (1 + closeConnectionTimeout)
550- decreaseEstablishedBigLedgerPeers
561+ ( decreaseEstablishedBigLedgerPeers activeBigLedgerDecreased)
551562 checkEstablishedBigLedgerPeersDecreased
552563
553564 -- Forget the worst performing known big ledger peers.
554- updateTargets DecreasedKnownBigLedgerPeers
565+ void $ updateTargets DecreasedKnownBigLedgerPeers
555566 numberOfKnownBigLedgerPeers
556567 shortTimeout
557- decreaseKnownBigLedgerPeers
568+ ( decreaseKnownBigLedgerPeers establishedBigLedgerDecreased)
558569 checkKnownBigLedgerPeersDecreased
559570
560571 -- Pick new known big ledger peers
561- updateTargets IncreasedKnownBigLedgerPeers
572+ void $ updateTargets IncreasedKnownBigLedgerPeers
562573 numberOfKnownBigLedgerPeers
563574 (2 * requestPeersTimeout + shortTimeout)
564575 increaseKnownBigLedgerPeers
565576 checkKnownBigLedgerPeersIncreased
566577
567578 -- Pick new non-active big ledger peers
568- updateTargets IncreasedEstablishedBigLedgerPeers
579+ void $ updateTargets IncreasedEstablishedBigLedgerPeers
569580 numberOfEstablishedBigLedgerPeers
570581 churnEstablishConnectionTimeout
571582 increaseEstablishedBigLedgerPeers
572583 checkEstablishedBigLedgerPeersIncreased
573584
574585 -- Purge the worst active peers.
575- updateTargets DecreasedActivePeers
586+ activePeersDecreased <- updateTargets DecreasedActivePeers
576587 numberOfActivePeers
577588 deactivateTimeout
578589 decreaseActivePeers
579590 checkActivePeersDecreased
580591
581592 -- Pick new active peers.
582- updateTargets IncreasedActivePeers
593+ void $ updateTargets IncreasedActivePeers
583594 numberOfActivePeers
584595 shortTimeout
585596 increaseActivePeers
586597 checkActivePeersIncreased
587598
588599 -- Forget the worst performing established peers.
589- updateTargets DecreasedEstablishedPeers
600+ establishedPeersDecreased <- updateTargets DecreasedEstablishedPeers
590601 numberOfEstablishedPeers
591602 (1 + closeConnectionTimeout)
592- decreaseEstablishedPeers
603+ ( decreaseEstablishedPeers activePeersDecreased)
593604 checkEstablishedPeersDecreased
594605
595606 -- Forget the worst performing known peers (root peers, ledger peers)
596- updateTargets DecreasedKnownPeers
607+ void $ updateTargets DecreasedKnownPeers
597608 numberOfKnownPeers
598609 shortTimeout
599- decreaseKnownPeers
610+ ( decreaseKnownPeers establishedPeersDecreased)
600611 checkKnownPeersDecreased
601612
602613 -- Pick new known peers
603- updateTargets IncreasedKnownPeers
614+ void $ updateTargets IncreasedKnownPeers
604615 numberOfKnownPeers
605616 (2 * requestPeersTimeout + shortTimeout)
606617 increaseKnownPeers
607618 checkKnownPeersIncreased
608619
609620 -- Pick new non-active peers
610- updateTargets IncreasedEstablishedPeers
621+ void $ updateTargets IncreasedEstablishedPeers
611622 numberOfEstablishedPeers
612623 churnEstablishConnectionTimeout
613624 increaseEstablishedPeers
@@ -654,4 +665,8 @@ peerChurnGovernor PeerChurnArgs {
654665
655666 -- Replace 20% or at least one peer every churnInterval.
656667 decrease :: Int -> Int
657- decrease v = max 0 $ v - max 1 (v `div` 5 )
668+ decrease = decreaseWithMin 1
669+
670+ -- Replace 20% or at least `u` or at least one peer every churnInterval.
671+ decreaseWithMin :: Int -> Int -> Int
672+ decreaseWithMin u v = max 0 $ v - max u (max 1 (v `div` 5 ))
0 commit comments