mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-13 03:31:10 +00:00
Fix quadratic iterations in transaction pool ready set (#6256)
* refactor ready set size calc * Update client/transaction-pool/graph/src/ready.rs Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * remove pub * update to new variat * rename Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
@@ -25,15 +25,17 @@ use std::{
|
||||
|
||||
use serde::Serialize;
|
||||
use log::trace;
|
||||
use parking_lot::RwLock;
|
||||
use sp_runtime::traits::Member;
|
||||
use sp_runtime::transaction_validity::{
|
||||
TransactionTag as Tag,
|
||||
};
|
||||
use sp_transaction_pool::error;
|
||||
|
||||
use crate::future::WaitingTransaction;
|
||||
use crate::base_pool::Transaction;
|
||||
use crate::{
|
||||
base_pool::Transaction,
|
||||
future::WaitingTransaction,
|
||||
tracked_map::{self, ReadOnlyTrackedMap, TrackedMap},
|
||||
};
|
||||
|
||||
/// An in-pool transaction reference.
|
||||
///
|
||||
@@ -113,11 +115,17 @@ pub struct ReadyTransactions<Hash: hash::Hash + Eq, Ex> {
|
||||
/// tags that are provided by Ready transactions
|
||||
provided_tags: HashMap<Tag, Hash>,
|
||||
/// Transactions that are ready (i.e. don't have any requirements external to the pool)
|
||||
ready: Arc<RwLock<HashMap<Hash, ReadyTx<Hash, Ex>>>>,
|
||||
ready: TrackedMap<Hash, ReadyTx<Hash, Ex>>,
|
||||
/// Best transactions that are ready to be included to the block without any other previous transaction.
|
||||
best: BTreeSet<TransactionRef<Hash, Ex>>,
|
||||
}
|
||||
|
||||
impl<Hash, Ex> tracked_map::Size for ReadyTx<Hash, Ex> {
|
||||
fn size(&self) -> usize {
|
||||
self.transaction.transaction.bytes
|
||||
}
|
||||
}
|
||||
|
||||
impl<Hash: hash::Hash + Eq, Ex> Default for ReadyTransactions<Hash, Ex> {
|
||||
fn default() -> Self {
|
||||
ReadyTransactions {
|
||||
@@ -468,18 +476,18 @@ impl<Hash: hash::Hash + Member + Serialize, Ex> ReadyTransactions<Hash, Ex> {
|
||||
|
||||
/// Returns number of transactions in this queue.
|
||||
pub fn len(&self) -> usize {
|
||||
self.ready.read().len()
|
||||
self.ready.len()
|
||||
}
|
||||
|
||||
/// Returns sum of encoding lengths of all transactions in this queue.
|
||||
pub fn bytes(&self) -> usize {
|
||||
self.ready.read().values().fold(0, |acc, tx| acc + tx.transaction.transaction.bytes)
|
||||
self.ready.bytes()
|
||||
}
|
||||
}
|
||||
|
||||
/// Iterator of ready transactions ordered by priority.
|
||||
pub struct BestIterator<Hash, Ex> {
|
||||
all: Arc<RwLock<HashMap<Hash, ReadyTx<Hash, Ex>>>>,
|
||||
all: ReadOnlyTrackedMap<Hash, ReadyTx<Hash, Ex>>,
|
||||
awaiting: HashMap<Hash, (usize, TransactionRef<Hash, Ex>)>,
|
||||
best: BTreeSet<TransactionRef<Hash, Ex>>,
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user