Skip to content

Commit 0c381f3

Browse files
authored
Merge pull request #5240 from IntersectMBO/karknu/min_churn_main
Enforce a min churn
2 parents 246eb8b + 56449d8 commit 0c381f3

File tree

4 files changed

+107
-65
lines changed

4 files changed

+107
-65
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
### Non-Breaking
3+
4+
- Enforce a minimum churn of established peers based on churned active peers.
5+
- Enforce a minimum churn of known peers based on churned established peers.
6+

cardano-diffusion/lib/Cardano/Network/PeerSelection/Churn.hs

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import Control.Monad.Class.MonadThrow
2727
import Control.Monad.Class.MonadTime.SI
2828
import Control.Monad.Class.MonadTimer.SI
2929
import Control.Tracer (Tracer, traceWith)
30-
import Data.Functor (($>))
30+
import Data.Functor (void, ($>))
3131
import Data.Monoid.Synchronisation (FirstToFinish (..))
3232
import 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))
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
### Non-Breaking
3+
4+
- Enforce a minimum churn of established peers based on churned active peers.
5+
- Enforce a minimum churn of known peers based on churned established peers.
6+

0 commit comments

Comments
 (0)