mirror of
https://gitlab.com/pulsechaincom/erigon-pulse.git
synced 2025-01-03 17:44:29 +00:00
move to PeekBest and YieldBest methods in txpool (#773)
Following up on comments from the first iteration of this change. How does this look?
This commit is contained in:
parent
9f72de1e9d
commit
c9a7ae152a
@ -230,7 +230,7 @@ type metaTx struct {
|
|||||||
timestamp uint64 // when it was added to pool
|
timestamp uint64 // when it was added to pool
|
||||||
subPool SubPoolMarker
|
subPool SubPoolMarker
|
||||||
currentSubPool SubPoolType
|
currentSubPool SubPoolType
|
||||||
candidate bool
|
alreadyYielded bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newMetaTx(slot *types.TxSlot, isLocal bool, timestmap uint64) *metaTx {
|
func newMetaTx(slot *types.TxSlot, isLocal bool, timestmap uint64) *metaTx {
|
||||||
@ -601,9 +601,7 @@ func (p *TxPool) IsLocal(idHash []byte) bool {
|
|||||||
func (p *TxPool) AddNewGoodPeer(peerID types.PeerID) { p.recentlyConnectedPeers.AddPeer(peerID) }
|
func (p *TxPool) AddNewGoodPeer(peerID types.PeerID) { p.recentlyConnectedPeers.AddPeer(peerID) }
|
||||||
func (p *TxPool) Started() bool { return p.started.Load() }
|
func (p *TxPool) Started() bool { return p.started.Load() }
|
||||||
|
|
||||||
// Best - returns top `n` elements of pending queue
|
func (p *TxPool) best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64, isYielding bool) (bool, error) {
|
||||||
// id doesn't perform full copy of txs, however underlying elements are immutable
|
|
||||||
func (p *TxPool) Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64, isMining bool) (bool, error) {
|
|
||||||
// First wait for the corresponding block to arrive
|
// First wait for the corresponding block to arrive
|
||||||
if p.lastSeenBlock.Load() < onTopOf {
|
if p.lastSeenBlock.Load() < onTopOf {
|
||||||
return false, nil // Too early
|
return false, nil // Too early
|
||||||
@ -626,7 +624,7 @@ func (p *TxPool) Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableG
|
|||||||
|
|
||||||
mt := best.ms[i]
|
mt := best.ms[i]
|
||||||
|
|
||||||
if isMining && mt.candidate {
|
if isYielding && mt.alreadyYielded {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -659,8 +657,8 @@ func (p *TxPool) Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableG
|
|||||||
txs.Txs[j] = rlpTx
|
txs.Txs[j] = rlpTx
|
||||||
copy(txs.Senders.At(j), sender)
|
copy(txs.Senders.At(j), sender)
|
||||||
txs.IsLocal[j] = isLocal
|
txs.IsLocal[j] = isLocal
|
||||||
if isMining {
|
if isYielding {
|
||||||
mt.candidate = true
|
mt.alreadyYielded = true
|
||||||
}
|
}
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
@ -677,6 +675,14 @@ func (p *TxPool) Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableG
|
|||||||
return success, err
|
return success, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *TxPool) YieldBest(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64) (bool, error) {
|
||||||
|
return p.best(n, txs, tx, onTopOf, availableGas, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *TxPool) PeekBest(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64) (bool, error) {
|
||||||
|
return p.best(n, txs, tx, onTopOf, availableGas, false)
|
||||||
|
}
|
||||||
|
|
||||||
func (p *TxPool) CountContent() (int, int, int) {
|
func (p *TxPool) CountContent() (int, int, int) {
|
||||||
p.lock.Lock()
|
p.lock.Lock()
|
||||||
defer p.lock.Unlock()
|
defer p.lock.Unlock()
|
||||||
|
@ -51,7 +51,7 @@ var TxPoolAPIVersion = &types2.VersionReply{Major: 1, Minor: 0, Patch: 0}
|
|||||||
type txPool interface {
|
type txPool interface {
|
||||||
ValidateSerializedTxn(serializedTxn []byte) error
|
ValidateSerializedTxn(serializedTxn []byte) error
|
||||||
|
|
||||||
Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64, isMining bool) (bool, error)
|
PeekBest(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64) (bool, error)
|
||||||
GetRlp(tx kv.Tx, hash []byte) ([]byte, error)
|
GetRlp(tx kv.Tx, hash []byte) ([]byte, error)
|
||||||
AddLocalTxs(ctx context.Context, newTxs types.TxSlots, tx kv.Tx) ([]DiscardReason, error)
|
AddLocalTxs(ctx context.Context, newTxs types.TxSlots, tx kv.Tx) ([]DiscardReason, error)
|
||||||
deprecatedForEach(_ context.Context, f func(rlp, sender []byte, t SubPoolType), tx kv.Tx)
|
deprecatedForEach(_ context.Context, f func(rlp, sender []byte, t SubPoolType), tx kv.Tx)
|
||||||
@ -155,7 +155,7 @@ func (s *GrpcServer) Pending(ctx context.Context, _ *emptypb.Empty) (*txpool_pro
|
|||||||
reply := &txpool_proto.PendingReply{}
|
reply := &txpool_proto.PendingReply{}
|
||||||
reply.Txs = make([]*txpool_proto.PendingReply_Tx, 0, 32)
|
reply.Txs = make([]*txpool_proto.PendingReply_Tx, 0, 32)
|
||||||
txSlots := types.TxsRlp{}
|
txSlots := types.TxsRlp{}
|
||||||
if _, err := s.txPool.Best(math.MaxInt16, &txSlots, tx, 0 /* onTopOf */, math.MaxUint64 /* available gas */, false); err != nil {
|
if _, err := s.txPool.PeekBest(math.MaxInt16, &txSlots, tx, 0 /* onTopOf */, math.MaxUint64 /* available gas */); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
var senderArr [20]byte
|
var senderArr [20]byte
|
||||||
|
Loading…
Reference in New Issue
Block a user