core/txpool: remove "local" notion from the txpool price heap (#21478)
* core: separate the local notion from the pricedHeap * core: add benchmarks * core: improve tests * core: address comments * core: degrade the panic to error message * core: fix typo * core: address comments * core: address comment * core: use PEAK instead of POP * core: address comments
This commit is contained in:
		@@ -107,10 +107,11 @@ func validateTxPoolInternals(pool *TxPool) error {
 | 
			
		||||
	if total := pool.all.Count(); total != pending+queued {
 | 
			
		||||
		return fmt.Errorf("total transaction count %d != %d pending + %d queued", total, pending, queued)
 | 
			
		||||
	}
 | 
			
		||||
	if priced := pool.priced.items.Len() - pool.priced.stales; priced != pending+queued {
 | 
			
		||||
		return fmt.Errorf("total priced transaction count %d != %d pending + %d queued", priced, pending, queued)
 | 
			
		||||
	pool.priced.Reheap()
 | 
			
		||||
	priced, remote := pool.priced.remotes.Len(), pool.all.RemoteCount()
 | 
			
		||||
	if priced != remote {
 | 
			
		||||
		return fmt.Errorf("total priced transaction count %d != %d", priced, remote)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Ensure the next nonce to assign is the correct one
 | 
			
		||||
	for addr, txs := range pool.pending {
 | 
			
		||||
		// Find the last transaction
 | 
			
		||||
@@ -280,7 +281,7 @@ func TestTransactionQueue(t *testing.T) {
 | 
			
		||||
	pool.currentState.AddBalance(from, big.NewInt(1000))
 | 
			
		||||
	<-pool.requestReset(nil, nil)
 | 
			
		||||
 | 
			
		||||
	pool.enqueueTx(tx.Hash(), tx)
 | 
			
		||||
	pool.enqueueTx(tx.Hash(), tx, false, true)
 | 
			
		||||
	<-pool.requestPromoteExecutables(newAccountSet(pool.signer, from))
 | 
			
		||||
	if len(pool.pending) != 1 {
 | 
			
		||||
		t.Error("expected valid txs to be 1 is", len(pool.pending))
 | 
			
		||||
@@ -289,7 +290,7 @@ func TestTransactionQueue(t *testing.T) {
 | 
			
		||||
	tx = transaction(1, 100, key)
 | 
			
		||||
	from, _ = deriveSender(tx)
 | 
			
		||||
	pool.currentState.SetNonce(from, 2)
 | 
			
		||||
	pool.enqueueTx(tx.Hash(), tx)
 | 
			
		||||
	pool.enqueueTx(tx.Hash(), tx, false, true)
 | 
			
		||||
 | 
			
		||||
	<-pool.requestPromoteExecutables(newAccountSet(pool.signer, from))
 | 
			
		||||
	if _, ok := pool.pending[from].txs.items[tx.Nonce()]; ok {
 | 
			
		||||
@@ -313,9 +314,9 @@ func TestTransactionQueue2(t *testing.T) {
 | 
			
		||||
	pool.currentState.AddBalance(from, big.NewInt(1000))
 | 
			
		||||
	pool.reset(nil, nil)
 | 
			
		||||
 | 
			
		||||
	pool.enqueueTx(tx1.Hash(), tx1)
 | 
			
		||||
	pool.enqueueTx(tx2.Hash(), tx2)
 | 
			
		||||
	pool.enqueueTx(tx3.Hash(), tx3)
 | 
			
		||||
	pool.enqueueTx(tx1.Hash(), tx1, false, true)
 | 
			
		||||
	pool.enqueueTx(tx2.Hash(), tx2, false, true)
 | 
			
		||||
	pool.enqueueTx(tx3.Hash(), tx3, false, true)
 | 
			
		||||
 | 
			
		||||
	pool.promoteExecutables([]common.Address{from})
 | 
			
		||||
	if len(pool.pending) != 1 {
 | 
			
		||||
@@ -488,12 +489,21 @@ func TestTransactionDropping(t *testing.T) {
 | 
			
		||||
		tx11 = transaction(11, 200, key)
 | 
			
		||||
		tx12 = transaction(12, 300, key)
 | 
			
		||||
	)
 | 
			
		||||
	pool.all.Add(tx0, false)
 | 
			
		||||
	pool.priced.Put(tx0, false)
 | 
			
		||||
	pool.promoteTx(account, tx0.Hash(), tx0)
 | 
			
		||||
 | 
			
		||||
	pool.all.Add(tx1, false)
 | 
			
		||||
	pool.priced.Put(tx1, false)
 | 
			
		||||
	pool.promoteTx(account, tx1.Hash(), tx1)
 | 
			
		||||
 | 
			
		||||
	pool.all.Add(tx2, false)
 | 
			
		||||
	pool.priced.Put(tx2, false)
 | 
			
		||||
	pool.promoteTx(account, tx2.Hash(), tx2)
 | 
			
		||||
	pool.enqueueTx(tx10.Hash(), tx10)
 | 
			
		||||
	pool.enqueueTx(tx11.Hash(), tx11)
 | 
			
		||||
	pool.enqueueTx(tx12.Hash(), tx12)
 | 
			
		||||
 | 
			
		||||
	pool.enqueueTx(tx10.Hash(), tx10, false, true)
 | 
			
		||||
	pool.enqueueTx(tx11.Hash(), tx11, false, true)
 | 
			
		||||
	pool.enqueueTx(tx12.Hash(), tx12, false, true)
 | 
			
		||||
 | 
			
		||||
	// Check that pre and post validations leave the pool as is
 | 
			
		||||
	if pool.pending[account].Len() != 3 {
 | 
			
		||||
@@ -1964,7 +1974,7 @@ func benchmarkFuturePromotion(b *testing.B, size int) {
 | 
			
		||||
 | 
			
		||||
	for i := 0; i < size; i++ {
 | 
			
		||||
		tx := transaction(uint64(1+i), 100000, key)
 | 
			
		||||
		pool.enqueueTx(tx.Hash(), tx)
 | 
			
		||||
		pool.enqueueTx(tx.Hash(), tx, false, true)
 | 
			
		||||
	}
 | 
			
		||||
	// Benchmark the speed of pool validation
 | 
			
		||||
	b.ResetTimer()
 | 
			
		||||
@@ -2007,3 +2017,38 @@ func benchmarkPoolBatchInsert(b *testing.B, size int, local bool) {
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func BenchmarkInsertRemoteWithAllLocals(b *testing.B) {
 | 
			
		||||
	// Allocate keys for testing
 | 
			
		||||
	key, _ := crypto.GenerateKey()
 | 
			
		||||
	account := crypto.PubkeyToAddress(key.PublicKey)
 | 
			
		||||
 | 
			
		||||
	remoteKey, _ := crypto.GenerateKey()
 | 
			
		||||
	remoteAddr := crypto.PubkeyToAddress(remoteKey.PublicKey)
 | 
			
		||||
 | 
			
		||||
	locals := make([]*types.Transaction, 4096+1024) // Occupy all slots
 | 
			
		||||
	for i := 0; i < len(locals); i++ {
 | 
			
		||||
		locals[i] = transaction(uint64(i), 100000, key)
 | 
			
		||||
	}
 | 
			
		||||
	remotes := make([]*types.Transaction, 1000)
 | 
			
		||||
	for i := 0; i < len(remotes); i++ {
 | 
			
		||||
		remotes[i] = pricedTransaction(uint64(i), 100000, big.NewInt(2), remoteKey) // Higher gasprice
 | 
			
		||||
	}
 | 
			
		||||
	// Benchmark importing the transactions into the queue
 | 
			
		||||
	b.ResetTimer()
 | 
			
		||||
	for i := 0; i < b.N; i++ {
 | 
			
		||||
		b.StopTimer()
 | 
			
		||||
		pool, _ := setupTxPool()
 | 
			
		||||
		pool.currentState.AddBalance(account, big.NewInt(100000000))
 | 
			
		||||
		for _, local := range locals {
 | 
			
		||||
			pool.AddLocal(local)
 | 
			
		||||
		}
 | 
			
		||||
		b.StartTimer()
 | 
			
		||||
		// Assign a high enough balance for testing
 | 
			
		||||
		pool.currentState.AddBalance(remoteAddr, big.NewInt(100000000))
 | 
			
		||||
		for i := 0; i < len(remotes); i++ {
 | 
			
		||||
			pool.AddRemotes([]*types.Transaction{remotes[i]})
 | 
			
		||||
		}
 | 
			
		||||
		pool.Stop()
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user