@@ -111,12 +111,6 @@ data PeerTxAPI m txid tx = PeerTxAPI {
111111 -> PeerTxLocalState tx
112112 -> m (PeerTxLocalState tx ),
113113
114- -- | Update the peer's rejection score based on the number of txs rejected
115- -- by the mempool, or late/missing delivieries.
116- countRejectedTxs :: Time
117- -> Int
118- -> m Double ,
119-
120114 -- | Resolve txids and advertised sizes for a batch of tx keys to request.
121115 resolveTxRequest :: PeerTxLocalState tx
122116 -> [TxKey ]
@@ -155,8 +149,7 @@ withPeer
155149withPeer policy TxSubmissionMempoolReader { mempoolGetSnapshot } sharedStateVar countersVar peeraddr io =
156150 bracket
157151 (do
158- now <- getMonotonicTime
159- atomically $ modifyTVar sharedStateVar (registerPeer now)
152+ atomically $ modifyTVar sharedStateVar registerPeer
160153 pure PeerTxAPI {
161154 awaitSharedChange = awaitSharedChangeImp sharedStateVar peeraddr
162155 , runNextPeerAction = runNextPeerActionImp policy sharedStateVar countersVar peeraddr
@@ -167,7 +160,6 @@ withPeer policy TxSubmissionMempoolReader { mempoolGetSnapshot } sharedStateVar
167160 , applyReceivedTxs = applyReceivedTxsImp policy mempoolGetSnapshot sharedStateVar
168161 countersVar peeraddr
169162 , applySubmittedTxs = applySubmittedTxsImp policy sharedStateVar countersVar peeraddr
170- , countRejectedTxs = countRejectedTxsImp policy sharedStateVar peeraddr
171163 , resolveTxRequest = resolveTxRequestImp sharedStateVar
172164 , resolveBufferedTxs = resolveBufferedTxsImp sharedStateVar
173165 , startSubmittingTxs = atomically . modifyTVar sharedStateVar .
@@ -180,16 +172,15 @@ withPeer policy TxSubmissionMempoolReader { mempoolGetSnapshot } sharedStateVar
180172 atomically $ modifyTVar sharedStateVar (unregisterPeer now))
181173 io
182174 where
183- registerPeer :: Time -> SharedTxState peeraddr txid -> SharedTxState peeraddr txid
184- registerPeer now st@ SharedTxState { sharedPeers, sharedGeneration } =
175+ registerPeer :: SharedTxState peeraddr txid -> SharedTxState peeraddr txid
176+ registerPeer st@ SharedTxState { sharedPeers, sharedGeneration } =
185177 st {
186178 sharedPeers = Map. insert peeraddr sharedPeerState sharedPeers,
187179 sharedGeneration = sharedGeneration + 1
188180 }
189181 where
190182 sharedPeerState = SharedPeerState {
191183 sharedPeerPhase = PeerIdle ,
192- sharedPeerScore = emptyPeerScore now,
193184 sharedPeerAdvertisedTxKeys = IntSet. empty,
194185 sharedPeerGeneration = 0
195186 }
@@ -337,7 +328,7 @@ runNextPeerActionImp policy sharedStateVar countersVar peeraddr now peerState =
337328 let sharedGeneration0 = sharedGeneration sharedState
338329 (peerAction, peerState', sharedState') = State. nextPeerAction now policy peeraddr
339330 peerState sharedState
340- sharedState'' = updatePeerPhase now policy peeraddr
331+ sharedState'' = updatePeerPhase peeraddr
341332 (peerPhaseForActionIdle peerAction) sharedState'
342333 writeSharedStateIfChanged sharedStateVar sharedGeneration0 sharedState''
343334 updateCountersForAction countersVar peerAction
@@ -364,7 +355,7 @@ runNextPeerActionPipelinedImp policy sharedStateVar countersVar peeraddr now pee
364355 let sharedGeneration0 = sharedGeneration sharedState
365356 (peerAction, peerState', sharedState') = State. nextPeerActionPipelined now policy
366357 peeraddr peerState sharedState
367- sharedState'' = updatePeerPhase now policy peeraddr
358+ sharedState'' = updatePeerPhase peeraddr
368359 (peerPhaseForActionPipelined peeraddr peerAction sharedState')
369360 sharedState'
370361 writeSharedStateIfChanged sharedStateVar sharedGeneration0 sharedState''
@@ -466,42 +457,6 @@ applySubmittedTxsImp policy sharedStateVar countersVar peeraddr now acceptedTxs
466457 , txsRejected = fromIntegral (length rejectedTxs) })
467458 return peerState'
468459
469- -- | Update the peer's rejection score based on the number of txs rejected
470- -- by the mempool.
471- -- Returns the new score value for tracing. The score
472- -- decays over time and affects fallback peer selection when leases expire.
473- countRejectedTxsImp :: ( MonadSTM m
474- , Ord peeraddr )
475- => TxDecisionPolicy
476- -> SharedTxStateVar m peeraddr txid
477- -> peeraddr
478- -> Time
479- -> Int
480- -> m Double
481- countRejectedTxsImp TxDecisionPolicy { scoreRate, scoreMax } sharedStateVar peeraddr now
482- rejectedCount = atomically $ stateTVar sharedStateVar $
483- updatePeerRejects (fromIntegral rejectedCount)
484- where
485- updatePeerRejects n sharedState =
486- case Map. lookup peeraddr (sharedPeers sharedState) of
487- Nothing -> (0 , sharedState) -- TODO this is an invariant violation
488- Just sharedPeerState@ SharedPeerState { sharedPeerScore } ->
489- let sharedPeerScore' = updateRejects n sharedPeerScore
490- sharedPeerState' = sharedPeerState { sharedPeerScore = sharedPeerScore' }
491- sharedState' = sharedState {
492- sharedPeers = Map. insert peeraddr sharedPeerState' (sharedPeers sharedState),
493- sharedGeneration = sharedGeneration sharedState + 1
494- } in
495- (peerScoreValue sharedPeerScore', sharedState')
496-
497- updateRejects 0 ps@ PeerScore { peerScoreValue = 0 } = ps { peerScoreTs = now }
498- updateRejects n ps@ PeerScore { peerScoreValue, peerScoreTs } =
499- let duration = diffTime now peerScoreTs
500- ! drain = realToFrac duration * scoreRate
501- ! drained = max 0 (peerScoreValue - drain) in
502- ps { peerScoreValue = min scoreMax (drained + n)
503- , peerScoreTs = now }
504-
505460-- | Resolve txids and advertised sizes for a batch of tx keys to request.
506461--
507462-- Looks up the real txid and size from peer-local state for building the
@@ -548,55 +503,35 @@ resolveBufferedTxsImp sharedStateVar peerState txKeys = atomically $ do
548503
549504-- | Update a peer's phase.
550505--
551- -- A phase change always bumps the shared generation and normalizes the moving
552- -- peer's score by draining it to @now@. In addition:
506+ -- A phase change always bumps the shared generation. In addition:
553507--
554508-- * When a peer becomes 'PeerIdle', bump that peer's own generation so a
555509-- 'PeerDoNothing' action computed before the phase change does not put that
556510-- same peer thread to sleep on a stale generation. This makes its next
557511-- 'awaitSharedChange' return immediately and re-run scheduling as an idle
558512-- claimant.
559- -- * When a peer becomes 'PeerIdle', bump that peer's own generation so it
560- -- immediately re-runs scheduling against any txs whose score-derived claim
561- -- delay may already have elapsed.
513+ -- * When a peer leaves idle, bump idle advertisers so they can immediately
514+ -- compete for any leases the departing peer held.
562515updatePeerPhase
563516 :: Ord peeraddr
564- => Time
565- -> TxDecisionPolicy
566- -> peeraddr
517+ => peeraddr
567518 -> PeerPhase
568519 -> SharedTxState peeraddr txid
569520 -> SharedTxState peeraddr txid
570- updatePeerPhase now policy peeraddr peerPhaseNew
521+ updatePeerPhase peeraddr peerPhaseNew
571522 st@ SharedTxState { sharedPeers, sharedGeneration } =
572523 case Map. lookup peeraddr sharedPeers of
573524 Just sharedPeerState ->
574525 let peerPhaseOld = sharedPeerPhase sharedPeerState in
575526 if peerPhaseOld /= peerPhaseNew
576527 then
577- let sharedPeerScore' =
578- normalizePeerScore (sharedPeerScore sharedPeerState)
579- sharedPeerState' =
580- sharedPeerState {
581- sharedPeerPhase = peerPhaseNew,
582- sharedPeerScore = sharedPeerScore'
583- }
584- in
585- let st' = st { sharedPeers = Map. insert peeraddr
586- sharedPeerState' sharedPeers
587- , sharedGeneration = sharedGeneration + 1 } in
588- bumpIdlePeerGenerations (phaseWakePeers peerPhaseOld) st'
528+ let sharedPeerState' = sharedPeerState { sharedPeerPhase = peerPhaseNew }
529+ st' = st { sharedPeers = Map. insert peeraddr sharedPeerState' sharedPeers
530+ , sharedGeneration = sharedGeneration + 1 }
531+ in bumpIdlePeerGenerations (phaseWakePeers peerPhaseOld) st'
589532 else st
590533 _ -> st -- TODO error?
591534 where
592- normalizePeerScore ps@ PeerScore { peerScoreValue }
593- | peerScoreValue == 0 = ps
594- | otherwise =
595- let PeerScore { peerScoreTs } = ps
596- ! drain = realToFrac (diffTime now peerScoreTs) * scoreRate policy
597- ! drained = max 0 (peerScoreValue - drain)
598- in ps { peerScoreValue = drained, peerScoreTs = now }
599-
600535 phaseWakePeers peerPhaseOld
601536 | peerPhaseOld /= PeerIdle
602537 , peerPhaseNew == PeerIdle = Set. singleton peeraddr
0 commit comments