aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorobscuren <geffobscura@gmail.com>2015-04-30 06:20:59 +0800
committerobscuren <geffobscura@gmail.com>2015-04-30 06:20:59 +0800
commit88292f35db656fe0677a3d7cf9be3a78f507699d (patch)
treea5f5fd0ebcc01453d0f7e64a84881bd0753a53e1
parent2590a7dabbf6781734be0c388b46ecd53ece6155 (diff)
downloadgo-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.go23
-rw-r--r--core/transaction_pool_test.go27
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))
+ }
+}