aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Holst Swende <martin@swende.se>2019-03-21 18:42:56 +0800
committerMartin Holst Swende <martin@swende.se>2019-03-21 18:42:56 +0800
commit650ad19c2d3679c8ab8601f6772bee690293b30c (patch)
treead569efc4326c21974ad073c50baa3b9ec5054d3
parentbaded64d8819ece2bb715bf707882017dca03ae4 (diff)
downloadgo-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.tar
go-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.tar.gz
go-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.tar.bz2
go-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.tar.lz
go-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.tar.xz
go-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.tar.zst
go-tangerine-650ad19c2d3679c8ab8601f6772bee690293b30c.zip
core: make txpool handle reorg due to setHead
-rw-r--r--core/tx_pool.go17
1 files changed, 16 insertions, 1 deletions
diff --git a/core/tx_pool.go b/core/tx_pool.go
index 552d3692b..305dfcc22 100644
--- a/core/tx_pool.go
+++ b/core/tx_pool.go
@@ -387,11 +387,26 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) {
} else {
// Reorg seems shallow enough to pull in all transactions into memory
var discarded, included types.Transactions
-
var (
rem = pool.chain.GetBlock(oldHead.Hash(), oldHead.Number.Uint64())
add = pool.chain.GetBlock(newHead.Hash(), newHead.Number.Uint64())
)
+ if rem == nil {
+ // This can happen if a setHead is performed, where we simply discard the old
+ // head from the chain.
+ // If that is the case, we don't have the lost transactions any more, and
+ // there's nothing to add
+ if newNum < oldNum {
+ // If the reorg ended up on a lower number, it's indicative of setHead being the cause
+ log.Debug("Skipping transaction reset caused by setHead",
+ "old", oldHead.Hash(), "oldnum", oldNum, "new", newHead.Hash(), "newnum", newNum)
+ } else {
+ // If we reorged to a same or higher number, then it's not a case of setHead
+ log.Warn("Transaction pool reset with missing oldhead",
+ "old", oldHead.Hash(), "oldnum", oldNum, "new", newHead.Hash(), "newnum", newNum)
+ }
+ return
+ }
for rem.NumberU64() > add.NumberU64() {
discarded = append(discarded, rem.Transactions()...)
if rem = pool.chain.GetBlock(rem.ParentHash(), rem.NumberU64()-1); rem == nil {