core: pending txs now re-validated once every second
This commit is contained in:
parent
48135657c4
commit
7f14fbd579
|
@ -77,12 +77,18 @@ func NewTxPool(eventMux *event.TypeMux, currentStateFn stateFn) *TxPool {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (pool *TxPool) Start() {
|
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:
|
done:
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
case <-ticker.C:
|
case <-queueTimer.C:
|
||||||
pool.checkQueue()
|
pool.checkQueue()
|
||||||
|
case <-removalTimer.C:
|
||||||
|
pool.validatePool()
|
||||||
case <-pool.quit:
|
case <-pool.quit:
|
||||||
break done
|
break done
|
||||||
}
|
}
|
||||||
|
@ -253,11 +259,12 @@ func (pool *TxPool) checkQueue() {
|
||||||
pool.mu.Lock()
|
pool.mu.Lock()
|
||||||
defer pool.mu.Unlock()
|
defer pool.mu.Unlock()
|
||||||
|
|
||||||
|
statedb := pool.currentState()
|
||||||
for address, txs := range pool.queue {
|
for address, txs := range pool.queue {
|
||||||
sort.Sort(types.TxByNonce{txs})
|
sort.Sort(types.TxByNonce{txs})
|
||||||
|
|
||||||
var (
|
var (
|
||||||
nonce = pool.currentState().GetNonce(address)
|
nonce = statedb.GetNonce(address)
|
||||||
start int
|
start int
|
||||||
)
|
)
|
||||||
// Clean up the transactions first and determine the start of the nonces
|
// 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue