diff options
author | obscuren <geffobscura@gmail.com> | 2015-04-30 06:20:59 +0800 |
---|---|---|
committer | obscuren <geffobscura@gmail.com> | 2015-04-30 06:20:59 +0800 |
commit | 88292f35db656fe0677a3d7cf9be3a78f507699d (patch) | |
tree | a5f5fd0ebcc01453d0f7e64a84881bd0753a53e1 | |
parent | 2590a7dabbf6781734be0c388b46ecd53ece6155 (diff) | |
download | go-tangerine-88292f35db656fe0677a3d7cf9be3a78f507699d.tar.gz go-tangerine-88292f35db656fe0677a3d7cf9be3a78f507699d.tar.zst go-tangerine-88292f35db656fe0677a3d7cf9be3a78f507699d.zip |
core: remove txs from queue in addition to removal of pending
-rw-r--r-- | core/transaction_pool.go | 23 | ||||
-rw-r--r-- | core/transaction_pool_test.go | 27 |
2 files changed, 49 insertions, 1 deletions
diff --git a/core/transaction_pool.go b/core/transaction_pool.go index 8543aa017..22a804e1d 100644 --- a/core/transaction_pool.go +++ b/core/transaction_pool.go @@ -306,6 +306,27 @@ func (pool *TxPool) checkQueue() { } } +func (pool *TxPool) removeTx(hash common.Hash) { + // delete from pending pool + delete(pool.txs, hash) + + // delete from queue +out: + for address, txs := range pool.queue { + for i, tx := range txs { + if tx.Hash() == hash { + if len(txs) == 1 { + // if only one tx, remove entire address entry + delete(pool.queue, address) + } else { + pool.queue[address][len(txs)-1], pool.queue[address] = nil, append(txs[:i], txs[i+1:]...) + } + break out + } + } + } +} + func (pool *TxPool) validatePool() { pool.mu.Lock() defer pool.mu.Unlock() @@ -316,7 +337,7 @@ func (pool *TxPool) validatePool() { glog.Infof("removed tx (%x) from pool: %v\n", hash[:4], err) } - delete(pool.txs, hash) + pool.removeTx(hash) } } } diff --git a/core/transaction_pool_test.go b/core/transaction_pool_test.go index 4d66776f0..49224be5b 100644 --- a/core/transaction_pool_test.go +++ b/core/transaction_pool_test.go @@ -111,3 +111,30 @@ func TestTransactionQueue(t *testing.T) { t.Error("expected transaction queue to be empty. is", len(pool.queue[from])) } } + +func TestRemoveTx(t *testing.T) { + pool, key := setupTxPool() + tx := transaction() + tx.SignECDSA(key) + from, _ := tx.From() + pool.currentState().AddBalance(from, big.NewInt(1)) + pool.queueTx(tx) + pool.addTx(tx) + if len(pool.queue) != 1 { + t.Error("expected queue to be 1, got", len(pool.queue)) + } + + if len(pool.txs) != 1 { + t.Error("expected txs to be 1, got", len(pool.txs)) + } + + pool.removeTx(tx.Hash()) + + if len(pool.queue) > 0 { + t.Error("expected queue to be 0, got", len(pool.queue)) + } + + if len(pool.txs) > 0 { + t.Error("expected txs to be 0, got", len(pool.txs)) + } +} |