Skip to content

cardano-diffusion: label ledger peer usage - #5378

Open
dancewithheart wants to merge 3 commits into
IntersectMBO:mainfrom
dancewithheart:ledger-peer-distribution-label
Open

cardano-diffusion: label ledger peer usage#5378
dancewithheart wants to merge 3 commits into
IntersectMBO:mainfrom
dancewithheart:ledger-peer-distribution-label

Conversation

@dancewithheart

@dancewithheart dancewithheart commented May 27, 2026

Copy link
Copy Markdown
Contributor

Description

Fixes #4683

Issue reference comment for ledgerPeers in genNodeArgs :

ledgerPeers :: [[NonEmpty LedgerRelayAccessPoint]]
<- listOf1 (listOf1 (sublistOf1 (NonEmpty.fromList $ makeRelayAccessPoint <$> ledgerPeersRelays)))

genNodeArgs is used in generator for DiffusionScript:

nodeArgs <- genNodeArgs relays' minConnected localRts relay txs

It is used in many properties, but most likely target seems prop_peer_selection_trace_coverage that already tabulate TracePeerSelection events. I added another tabulate - over events with Set peeraddr (and not on single peeraddr):

cabal run cardano-diffusion:test:cardano-diffusion-sim-tests -- -p '/peer selection trace coverage/'

now shows:

cardano-diffusion-sim-tests
  Ouroboros.Network.Testnet
    IOSim
      coverage
        peer selection trace coverage: OK (35.13s)
          +++ OK, passed 100 tests.                                                                                                                                                         
          
          distribution of used ledger peers (8350 in total):
          63.15% TraceBigLedgerPeersResults 0
          26.49% TracePromoteColdBigLedgerPeers 1
           8.90% TraceBigLedgerPeersResults 1
           1.20% TraceForgetBigLedgerPeers 1
           0.18% TracePromoteWarmBigLedgerPeers 1
           0.08% TraceBigLedgerPeersResults 2
          
          peer selection trace (65219 in total):
          16.330% TraceGovernorWakeup
          12.394% TracePromoteColdFailed

Checklist

Quality

  • Commit sequence makes sense and have useful messages, see ref.
  • New tests are added and existing tests are updated.
  • Self-reviewed the PR.

Maintenance

  • Linked an issue or added the PR to the current sprint of ouroboros-network project.
  • Added labels.
  • Updated changelog files.
  • The documentation has been properly updated, see ref.

@coot

coot commented Jun 1, 2026

Copy link
Copy Markdown
Contributor

Thanks. Note that this only adds statistics for big ledger peers. For ledger peers you'd need to use

  • TracePublicRootsResults
  • for promotions of warm ledger peers, we don't have a separate event (like we do for ledger peers), so one would need to use a combination of TracePromoteWarmPeers and DebugPeerSelectionState (PeerSelectionState contains publicRootPeers field, which has access to getLedgerPeers - set of ledger peers).
  • probably a similar approach is needed for other ledger traces.

We're getting 63% of time TraceBigLedgerPeersResults 0 - that's something to investigate.

@dancewithheart
dancewithheart marked this pull request as draft June 1, 2026 10:47
@dancewithheart

Copy link
Copy Markdown
Contributor Author

Thank you for the review and remarks.

I updated this to split the output into two labels:

  • ledger peer result sizes
  • ledger peers selected by actions
cardano-diffusion-sim-tests
  Ouroboros.Network.Testnet
    IOSim
      coverage
        peer selection trace coverage: OK (36.13s)
          +++ OK, passed 100 tests.                                                                                                                                                                                                 
          
          ledger peer result sizes (9350 in total):
          57.47% TraceBigLedgerPeersResults 0
          34.46% TracePublicRootsResults ledger peers 0
           6.73% TraceBigLedgerPeersResults 1
           1.30% TracePublicRootsResults ledger peers 1
           0.04% TraceBigLedgerPeersResults 2
          
          ledger peers selected by actions (1755 in total):
          93.45% TracePromoteColdBigLedgerPeers 1
           3.87% TraceForgetBigLedgerPeers 1
           2.68% TracePromoteWarmBigLedgerPeers 1
          
          peer selection trace (65943 in total):
          15.433% TraceGovernorWakeup
          14.466% TraceUseBootstrapPeersChanged
          11.684% TracePromoteColdFailed
           9.713% TracePromoteColdLocalPeers
           9.120% TraceBigLedgerPeersRequest
           9.108% TraceBigLedgerPeersResults
           5.083% TracePublicRootsRequest
           5.071% TracePublicRootsResults
           3.313% TraceTargetsChanged
           2.514% TracePromoteColdPeers
           2.487% TracePromoteColdBigLedgerPeers
           2.425% TraceLocalRootPeersChanged
           2.264% TracePromoteColdBigLedgerPeerFailed
           2.068% TraceChurnWait
...

TracePublicRootsResults now contributes normal ledger-peer result sizes via PublicRootPeers.getLedgerPeers.

For generic peer actions such as TracePromoteWarmPeers, the selected peer set is classified using the ledger-peer set from the most recent TraceDebugState / dpssPublicRootPeers.

Before the first debug-state snapshot, generic actions are left unclassified rather than counted as selecting zero ledger peers. This is done in last commit - without this it looked like so:

          ledger peer result sizes (8964 in total):
          59.86% TraceBigLedgerPeersResults 0
          31.05% TracePublicRootsResults ledger peers 0
           7.74% TraceBigLedgerPeersResults 1
           1.32% TracePublicRootsResults ledger peers 1
           0.03% TraceBigLedgerPeersResults 2

          ledger peers selected by actions (4336 in total):
          50.62% TracePromoteColdBigLedgerPeers 1
          41.21% TracePromoteColdPeers ledger peers 0
           4.68% TraceForgetColdPeers ledger peers 0
           1.66% TracePromoteWarmBigLedgerPeers 1
           1.45% TraceForgetBigLedgerPeers 1
           0.32% TracePromoteWarmPeers ledger peers 0
           0.02% TraceDemoteHotBigLedgerPeers 1
           0.02% TraceDemoteWarmBigLedgerPeers 1

We're getting 63% of time TraceBigLedgerPeersResults 0 - that's something to investigate.

Do you want the investigation of this to be part of this PR?

@dancewithheart
dancewithheart marked this pull request as ready for review June 18, 2026 22:34

@coot coot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

let currentLedgerPeers = PublicRootPeers.getLedgerPeers (dpssPublicRootPeers st)
in go (Just currentLedgerPeers) evs
go mbLedgerPeers (event : evs) =
let (resultLabels, actionLabels) = go mbLedgerPeers evs

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not tail recursive, but surprisingly this doesn't inflate heap usage.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: In Progress

Development

Successfully merging this pull request may close these issues.

Add label for diffusion tests, showing the distribution of used ledger peers

2 participants