diff --git a/txpool/pool.go b/txpool/pool.go index 85566dc8c..bd62cd68a 100644 --- a/txpool/pool.go +++ b/txpool/pool.go @@ -230,7 +230,7 @@ type metaTx struct { timestamp uint64 // when it was added to pool subPool SubPoolMarker currentSubPool SubPoolType - candidate bool + alreadyYielded bool } 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) Started() bool { return p.started.Load() } -// Best - returns top `n` elements of pending queue -// 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) { +func (p *TxPool) best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableGas uint64, isYielding bool) (bool, error) { // First wait for the corresponding block to arrive if p.lastSeenBlock.Load() < onTopOf { 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] - if isMining && mt.candidate { + if isYielding && mt.alreadyYielded { continue } @@ -659,8 +657,8 @@ func (p *TxPool) Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableG txs.Txs[j] = rlpTx copy(txs.Senders.At(j), sender) txs.IsLocal[j] = isLocal - if isMining { - mt.candidate = true + if isYielding { + mt.alreadyYielded = true } j++ } @@ -677,6 +675,14 @@ func (p *TxPool) Best(n uint16, txs *types.TxsRlp, tx kv.Tx, onTopOf, availableG 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) { p.lock.Lock() defer p.lock.Unlock() diff --git a/txpool/txpool_grpc_server.go b/txpool/txpool_grpc_server.go index 7aff74a09..9db127e73 100644 --- a/txpool/txpool_grpc_server.go +++ b/txpool/txpool_grpc_server.go @@ -51,7 +51,7 @@ var TxPoolAPIVersion = &types2.VersionReply{Major: 1, Minor: 0, Patch: 0} type txPool interface { 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) 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) @@ -155,7 +155,7 @@ func (s *GrpcServer) Pending(ctx context.Context, _ *emptypb.Empty) (*txpool_pro reply := &txpool_proto.PendingReply{} reply.Txs = make([]*txpool_proto.PendingReply_Tx, 0, 32) 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 } var senderArr [20]byte