@@ -415,6 +415,22 @@ func (pool *TxPool) reset(oldHead, newHead *types.Header) {
415
415
rem = pool .chain .GetBlock (oldHead .Hash (), oldHead .Number .Uint64 ())
416
416
add = pool .chain .GetBlock (newHead .Hash (), newHead .Number .Uint64 ())
417
417
)
418
+ if rem == nil {
419
+ // This can happen if a setHead is performed, where we simply discard the old
420
+ // head from the chain.
421
+ // If that is the case, we don't have the lost transactions any more, and
422
+ // there's nothing to add
423
+ if newNum < oldNum {
424
+ // If the reorg ended up on a lower number, it's indicative of setHead being the cause
425
+ log .Debug ("Skipping transaction reset caused by setHead" ,
426
+ "old" , oldHead .Hash (), "oldnum" , oldNum , "new" , newHead .Hash (), "newnum" , newNum )
427
+ } else {
428
+ // If we reorged to a same or higher number, then it's not a case of setHead
429
+ log .Warn ("Transaction pool reset with missing oldhead" ,
430
+ "old" , oldHead .Hash (), "oldnum" , oldNum , "new" , newHead .Hash (), "newnum" , newNum )
431
+ }
432
+ return
433
+ }
418
434
for rem .NumberU64 () > add .NumberU64 () {
419
435
discarded = append (discarded , rem .Transactions ()... )
420
436
if rem = pool .chain .GetBlock (rem .ParentHash (), rem .NumberU64 ()- 1 ); rem == nil {
0 commit comments