Skip to content

Commit 38783b7

Browse files
committed
core/txpool: refactor Reserver into tracker and named handles
1 parent 710bcc3 commit 38783b7

File tree

7 files changed

+89
-75
lines changed

7 files changed

+89
-75
lines changed

Diff for: core/txpool/blobpool/blobpool.go

+9-11
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,6 @@ import (
4747
)
4848

4949
const (
50-
poolName = "blobpool" // The name of legacy txpool
51-
5250
// blobSize is the protocol constrained byte size of a single blob in a
5351
// transaction. There can be multiple of these embedded into a single tx.
5452
blobSize = params.BlobTxFieldElementsPerBlob * params.BlobTxBytesPerFieldElement
@@ -503,7 +501,7 @@ func (p *BlobPool) parseTransaction(id uint64, size uint32, blob []byte) error {
503501
return err
504502
}
505503
if _, ok := p.index[sender]; !ok {
506-
if err := p.reserver.Hold(sender, poolName); err != nil {
504+
if err := p.reserver.Hold(sender); err != nil {
507505
return err
508506
}
509507
p.index[sender] = []*blobTxMeta{}
@@ -558,7 +556,7 @@ func (p *BlobPool) recheck(addr common.Address, inclusions map[common.Hash]uint6
558556
if inclusions != nil { // only during reorgs will the heap be initialized
559557
heap.Remove(p.evict, p.evict.index[addr])
560558
}
561-
p.reserver.Release(addr, poolName)
559+
p.reserver.Release(addr)
562560

563561
if gapped {
564562
log.Warn("Dropping dangling blob transactions", "from", addr, "missing", next, "drop", nonces, "ids", ids)
@@ -711,7 +709,7 @@ func (p *BlobPool) recheck(addr common.Address, inclusions map[common.Hash]uint6
711709
if inclusions != nil { // only during reorgs will the heap be initialized
712710
heap.Remove(p.evict, p.evict.index[addr])
713711
}
714-
p.reserver.Release(addr, poolName)
712+
p.reserver.Release(addr)
715713
} else {
716714
p.index[addr] = txs
717715
}
@@ -1010,7 +1008,7 @@ func (p *BlobPool) reinject(addr common.Address, txhash common.Hash) error {
10101008
// Update the indices and metrics
10111009
meta := newBlobTxMeta(id, tx.Size(), p.store.Size(id), tx)
10121010
if _, ok := p.index[addr]; !ok {
1013-
if err := p.reserver.Hold(addr, poolName); err != nil {
1011+
if err := p.reserver.Hold(addr); err != nil {
10141012
log.Warn("Failed to reserve account for blob pool", "tx", tx.Hash(), "from", addr, "err", err)
10151013
return err
10161014
}
@@ -1070,7 +1068,7 @@ func (p *BlobPool) SetGasTip(tip *big.Int) {
10701068
delete(p.spent, addr)
10711069

10721070
heap.Remove(p.evict, p.evict.index[addr])
1073-
p.reserver.Release(addr, poolName)
1071+
p.reserver.Release(addr)
10741072
}
10751073
// Clear out the transactions from the data store
10761074
log.Warn("Dropping underpriced blob transaction", "from", addr, "rejected", tx.nonce, "tip", tx.execTipCap, "want", tip, "drop", nonces, "ids", ids)
@@ -1409,7 +1407,7 @@ func (p *BlobPool) add(tx *types.Transaction) (err error) {
14091407
// only by this subpool until all transactions are evicted
14101408
from, _ := types.Sender(p.signer, tx) // already validated above
14111409
if _, ok := p.index[from]; !ok {
1412-
if err := p.reserver.Hold(from, poolName); err != nil {
1410+
if err := p.reserver.Hold(from); err != nil {
14131411
addNonExclusiveMeter.Mark(1)
14141412
return err
14151413
}
@@ -1421,7 +1419,7 @@ func (p *BlobPool) add(tx *types.Transaction) (err error) {
14211419
// by a return statement before running deferred methods. Take care with
14221420
// removing or subscoping err as it will break this clause.
14231421
if err != nil {
1424-
p.reserver.Release(from, poolName)
1422+
p.reserver.Release(from)
14251423
}
14261424
}()
14271425
}
@@ -1553,7 +1551,7 @@ func (p *BlobPool) drop() {
15531551
if last {
15541552
delete(p.index, from)
15551553
delete(p.spent, from)
1556-
p.reserver.Release(from, poolName)
1554+
p.reserver.Release(from)
15571555
} else {
15581556
txs[len(txs)-1] = nil
15591557
txs = txs[:len(txs)-1]
@@ -1829,7 +1827,7 @@ func (p *BlobPool) Clear() {
18291827
// can't happen until Clear releases the reservation lock. Clear cannot
18301828
// acquire the subpool lock until the transaction addition is completed.
18311829
for acct := range p.index {
1832-
p.reserver.Release(acct, poolName)
1830+
p.reserver.Release(acct)
18331831
}
18341832
p.lookup = newLookup()
18351833
p.index = make(map[common.Address][]*blobTxMeta)

Diff for: core/txpool/blobpool/blobpool_test.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,10 @@ func verifyBlobRetrievals(t *testing.T, pool *BlobPool) {
405405
}
406406
}
407407

408+
func newReserver() *txpool.Reserver {
409+
return txpool.NewReservationTracker().NewHandle(42)
410+
}
411+
408412
// Tests that transactions can be loaded from disk on startup and that they are
409413
// correctly discarded if invalid.
410414
//
@@ -672,7 +676,7 @@ func TestOpenDrops(t *testing.T) {
672676
statedb: statedb,
673677
}
674678
pool := New(Config{Datadir: storage}, chain, nil)
675-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
679+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
676680
t.Fatalf("failed to create blob pool: %v", err)
677681
}
678682
defer pool.Close()
@@ -790,7 +794,7 @@ func TestOpenIndex(t *testing.T) {
790794
statedb: statedb,
791795
}
792796
pool := New(Config{Datadir: storage}, chain, nil)
793-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
797+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
794798
t.Fatalf("failed to create blob pool: %v", err)
795799
}
796800
defer pool.Close()
@@ -891,7 +895,7 @@ func TestOpenHeap(t *testing.T) {
891895
statedb: statedb,
892896
}
893897
pool := New(Config{Datadir: storage}, chain, nil)
894-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
898+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
895899
t.Fatalf("failed to create blob pool: %v", err)
896900
}
897901
defer pool.Close()
@@ -970,7 +974,7 @@ func TestOpenCap(t *testing.T) {
970974
statedb: statedb,
971975
}
972976
pool := New(Config{Datadir: storage, Datacap: datacap}, chain, nil)
973-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
977+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
974978
t.Fatalf("failed to create blob pool: %v", err)
975979
}
976980
// Verify that enough transactions have been dropped to get the pool's size
@@ -1071,7 +1075,7 @@ func TestChangingSlotterSize(t *testing.T) {
10711075
statedb: statedb,
10721076
}
10731077
pool := New(Config{Datadir: storage}, chain, nil)
1074-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
1078+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
10751079
t.Fatalf("failed to create blob pool: %v", err)
10761080
}
10771081

@@ -1514,7 +1518,7 @@ func TestAdd(t *testing.T) {
15141518
statedb: statedb,
15151519
}
15161520
pool := New(Config{Datadir: storage}, chain, nil)
1517-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
1521+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
15181522
t.Fatalf("test %d: failed to create blob pool: %v", i, err)
15191523
}
15201524
verifyPoolInternals(t, pool)
@@ -1613,7 +1617,7 @@ func benchmarkPoolPending(b *testing.B, datacap uint64) {
16131617
pool = New(Config{Datadir: ""}, chain, nil)
16141618
)
16151619

1616-
if err := pool.Init(1, chain.CurrentBlock(), txpool.NewReserver()); err != nil {
1620+
if err := pool.Init(1, chain.CurrentBlock(), newReserver()); err != nil {
16171621
b.Fatalf("failed to create blob pool: %v", err)
16181622
}
16191623
// Make the pool not use disk (just drop everything). This test never reads

Diff for: core/txpool/legacypool/legacypool.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,6 @@ import (
4545
)
4646

4747
const (
48-
poolName = "general" // The name of legacy txpool
49-
5048
// txSlotSize is used to calculate how many data slots a single transaction
5149
// takes up based on its size. The slots are used as DoS protection, ensuring
5250
// that validating a new transaction remains a constant operation (in reality
@@ -693,7 +691,7 @@ func (pool *LegacyPool) add(tx *types.Transaction) (replaced bool, err error) {
693691
_, hasQueued = pool.queue[from]
694692
)
695693
if !hasPending && !hasQueued {
696-
if err := pool.reserver.Hold(from, poolName); err != nil {
694+
if err := pool.reserver.Hold(from); err != nil {
697695
return false, err
698696
}
699697
defer func() {
@@ -704,7 +702,7 @@ func (pool *LegacyPool) add(tx *types.Transaction) (replaced bool, err error) {
704702
// by a return statement before running deferred methods. Take care with
705703
// removing or subscoping err as it will break this clause.
706704
if err != nil {
707-
pool.reserver.Release(from, poolName)
705+
pool.reserver.Release(from)
708706
}
709707
}()
710708
}
@@ -1097,7 +1095,7 @@ func (pool *LegacyPool) removeTx(hash common.Hash, outofbound bool, unreserve bo
10971095
_, hasQueued = pool.queue[addr]
10981096
)
10991097
if !hasPending && !hasQueued {
1100-
pool.reserver.Release(addr, poolName)
1098+
pool.reserver.Release(addr)
11011099
}
11021100
}()
11031101
}
@@ -1477,7 +1475,7 @@ func (pool *LegacyPool) promoteExecutables(accounts []common.Address) []*types.T
14771475
delete(pool.queue, addr)
14781476
delete(pool.beats, addr)
14791477
if _, ok := pool.pending[addr]; !ok {
1480-
pool.reserver.Release(addr, poolName)
1478+
pool.reserver.Release(addr)
14811479
}
14821480
}
14831481
}
@@ -1663,7 +1661,7 @@ func (pool *LegacyPool) demoteUnexecutables() {
16631661
if list.Empty() {
16641662
delete(pool.pending, addr)
16651663
if _, ok := pool.queue[addr]; !ok {
1666-
pool.reserver.Release(addr, poolName)
1664+
pool.reserver.Release(addr)
16671665
}
16681666
}
16691667
}
@@ -1908,7 +1906,7 @@ func (pool *LegacyPool) Clear() {
19081906
// acquire the subpool lock until the transaction addition is completed.
19091907
for _, tx := range pool.all.txs {
19101908
senderAddr, _ := types.Sender(pool.signer, tx)
1911-
pool.reserver.Release(senderAddr, poolName)
1909+
pool.reserver.Release(senderAddr)
19121910
}
19131911
pool.all = newLookup()
19141912
pool.priced = newPricedList(pool.all)

Diff for: core/txpool/legacypool/legacypool2_test.go

+4-5
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import (
2424
"github.com/ethereum/go-ethereum/common"
2525
"github.com/ethereum/go-ethereum/core/state"
2626
"github.com/ethereum/go-ethereum/core/tracing"
27-
"github.com/ethereum/go-ethereum/core/txpool"
2827
"github.com/ethereum/go-ethereum/core/types"
2928
"github.com/ethereum/go-ethereum/crypto"
3029
"github.com/ethereum/go-ethereum/event"
@@ -87,7 +86,7 @@ func TestTransactionFutureAttack(t *testing.T) {
8786
config.GlobalQueue = 100
8887
config.GlobalSlots = 100
8988
pool := New(config, blockchain)
90-
pool.Init(config.PriceLimit, blockchain.CurrentBlock(), txpool.NewReserver())
89+
pool.Init(config.PriceLimit, blockchain.CurrentBlock(), newReserver())
9190
defer pool.Close()
9291
fillPool(t, pool)
9392
pending, _ := pool.Stats()
@@ -121,7 +120,7 @@ func TestTransactionFuture1559(t *testing.T) {
121120
statedb, _ := state.New(types.EmptyRootHash, state.NewDatabaseForTesting())
122121
blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed))
123122
pool := New(testTxPoolConfig, blockchain)
124-
pool.Init(testTxPoolConfig.PriceLimit, blockchain.CurrentBlock(), txpool.NewReserver())
123+
pool.Init(testTxPoolConfig.PriceLimit, blockchain.CurrentBlock(), newReserver())
125124
defer pool.Close()
126125

127126
// Create a number of test accounts, fund them and make transactions
@@ -154,7 +153,7 @@ func TestTransactionZAttack(t *testing.T) {
154153
statedb, _ := state.New(types.EmptyRootHash, state.NewDatabaseForTesting())
155154
blockchain := newTestBlockChain(eip1559Config, 1000000, statedb, new(event.Feed))
156155
pool := New(testTxPoolConfig, blockchain)
157-
pool.Init(testTxPoolConfig.PriceLimit, blockchain.CurrentBlock(), txpool.NewReserver())
156+
pool.Init(testTxPoolConfig.PriceLimit, blockchain.CurrentBlock(), newReserver())
158157
defer pool.Close()
159158
// Create a number of test accounts, fund them and make transactions
160159
fillPool(t, pool)
@@ -225,7 +224,7 @@ func BenchmarkFutureAttack(b *testing.B) {
225224
config.GlobalQueue = 100
226225
config.GlobalSlots = 100
227226
pool := New(config, blockchain)
228-
pool.Init(testTxPoolConfig.PriceLimit, blockchain.CurrentBlock(), txpool.NewReserver())
227+
pool.Init(testTxPoolConfig.PriceLimit, blockchain.CurrentBlock(), newReserver())
229228
defer pool.Close()
230229
fillPool(b, pool)
231230

0 commit comments

Comments
 (0)