Skip to content

Commit a683e1b

Browse files
authored
GDD: add separate trace event for disconnections (#1244)
It is desirable to have an explicit trace event for when the GDD decides to disconnect from someone. The already existing "debug info" already contained this information, but it should not be traced by default.
2 parents 1eff83b + 6217f7f commit a683e1b

File tree

4 files changed

+36
-6
lines changed

4 files changed

+36
-6
lines changed

ouroboros-consensus-diffusion/changelog.d/20240912_105915_alexander.esgen_gdd_disconnect_trace.md

Whitespace-only changes.

ouroboros-consensus-diffusion/test/consensus-test/Test/Consensus/PeerSimulator/Trace.hs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,12 @@ module Test.Consensus.PeerSimulator.Trace (
2323
import Control.Tracer (Tracer (Tracer), contramap, traceWith)
2424
import Data.Bifunctor (second)
2525
import Data.List (intersperse)
26+
import qualified Data.List.NonEmpty as NE
2627
import Data.Time.Clock (DiffTime, diffTimeToPicoseconds)
2728
import Ouroboros.Consensus.Block (GenesisWindow (..), Header, Point,
2829
WithOrigin (NotOrigin, Origin), succWithOrigin)
2930
import Ouroboros.Consensus.Genesis.Governor (DensityBounds (..),
30-
TraceGDDEvent (..))
31+
GDDDebugInfo (..), TraceGDDEvent (..))
3132
import Ouroboros.Consensus.MiniProtocol.ChainSync.Client
3233
(TraceChainSyncClientEvent (..))
3334
import Ouroboros.Consensus.MiniProtocol.ChainSync.Client.Jumping
@@ -490,7 +491,15 @@ showPeers = map (\ (peer, v) -> " " ++ condense peer ++ ": " ++ v)
490491
-- * Other utilities
491492
terseGDDEvent :: TraceGDDEvent PeerId TestBlock -> String
492493
terseGDDEvent = \case
493-
TraceGDDEvent {sgen = GenesisWindow sgen, curChain, bounds, candidates, candidateSuffixes, losingPeers, loeHead} ->
494+
TraceGDDDisconnected peers -> "GDD | Disconnected " <> show (NE.toList peers)
495+
TraceGDDDebug GDDDebugInfo {
496+
sgen = GenesisWindow sgen
497+
, curChain, bounds
498+
, candidates
499+
, candidateSuffixes
500+
, losingPeers
501+
, loeHead
502+
} ->
494503
unlines $ [
495504
"GDD | Window: " ++ window sgen loeHead,
496505
" Selection: " ++ terseHFragment curChain,
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
### Breaking
2+
3+
- Made `TraceGDDEvent` into a sum type, added a new terse constructor for when
4+
we disconnect from peers (this is supposed to get a high severity in the
5+
tracing system).

ouroboros-consensus/src/ouroboros-consensus/Ouroboros/Consensus/Genesis/Governor.hs

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
--
2626
module Ouroboros.Consensus.Genesis.Governor (
2727
DensityBounds (..)
28+
, GDDDebugInfo (..)
2829
, GDDStateView (..)
2930
, TraceGDDEvent (..)
3031
, densityDisconnect
@@ -38,6 +39,8 @@ import Data.Bifunctor (second)
3839
import Data.Containers.ListUtils (nubOrd)
3940
import Data.Foldable (for_, toList)
4041
import Data.Functor.Compose (Compose (..))
42+
import Data.List.NonEmpty (NonEmpty)
43+
import qualified Data.List.NonEmpty as NE
4144
import Data.Map.Strict (Map)
4245
import qualified Data.Map.Strict as Map
4346
import Data.Maybe (mapMaybe, maybeToList)
@@ -215,9 +218,12 @@ evaluateGDD cfg tracer stateView = do
215218
densityDisconnect sgen (configSecurityParam cfg) states candidateSuffixes loeFrag
216219
loeHead = AF.headAnchor loeFrag
217220

218-
traceWith tracer TraceGDDEvent {sgen, curChain, bounds, candidates, candidateSuffixes, losingPeers, loeHead}
221+
traceWith tracer $ TraceGDDDebug
222+
GDDDebugInfo {sgen, curChain, bounds, candidates, candidateSuffixes, losingPeers, loeHead}
219223

220-
for_ losingPeers $ \peer -> killActions Map.! peer
224+
whenJust (NE.nonEmpty losingPeers) $ \losingPeersNE -> do
225+
for_ losingPeersNE $ \peer -> killActions Map.! peer
226+
traceWith tracer $ TraceGDDDisconnected losingPeersNE
221227

222228
pure loeFrag
223229

@@ -424,8 +430,8 @@ densityDisconnect (GenesisWindow sgen) (SecurityParam k) states candidateSuffixe
424430
-- after the intersection. If both chains agree on the next header after
425431
-- the intersection, we don't disconnect peer1 either.
426432

427-
data TraceGDDEvent peer blk =
428-
TraceGDDEvent {
433+
data GDDDebugInfo peer blk =
434+
GDDDebugInfo {
429435
bounds :: [(peer, DensityBounds blk)],
430436
curChain :: AnchoredFragment (Header blk),
431437
candidates :: [(peer, AnchoredFragment (Header blk))],
@@ -435,6 +441,16 @@ data TraceGDDEvent peer blk =
435441
sgen :: GenesisWindow
436442
}
437443

444+
deriving stock instance
445+
( GetHeader blk, Show (Header blk), Show peer
446+
) => Show (GDDDebugInfo peer blk)
447+
448+
data TraceGDDEvent peer blk =
449+
-- | The GDD disconnected from the given peers due to insufficient density.
450+
TraceGDDDisconnected (NonEmpty peer)
451+
|
452+
TraceGDDDebug (GDDDebugInfo peer blk)
453+
438454
deriving stock instance
439455
( GetHeader blk, Show (Header blk), Show peer
440456
) => Show (TraceGDDEvent peer blk)

0 commit comments

Comments
 (0)