diff --git a/substrate/client/transaction-pool/src/revalidation.rs b/substrate/client/transaction-pool/src/revalidation.rs index b915f1fe71..4b3f9955ca 100644 --- a/substrate/client/transaction-pool/src/revalidation.rs +++ b/substrate/client/transaction-pool/src/revalidation.rs @@ -151,7 +151,6 @@ impl RevalidationWorker { } else { for xt in &to_queue { extrinsics.remove(xt); - self.members.remove(xt); } } left -= to_queue.len(); @@ -163,6 +162,10 @@ impl RevalidationWorker { } } + for hash in queued_exts.iter() { + self.members.remove(hash); + } + queued_exts } diff --git a/substrate/client/transaction-pool/src/testing/pool.rs b/substrate/client/transaction-pool/src/testing/pool.rs index d9f54ede94..7494ba2684 100644 --- a/substrate/client/transaction-pool/src/testing/pool.rs +++ b/substrate/client/transaction-pool/src/testing/pool.rs @@ -295,6 +295,36 @@ fn should_revalidate_transaction_multiple_times() { assert_eq!(pool.status().ready, 0); } +#[test] +fn should_revalidate_across_many_blocks() { + let xt1 = uxt(Alice, 209); + let xt2 = uxt(Alice, 210); + let xt3 = uxt(Alice, 211); + + let (pool, _guard) = maintained_pool(); + + block_on(pool.submit_one(&BlockId::number(1), xt1.clone())).expect("1. Imported"); + block_on(pool.submit_one(&BlockId::number(1), xt2.clone())).expect("1. Imported"); + assert_eq!(pool.status().ready, 2); + + pool.api.push_block(1, vec![]); + block_on(pool.maintain(block_event(1))); + block_on(futures_timer::Delay::new(BACKGROUND_REVALIDATION_INTERVAL*2)); + + + block_on(pool.submit_one(&BlockId::number(2), xt3.clone())).expect("1. Imported"); + assert_eq!(pool.status().ready, 3); + + pool.api.push_block(2, vec![xt1.clone()]); + block_on(pool.maintain(block_event(2))); + block_on(futures_timer::Delay::new(BACKGROUND_REVALIDATION_INTERVAL*2)); + + assert_eq!(pool.status().ready, 2); + // xt1 and xt2 validated twice, then xt3 once, then xt2 and xt3 again + assert_eq!(pool.api.validation_requests().len(), 7); +} + + #[test] fn should_push_watchers_during_maintaince() { fn alice_uxt(nonce: u64) -> Extrinsic {