diff --git a/Cargo.lock b/Cargo.lock index e783abc88d0..2caf0078983 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6060,6 +6060,7 @@ name = "solana-core" version = "2.1.0" dependencies = [ "ahash 0.8.10", + "arrayvec", "assert_matches", "base64 0.22.1", "bincode", diff --git a/Cargo.toml b/Cargo.toml index 8f96b3da135..e3398490769 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -157,6 +157,7 @@ ark-ff = "0.4.0" ark-serialize = "0.4.0" array-bytes = "=1.4.1" arrayref = "0.3.7" +arrayvec = "0.7.4" assert_cmd = "2.0" assert_matches = "1.5.0" async-channel = "1.9.0" diff --git a/core/Cargo.toml b/core/Cargo.toml index 09aaa981310..287cea0dc8e 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -15,6 +15,7 @@ codecov = { repository = "solana-labs/solana", branch = "master", service = "git [dependencies] ahash = { workspace = true } +arrayvec = { workspace = true } base64 = { workspace = true } bincode = { workspace = true } bs58 = { workspace = true } diff --git a/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs b/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs index 20462a2a1b4..b84af5a902c 100644 --- a/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs +++ b/core/src/banking_stage/transaction_scheduler/scheduler_controller.rs @@ -21,6 +21,7 @@ use { packet_deserializer::PacketDeserializer, ForwardOption, TOTAL_BUFFERED_PACKETS, }, + arrayvec::ArrayVec, crossbeam_channel::RecvTimeoutError, solana_compute_budget::compute_budget_processor::process_compute_budget_instructions, solana_cost_model::cost_model::CostModel, @@ -479,14 +480,14 @@ impl SchedulerController { const CHUNK_SIZE: usize = 128; let lock_results: [_; CHUNK_SIZE] = core::array::from_fn(|_| Ok(())); + + let mut arc_packets = ArrayVec::<_, CHUNK_SIZE>::new(); + let mut transactions = ArrayVec::<_, CHUNK_SIZE>::new(); + let mut fee_budget_limits_vec = ArrayVec::<_, CHUNK_SIZE>::new(); + let mut error_counts = TransactionErrorMetrics::default(); for chunk in packets.chunks(CHUNK_SIZE) { let mut post_sanitization_count: usize = 0; - - let mut arc_packets = Vec::with_capacity(chunk.len()); - let mut transactions = Vec::with_capacity(chunk.len()); - let mut fee_budget_limits_vec = Vec::with_capacity(chunk.len()); - chunk .iter() .filter_map(|packet| { @@ -528,10 +529,10 @@ impl SchedulerController { let mut post_transaction_check_count: usize = 0; let mut num_dropped_on_capacity: usize = 0; let mut num_buffered: usize = 0; - for (((packet, transaction), fee_budget_limits), _) in arc_packets - .into_iter() - .zip(transactions) - .zip(fee_budget_limits_vec) + for (((packet, transaction), fee_budget_limits), _check_result) in arc_packets + .drain(..) + .zip(transactions.drain(..)) + .zip(fee_budget_limits_vec.drain(..)) .zip(check_results) .filter(|(_, check_result)| check_result.is_ok()) { diff --git a/programs/sbf/Cargo.lock b/programs/sbf/Cargo.lock index 9b0d2ca154d..f34296cfd69 100644 --- a/programs/sbf/Cargo.lock +++ b/programs/sbf/Cargo.lock @@ -4832,6 +4832,7 @@ name = "solana-core" version = "2.1.0" dependencies = [ "ahash 0.8.10", + "arrayvec", "base64 0.22.1", "bincode", "bs58",