Handle already discarded packets in gpu sigverify path (#22680)
This commit is contained in:
@ -297,7 +297,11 @@ impl ClusterInfoVoteListener {
|
||||
let mut packet_batches = packet::to_packet_batches(&votes, 1);
|
||||
|
||||
// Votes should already be filtered by this point.
|
||||
sigverify::ed25519_verify_cpu(&mut packet_batches, /*reject_non_vote=*/ false);
|
||||
sigverify::ed25519_verify_cpu(
|
||||
&mut packet_batches,
|
||||
/*reject_non_vote=*/ false,
|
||||
votes.len(),
|
||||
);
|
||||
let root_bank = bank_forks.read().unwrap().root_bank();
|
||||
let epoch_schedule = root_bank.epoch_schedule();
|
||||
votes
|
||||
|
@ -40,12 +40,17 @@ impl Default for TransactionSigVerifier {
|
||||
}
|
||||
|
||||
impl SigVerifier for TransactionSigVerifier {
|
||||
fn verify_batches(&self, mut batches: Vec<PacketBatch>) -> Vec<PacketBatch> {
|
||||
fn verify_batches(
|
||||
&self,
|
||||
mut batches: Vec<PacketBatch>,
|
||||
valid_packets: usize,
|
||||
) -> Vec<PacketBatch> {
|
||||
sigverify::ed25519_verify(
|
||||
&mut batches,
|
||||
&self.recycler,
|
||||
&self.recycler_out,
|
||||
self.reject_non_vote,
|
||||
valid_packets,
|
||||
);
|
||||
batches
|
||||
}
|
||||
|
@ -41,7 +41,11 @@ impl ShredSigVerifier {
|
||||
}
|
||||
|
||||
impl SigVerifier for ShredSigVerifier {
|
||||
fn verify_batches(&self, mut batches: Vec<PacketBatch>) -> Vec<PacketBatch> {
|
||||
fn verify_batches(
|
||||
&self,
|
||||
mut batches: Vec<PacketBatch>,
|
||||
_valid_packets: usize,
|
||||
) -> Vec<PacketBatch> {
|
||||
let r_bank = self.bank_forks.read().unwrap().working_bank();
|
||||
let slots: HashSet<u64> = Self::read_slots(&batches);
|
||||
let mut leader_slots: HashMap<u64, [u8; 32]> = slots
|
||||
@ -161,7 +165,8 @@ pub mod tests {
|
||||
batches[0].packets[1].data[0..shred.payload.len()].copy_from_slice(&shred.payload);
|
||||
batches[0].packets[1].meta.size = shred.payload.len();
|
||||
|
||||
let rv = verifier.verify_batches(batches);
|
||||
let num_packets = solana_perf::sigverify::count_packets_in_batches(&batches);
|
||||
let rv = verifier.verify_batches(batches, num_packets);
|
||||
assert!(!rv[0].packets[0].meta.discard());
|
||||
assert!(rv[0].packets[1].meta.discard());
|
||||
}
|
||||
|
@ -40,7 +40,7 @@ pub struct SigVerifyStage {
|
||||
}
|
||||
|
||||
pub trait SigVerifier {
|
||||
fn verify_batches(&self, batches: Vec<PacketBatch>) -> Vec<PacketBatch>;
|
||||
fn verify_batches(&self, batches: Vec<PacketBatch>, valid_packets: usize) -> Vec<PacketBatch>;
|
||||
}
|
||||
|
||||
#[derive(Default, Clone)]
|
||||
@ -171,7 +171,11 @@ impl SigVerifierStats {
|
||||
}
|
||||
|
||||
impl SigVerifier for DisabledSigVerifier {
|
||||
fn verify_batches(&self, mut batches: Vec<PacketBatch>) -> Vec<PacketBatch> {
|
||||
fn verify_batches(
|
||||
&self,
|
||||
mut batches: Vec<PacketBatch>,
|
||||
_valid_packets: usize,
|
||||
) -> Vec<PacketBatch> {
|
||||
sigverify::ed25519_verify_disabled(&mut batches);
|
||||
batches
|
||||
}
|
||||
@ -235,14 +239,16 @@ impl SigVerifyStage {
|
||||
let num_unique = num_packets.saturating_sub(dedup_fail);
|
||||
|
||||
let mut discard_time = Measure::start("sigverify_discard_time");
|
||||
let mut num_valid_packets = num_unique;
|
||||
if num_unique > MAX_SIGVERIFY_BATCH {
|
||||
Self::discard_excess_packets(&mut batches, MAX_SIGVERIFY_BATCH)
|
||||
};
|
||||
Self::discard_excess_packets(&mut batches, MAX_SIGVERIFY_BATCH);
|
||||
num_valid_packets = MAX_SIGVERIFY_BATCH;
|
||||
}
|
||||
let excess_fail = num_unique.saturating_sub(MAX_SIGVERIFY_BATCH);
|
||||
discard_time.stop();
|
||||
|
||||
let mut verify_batch_time = Measure::start("sigverify_batch_time");
|
||||
let batches = verifier.verify_batches(batches);
|
||||
let batches = verifier.verify_batches(batches, num_valid_packets);
|
||||
sendr.send(batches)?;
|
||||
verify_batch_time.stop();
|
||||
|
||||
|
Reference in New Issue
Block a user