pool: refactoring, addressing comments

This commit is contained in:
emailtovamos 2024-10-15 12:50:58 +01:00
parent 0e67514ee7
commit f41bb13160
2 changed files with 9 additions and 40 deletions

@ -10,7 +10,7 @@ import (
"github.com/ethereum/go-ethereum/core/types"
)
// txHeapItem implements the Interface interface of heap so that it can be heapified
// txHeapItem implements the Interface interface (https://pkg.go.dev/container/heap#Interface) of heap so that it can be heapified
type txHeapItem struct {
tx *types.Transaction
timestamp int64 // Unix timestamp (nanoseconds) of when the transaction was added

@ -766,9 +766,6 @@ func (pool *LegacyPool) add(tx *types.Transaction, local bool) (replaced bool, e
return false, txpool.ErrAlreadyKnown
}
maxMainPoolSize := pool.config.GlobalSlots + pool.config.GlobalQueue
txPoolSizeAfterCurrentTx := uint64(pool.all.Slots() + numSlots(tx))
// Make the local flag. If it's from local source or it's from the network but
// the sender is marked as local previously, treat it as the local transaction.
isLocal := local || pool.locals.containsTx(tx)
@ -806,7 +803,7 @@ func (pool *LegacyPool) add(tx *types.Transaction, local bool) (replaced bool, e
}
// If the transaction pool is full, discard underpriced transactions
if txPoolSizeAfterCurrentTx > maxMainPoolSize {
if uint64(pool.all.Slots()+numSlots(tx)) > pool.config.GlobalSlots+pool.config.GlobalQueue {
// If the new transaction is underpriced, don't accept it
if !isLocal && pool.priced.Underpriced(tx) {
log.Trace("Discarding underpriced transaction", "hash", hash, "gasTipCap", tx.GasTipCap(), "gasFeeCap", tx.GasFeeCap())
@ -826,8 +823,7 @@ func (pool *LegacyPool) add(tx *types.Transaction, local bool) (replaced bool, e
// New transaction is better than our worse ones, make room for it.
// If it's a local transaction, forcibly discard all available transactions.
// Otherwise if we can't make enough room for new one, abort the operation.
toBeDiscarded := pool.all.Slots() - int(pool.config.GlobalSlots+pool.config.GlobalQueue) + numSlots(tx)
drop, success := pool.priced.Discard(toBeDiscarded, isLocal)
drop, success := pool.priced.Discard(pool.all.Slots()-int(pool.config.GlobalSlots+pool.config.GlobalQueue)+numSlots(tx), isLocal)
// Special case, we still can't make the room for the new remote one.
if !isLocal && !success {
@ -1727,8 +1723,7 @@ func (pool *LegacyPool) truncateQueue() {
for _, list := range pool.queue {
queued += uint64(list.Len())
}
queueMax := pool.config.GlobalQueue
if queued <= queueMax {
if queued <= pool.config.GlobalQueue {
return
}
@ -1742,7 +1737,7 @@ func (pool *LegacyPool) truncateQueue() {
sort.Sort(sort.Reverse(addresses))
// Drop transactions until the total is below the limit or only locals remain
for drop := queued - queueMax; drop > 0 && len(addresses) > 0; {
for drop := queued - pool.config.GlobalQueue; drop > 0 && len(addresses) > 0; {
addr := addresses[len(addresses)-1]
list := pool.queue[addr.address]
@ -2097,27 +2092,6 @@ func numSlots(tx *types.Transaction) int {
return int((tx.Size() + txSlotSize - 1) / txSlotSize)
}
func (pool *LegacyPool) startPeriodicTransfer(t time.Duration) {
ticker := time.NewTicker(time.Minute) // Adjust the interval as needed
if t != 0 {
ticker.Reset(t)
}
go func() {
for {
select {
case <-ticker.C:
pool.mu.Lock()
pool.transferTransactions()
pool.mu.Unlock()
case <-pool.reorgShutdownCh:
ticker.Stop()
return
}
}
}()
}
// transferTransactions mainly moves from OverflowPool to MainPool
func (pool *LegacyPool) transferTransactions() {
maxMainPoolSize := int(pool.config.GlobalSlots + pool.config.GlobalQueue)
@ -2133,19 +2107,14 @@ func (pool *LegacyPool) transferTransactions() {
}
extraSlots := maxMainPoolSize - currentMainPoolSize
extraTransactions := (extraSlots + 3) / 4 // Since maximum slots per transaction is 4
// So now we can take out extraTransactions number of transactions from OverflowPool and put in MainPool
if extraTransactions < 1 {
return
}
log.Debug("Will attempt to transfer from OverflowPool to MainPool", "transactions", extraTransactions)
tx := pool.localBufferPool.Flush(extraTransactions)
if len(tx) == 0 {
txs := pool.localBufferPool.Flush(extraTransactions)
if len(txs) == 0 {
return
}
pool.Add(tx, true, false)
pool.Add(txs, true, false)
}
func (pool *LegacyPool) availableSlotsOverflowPool() int {
@ -2157,7 +2126,7 @@ func (pool *LegacyPool) availableSlotsOverflowPool() int {
return 0
}
func (pool *LegacyPool) printTxStats() {
func (pool *LegacyPool) PrintTxStats() {
for _, l := range pool.pending {
for _, transaction := range l.txs.items {
from, _ := types.Sender(pool.signer, transaction)