Skip to content

Commit e2e346a

Browse files
authored
Merge pull request #5239 from IntersectMBO/coot/min_churn_10.5
Enforce a min churn (cardano-node-10.5)
2 parents a9c96f4 + 908ba10 commit e2e346a

File tree

4 files changed

+103
-66
lines changed

4 files changed

+103
-66
lines changed

ouroboros-network/CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,13 @@
66

77
### Non-breaking changes
88

9+
## 0.21.4.0 -- 2025-10-05
10+
11+
### Non-breaking changes
12+
13+
* Enforce a minimum churn of established peers based on churned active peers.
14+
* Enforce a minimum churn of known peers based on churned established peers.
15+
916
## 0.21.3.0 -- 2025-07-15
1017

1118
### Breaking changes

ouroboros-network/ouroboros-network.cabal

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
cabal-version: 3.0
22
name: ouroboros-network
3-
version: 0.21.3.0
3+
version: 0.21.4.0
44
synopsis: A networking layer for the Ouroboros blockchain protocol
55
description: A networking layer for the Ouroboros blockchain protocol.
66
license: Apache-2.0

ouroboros-network/src/Ouroboros/Cardano/PeerSelection/Churn.hs

Lines changed: 48 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import Cardano.Network.ConsensusMode (ConsensusMode (..))
2727
import Cardano.Network.PeerSelection.Bootstrap (UseBootstrapPeers (..))
2828
import Cardano.Network.Types (LedgerStateJudgement (..))
2929
import Control.Applicative (Alternative)
30-
import Data.Functor (($>))
30+
import Data.Functor (void, ($>))
3131
import Data.Monoid.Synchronisation (FirstToFinish (..))
3232
import Ouroboros.Cardano.Network.LedgerPeerConsensusInterface qualified as Cardano
3333
import 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

Comments
 (0)