core: smaller txpool status locking (#20080)

* txpool: smaller lock portion

* core/tx_pool: fix data race
This commit is contained in:
Martin Holst Swende 2019-09-17 09:34:28 +02:00 committed by Péter Szilágyi
parent 8bd64f4a1c
commit 8d41e885e6

View File

@ -803,19 +803,22 @@ func (pool *TxPool) addTxsLocked(txs []*types.Transaction, local bool) ([]error,
// Status returns the status (unknown/pending/queued) of a batch of transactions // Status returns the status (unknown/pending/queued) of a batch of transactions
// identified by their hashes. // identified by their hashes.
func (pool *TxPool) Status(hashes []common.Hash) []TxStatus { func (pool *TxPool) Status(hashes []common.Hash) []TxStatus {
pool.mu.RLock()
defer pool.mu.RUnlock()
status := make([]TxStatus, len(hashes)) status := make([]TxStatus, len(hashes))
for i, hash := range hashes { for i, hash := range hashes {
if tx := pool.all.Get(hash); tx != nil { tx := pool.Get(hash)
if tx == nil {
continue
}
from, _ := types.Sender(pool.signer, tx) // already validated from, _ := types.Sender(pool.signer, tx) // already validated
if pool.pending[from] != nil && pool.pending[from].txs.items[tx.Nonce()] != nil { pool.mu.RLock()
if txList := pool.pending[from]; txList != nil && txList.txs.items[tx.Nonce()] != nil {
status[i] = TxStatusPending status[i] = TxStatusPending
} else { } else if txList := pool.queue[from]; txList != nil && txList.txs.items[tx.Nonce()] != nil {
status[i] = TxStatusQueued status[i] = TxStatusQueued
} }
} // implicit else: the tx may have been included into a block between
// checking pool.Get and obtaining the lock. In that case, TxStatusUnknown is correct
pool.mu.RUnlock()
} }
return status return status
} }