Skip to content

Commit

Permalink
p2p-governor: warm→hot re-promotion delay
Browse files Browse the repository at this point in the history
When `chain-sync` returns, we use `activateDelay :: DiffTime` to delay
re-promotion of that peer to `hot` again.
  • Loading branch information
coot committed Mar 2, 2021
1 parent 8117ab6 commit 3bb7290
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 4 deletions.
Expand Up @@ -45,6 +45,7 @@ import Control.Monad.Class.MonadTime
import Control.Monad.Class.MonadTimer
import Control.Tracer (Tracer(..), traceWith)

import qualified Ouroboros.Network.PeerSelection.EstablishedPeers as EstablishedPeers
import qualified Ouroboros.Network.PeerSelection.KnownPeers as KnownPeers
import qualified Ouroboros.Network.PeerSelection.Governor.ActivePeers as ActivePeers
import qualified Ouroboros.Network.PeerSelection.Governor.EstablishedPeers as EstablishedPeers
Expand Down Expand Up @@ -472,8 +473,10 @@ peerSelectionGovernorLoop tracer debugTracer actions policy jobPool =
loop :: PeerSelectionState peeraddr peerconn -> m Void
loop !st = assertPeerSelectionState st $ do
blockedAt <- getMonotonicTime
let knownPeers' = KnownPeers.setCurrentTime blockedAt (knownPeers st)
st' = st { knownPeers = knownPeers' }
let knownPeers' = KnownPeers.setCurrentTime blockedAt (knownPeers st)
establishedPeers' = EstablishedPeers.setCurrentTime blockedAt (establishedPeers st)
st' = st { knownPeers = knownPeers',
establishedPeers = establishedPeers' }

timedDecision <- evalGuardedDecisions blockedAt st'

Expand Down
Expand Up @@ -8,6 +8,7 @@ module Ouroboros.Network.PeerSelection.Governor.ActivePeers
, jobDemoteActivePeer
) where

import Data.Semigroup (Min(..))
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
Expand Down Expand Up @@ -49,6 +50,9 @@ belowTarget actions
targetNumberOfActivePeers
}
}
| Map.null (EstablishedPeers.establishedReady establishedPeers)
= GuardedSkip (Min <$> EstablishedPeers.minActivateTime establishedPeers)

-- Are we below the target for number of active peers?
| numActivePeers + numPromoteInProgress < targetNumberOfActivePeers

Expand Down Expand Up @@ -91,7 +95,7 @@ belowTarget actions
= GuardedSkip Nothing
where
numEstablishedPeers, numActivePeers, numPromoteInProgress :: Int
numEstablishedPeers = EstablishedPeers.size establishedPeers
numEstablishedPeers = Map.size (EstablishedPeers.establishedReady establishedPeers)
numActivePeers = Set.size activePeers
numPromoteInProgress = Set.size inProgressPromoteWarm
numDemoteInProgress = Set.size inProgressDemoteWarm
Expand Down
Expand Up @@ -86,6 +86,11 @@ jobs jobPool st =
reconnectDelay :: DiffTime
reconnectDelay = 10

-- | Activation delay after a peer was asynchronously demoted to warm state.
--
activateDelay :: DiffTime
activateDelay = 60


-- | Monitor connections.
--
Expand Down Expand Up @@ -115,7 +120,10 @@ connections PeerSelectionActions{peerStateActions = PeerStateActions {monitorPee
-- Note that we do not use establishedStatus' which
-- has the synchronous ones that are supposed to be
-- handled elsewhere. We just update the async ones:
establishedPeers' = EstablishedPeers.updateStatuses
establishedPeers' = EstablishedPeers.setActivateTime
(Map.keysSet demotedToWarm)
(activateDelay `addTime` now)
. EstablishedPeers.updateStatuses
demotedToWarm
. EstablishedPeers.deletePeers
(Map.keysSet demotedToCold)
Expand Down

0 comments on commit 3bb7290

Please sign in to comment.