core: pending txs now re-validated once every second

This commit is contained in:
obscuren 2015-04-23 11:09:58 +02:00
parent 48135657c4
commit 7f14fbd579
1 changed files with 27 additions and 3 deletions

View File

@ -77,12 +77,18 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn) *TxPool {
}
func (pool *TxPool) Start() {
ticker := time.NewTicker(300 * time.Millisecond)
// Queue timer will tick so we can attempt to move items from the queue to the
// main transaction pool.
queueTimer := time.NewTicker(300 * time.Millisecond)
// Removal timer will tick and attempt to remove bad transactions (account.nonce>tx.nonce)
removalTimer := time.NewTicker(1 * time.Second)
done:
for {
select {
case <-ticker.C:
case <-queueTimer.C:
pool.checkQueue()
case <-removalTimer.C:
pool.validatePool()
case <-pool.quit:
break done
}
@ -253,11 +259,12 @@ func (pool *TxPool) checkQueue() {
pool.mu.Lock()
defer pool.mu.Unlock()
statedb := pool.currentState()
for address, txs := range pool.queue {
sort.Sort(types.TxByNonce{txs})
var (
nonce = pool.currentState().GetNonce(address)
nonce = statedb.GetNonce(address)
start int
)
// Clean up the transactions first and determine the start of the nonces
@ -288,3 +295,20 @@ func (pool *TxPool) checkQueue() {
}
}
}
func (pool *TxPool) validatePool() {
pool.mu.Lock()
defer pool.mu.Unlock()
statedb := pool.currentState()
for hash, tx := range pool.txs {
from, _ := tx.From()
if nonce := statedb.GetNonce(from); nonce > tx.Nonce() {
if glog.V(logger.Debug) {
glog.Infof("removed tx (%x) from pool due to nonce error. state=%d tx=%d\n", hash[:4], nonce, tx.Nonce())
}
delete(pool.txs, hash)
}
}
}