|
|
@ -1669,6 +1669,23 @@ func (p *BlobPool) Clear() { |
|
|
|
log.Warn("failed to delete blob tx from backing store", "err", err) |
|
|
|
log.Warn("failed to delete blob tx from backing store", "err", err) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// unreserve each tracked account. Ideally, we could just clear the
|
|
|
|
|
|
|
|
// reservation map in the parent txpool context. However, if we clear in
|
|
|
|
|
|
|
|
// parent context, to avoid exposing the subpool lock, we have to lock the
|
|
|
|
|
|
|
|
// reservations and then lock each subpool.
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// This creates the potential for a deadlock situation:
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// * TxPool.Clear locks the reservations
|
|
|
|
|
|
|
|
// * a new transaction is received which locks the subpool mutex
|
|
|
|
|
|
|
|
// * TxPool.Clear attempts to lock subpool mutex
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
// The transaction addition may attempt to reserve the sender addr which
|
|
|
|
|
|
|
|
// can't happen until Clear releases the reservation lock. Clear cannot
|
|
|
|
|
|
|
|
// acquire the subpool lock until the transaction addition is completed.
|
|
|
|
|
|
|
|
for acct, _ := range p.index { |
|
|
|
|
|
|
|
p.reserve(acct, false) |
|
|
|
|
|
|
|
} |
|
|
|
p.lookup = make(map[common.Hash]uint64) |
|
|
|
p.lookup = make(map[common.Hash]uint64) |
|
|
|
p.index = make(map[common.Address][]*blobTxMeta) |
|
|
|
p.index = make(map[common.Address][]*blobTxMeta) |
|
|
|
p.spent = make(map[common.Address]*uint256.Int) |
|
|
|
p.spent = make(map[common.Address]*uint256.Int) |
|
|
|