adds bitflags to Packet.Meta

Instead of a separate bool type for each flag, all the flags can be
encoded in a type-safe bitflags encoded in a single u8:
https://github.com/solana-labs/solana/blob/d6ec103be/sdk/src/packet.rs#L19-L31
This commit is contained in:
behzad nouri
2022-01-02 12:10:32 -05:00
parent 73a7741c49
commit 01a096adc8
18 changed files with 130 additions and 92 deletions

View File

@ -1,5 +1,5 @@
//! The `packet` module defines data structures and methods to pull data from the network.
pub use solana_sdk::packet::{Meta, Packet, PACKET_DATA_SIZE};
pub use solana_sdk::packet::{Meta, Packet, PacketFlags, PACKET_DATA_SIZE};
use {
crate::{cuda_runtime::PinnedVec, recycler::Recycler},
bincode::config::Options,

View File

@ -9,7 +9,7 @@ use solana_sdk::transaction::Transaction;
use {
crate::{
cuda_runtime::PinnedVec,
packet::{Packet, PacketBatch},
packet::{Packet, PacketBatch, PacketFlags},
perf_libs,
recycler::Recycler,
},
@ -114,17 +114,17 @@ fn verify_packet(packet: &mut Packet, reject_non_vote: bool) {
let msg_start = packet_offsets.msg_start as usize;
// If this packet was already marked as discard, drop it
if packet.meta.discard {
if packet.meta.discard() {
return;
}
if packet_offsets.sig_len == 0 {
packet.meta.discard = true;
packet.meta.set_discard(true);
return;
}
if packet.meta.size <= msg_start {
packet.meta.discard = true;
packet.meta.set_discard(true);
return;
}
@ -142,15 +142,15 @@ fn verify_packet(packet: &mut Packet, reject_non_vote: bool) {
&packet.data[pubkey_start..pubkey_end],
&packet.data[msg_start..msg_end],
) {
packet.meta.discard = true;
packet.meta.set_discard(true);
return;
}
// Check for tracer pubkey
if !packet.meta.is_tracer_tx
if !packet.meta.is_tracer_tx()
&& &packet.data[pubkey_start..pubkey_end] == TRACER_KEY.as_ref()
{
packet.meta.is_tracer_tx = true;
packet.meta.flags |= PacketFlags::TRACER_TX;
}
pubkey_start = pubkey_end;
@ -289,7 +289,7 @@ fn get_packet_offsets(
let unsanitized_packet_offsets = do_get_packet_offsets(packet, current_offset);
if let Ok(offsets) = unsanitized_packet_offsets {
check_for_simple_vote_transaction(packet, &offsets, current_offset).ok();
if !reject_non_vote || packet.meta.is_simple_vote_tx {
if !reject_non_vote || packet.meta.is_simple_vote_tx() {
return offsets;
}
}
@ -360,7 +360,7 @@ fn check_for_simple_vote_transaction(
if &packet.data[instruction_program_id_start..instruction_program_id_end]
== solana_sdk::vote::program::id().as_ref()
{
packet.meta.is_simple_vote_tx = true;
packet.meta.flags |= PacketFlags::SIMPLE_VOTE_TX;
}
Ok(())
}
@ -441,7 +441,7 @@ pub fn ed25519_verify_disabled(batches: &mut [PacketBatch]) {
batch
.packets
.par_iter_mut()
.for_each(|p| p.meta.discard = false)
.for_each(|p| p.meta.set_discard(false))
});
inc_new_counter_debug!("ed25519_verify_disabled", packet_count);
}
@ -498,11 +498,11 @@ pub fn get_checked_scalar(scalar: &[u8; 32]) -> Result<[u8; 32], PacketError> {
}
pub fn mark_disabled(batches: &mut [PacketBatch], r: &[Vec<u8>]) {
batches.iter_mut().zip(r).for_each(|(b, v)| {
b.packets.iter_mut().zip(v).for_each(|(p, f)| {
p.meta.discard = *f == 0;
})
});
for (batch, v) in batches.iter_mut().zip(r) {
for (pkt, f) in batch.packets.iter_mut().zip(v) {
pkt.meta.set_discard(*f == 0);
}
}
}
pub fn ed25519_verify(
@ -629,9 +629,9 @@ mod tests {
batch.packets.push(Packet::default());
let mut batches: Vec<PacketBatch> = vec![batch];
mark_disabled(&mut batches, &[vec![0]]);
assert!(batches[0].packets[0].meta.discard);
assert!(batches[0].packets[0].meta.discard());
mark_disabled(&mut batches, &[vec![1]]);
assert!(!batches[0].packets[0].meta.discard);
assert!(!batches[0].packets[0].meta.discard());
}
#[test]
@ -730,12 +730,12 @@ mod tests {
assert_eq!(res, Err(PacketError::InvalidPubkeyLen));
verify_packet(&mut packet, false);
assert!(packet.meta.discard);
assert!(packet.meta.discard());
packet.meta.discard = false;
packet.meta.set_discard(false);
let mut batches = generate_packet_batches(&packet, 1, 1);
ed25519_verify(&mut batches);
assert!(batches[0].packets[0].meta.discard);
assert!(batches[0].packets[0].meta.discard());
}
#[test]
@ -766,12 +766,12 @@ mod tests {
assert_eq!(res, Err(PacketError::InvalidPubkeyLen));
verify_packet(&mut packet, false);
assert!(packet.meta.discard);
assert!(packet.meta.discard());
packet.meta.discard = false;
packet.meta.set_discard(false);
let mut batches = generate_packet_batches(&packet, 1, 1);
ed25519_verify(&mut batches);
assert!(batches[0].packets[0].meta.discard);
assert!(batches[0].packets[0].meta.discard());
}
#[test]
@ -972,7 +972,7 @@ mod tests {
assert!(batches
.iter()
.flat_map(|batch| &batch.packets)
.all(|p| p.meta.discard == should_discard));
.all(|p| p.meta.discard() == should_discard));
}
fn ed25519_verify(batches: &mut [PacketBatch]) {
@ -995,7 +995,7 @@ mod tests {
assert!(batches
.iter()
.flat_map(|batch| &batch.packets)
.all(|p| p.meta.discard));
.all(|p| p.meta.discard()));
}
#[test]
@ -1041,9 +1041,9 @@ mod tests {
.zip(ref_vec.into_iter().flatten())
.all(|(p, discard)| {
if discard == 0 {
p.meta.discard
p.meta.discard()
} else {
!p.meta.discard
!p.meta.discard()
}
}));
}
@ -1196,7 +1196,7 @@ mod tests {
let mut packet = sigverify::make_packet_from_transaction(tx);
let packet_offsets = do_get_packet_offsets(&packet, 0).unwrap();
check_for_simple_vote_transaction(&mut packet, &packet_offsets, 0).ok();
assert!(!packet.meta.is_simple_vote_tx);
assert!(!packet.meta.is_simple_vote_tx());
}
// single vote tx is
@ -1206,7 +1206,7 @@ mod tests {
let mut packet = sigverify::make_packet_from_transaction(tx);
let packet_offsets = do_get_packet_offsets(&packet, 0).unwrap();
check_for_simple_vote_transaction(&mut packet, &packet_offsets, 0).ok();
assert!(packet.meta.is_simple_vote_tx);
assert!(packet.meta.is_simple_vote_tx());
}
// multiple mixed tx is not
@ -1227,7 +1227,7 @@ mod tests {
let mut packet = sigverify::make_packet_from_transaction(tx);
let packet_offsets = do_get_packet_offsets(&packet, 0).unwrap();
check_for_simple_vote_transaction(&mut packet, &packet_offsets, 0).ok();
assert!(!packet.meta.is_simple_vote_tx);
assert!(!packet.meta.is_simple_vote_tx());
}
}
@ -1253,9 +1253,9 @@ mod tests {
let packet_offsets = do_get_packet_offsets(packet, current_offset).unwrap();
check_for_simple_vote_transaction(packet, &packet_offsets, current_offset).ok();
if index == 1 {
assert!(packet.meta.is_simple_vote_tx);
assert!(packet.meta.is_simple_vote_tx());
} else {
assert!(!packet.meta.is_simple_vote_tx);
assert!(!packet.meta.is_simple_vote_tx());
}
current_offset = current_offset.saturating_add(size_of::<Packet>());