Skip to content

Commit

Permalink
Sleep between 3300s and 3900s between churns
Browse files Browse the repository at this point in the history
  • Loading branch information
karknu authored and coot committed May 12, 2021
1 parent b0daa48 commit 382356a
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 11 deletions.
5 changes: 4 additions & 1 deletion ouroboros-network/src/Ouroboros/Network/Diffusion.hs
Expand Up @@ -637,7 +637,8 @@ runDataDiffusion tracers
-- RNGs used for picking random peers from the ledger and for
-- demoting/promoting peers.
rng <- newStdGen
let (ledgerPeersRng, policyRng) = split rng
let (ledgerPeersRng, rng') = split rng
(policyRng, churnRng) = split rng'
policyRngVar <- newTVarIO policyRng

-- Request interface, supply the number of peers desired.
Expand Down Expand Up @@ -852,6 +853,7 @@ runDataDiffusion tracers
$ \governorThread ->
Async.withAsync
(Governor.peerChurnGovernor
churnRng
daPeerSelectionTargets
peerSelectionTargetsVar)
$ \churnGovernorThread ->
Expand Down Expand Up @@ -988,6 +990,7 @@ runDataDiffusion tracers
$ \serverThread ->
Async.withAsync
(Governor.peerChurnGovernor
churnRng
daPeerSelectionTargets
peerSelectionTargetsVar)
$ \churnGovernorThread ->
Expand Down
29 changes: 19 additions & 10 deletions ouroboros-network/src/Ouroboros/Network/PeerSelection/Governor.hs
Expand Up @@ -39,13 +39,13 @@ import Data.Semigroup (Min(..))
import Control.Applicative (Alternative((<|>)))
import qualified Control.Concurrent.JobPool as JobPool
import Control.Concurrent.JobPool (JobPool)
import Control.Monad (forever)
import Control.Monad.Class.MonadAsync
import Control.Monad.Class.MonadThrow
import Control.Monad.Class.MonadSTM.Strict
import Control.Monad.Class.MonadTime
import Control.Monad.Class.MonadTimer
import Control.Tracer (Tracer(..), traceWith)
import System.Random

import Ouroboros.Network.Diffusion.Policies (closeConnectionTimeout)
import qualified Ouroboros.Network.PeerSelection.EstablishedPeers as EstablishedPeers
Expand Down Expand Up @@ -568,10 +568,11 @@ peerChurnGovernor :: forall m.
, MonadMonotonicTime m
, MonadDelay m
)
=> PeerSelectionTargets
-> StrictTVar m PeerSelectionTargets
=> StdGen
-> PeerSelectionTargets
-> StrictTVar m PeerSelectionTargets
-> m Void
peerChurnGovernor base peerSelectionVar = do
peerChurnGovernor inRng base peerSelectionVar = do
-- Wait a while so that not only the closest peers have had the time
-- to become warm.
startTs0 <- getMonotonicTime
Expand All @@ -580,9 +581,10 @@ peerChurnGovernor base peerSelectionVar = do
targetNumberOfActivePeers = targetNumberOfActivePeers base
})
endTs0 <- getMonotonicTime
threadDelay $ diffTime churnInterval $ Time $ diffTime endTs0 startTs0
fuzzyDelay inRng (Time $ diffTime endTs0 startTs0) >>= go

forever $ do
where
go rng = do
startTs <- getMonotonicTime

-- Purge the worst active peer(s).
Expand Down Expand Up @@ -620,13 +622,20 @@ peerChurnGovernor base peerSelectionVar = do
, targetNumberOfEstablishedPeers = targetNumberOfEstablishedPeers base
})
endTs <- getMonotonicTime
threadDelay $ diffTime churnInterval $ Time $ diffTime endTs startTs

fuzzyDelay rng (Time $ diffTime endTs startTs) >>= go

where
-- The time between running the churn governor.
-- Randomly delay between churnInterval and churnInterval + maxFuzz seconds.
fuzzyDelay :: StdGen -> Time -> m StdGen
fuzzyDelay rng execTime = do
let (fuzz, rng') = randomR (0, 600 :: Double) rng
threadDelay $ (realToFrac fuzz) + (diffTime churnInterval execTime)
return rng'

-- The min time between running the churn governor.
churnInterval :: Time
churnInterval = Time 3600 -- 1h
churnInterval = Time 3300


-- Replace 20% or at least on peer every churnInterval.
decrease :: Int -> Int
Expand Down

0 comments on commit 382356a

Please sign in to comment.