Handle already discarded packets in gpu sigverify path (#22680)

This commit is contained in:
sakridge
2022-01-24 05:35:47 -08:00
committed by GitHub
parent 7569f282c6
commit 2e56c59bcb
8 changed files with 193 additions and 65 deletions

View File

@ -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

View File

@ -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
}

View File

@ -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());
}

View File

@ -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();