Check shred type in is_duplicate (#14050)
This commit is contained in:
parent
164b7895b3
commit
aa2751e614
|
@ -88,9 +88,12 @@ fn run_check_duplicate(
|
|||
) -> Result<()> {
|
||||
let check_duplicate = |shred: Shred| -> Result<()> {
|
||||
if !blockstore.has_duplicate_shreds_in_slot(shred.slot()) {
|
||||
if let Some(existing_shred_payload) =
|
||||
blockstore.is_shred_duplicate(shred.slot(), shred.index(), &shred.payload)
|
||||
{
|
||||
if let Some(existing_shred_payload) = blockstore.is_shred_duplicate(
|
||||
shred.slot(),
|
||||
shred.index(),
|
||||
&shred.payload,
|
||||
shred.is_data(),
|
||||
) {
|
||||
blockstore.store_duplicate_slot(
|
||||
shred.slot(),
|
||||
existing_shred_payload,
|
||||
|
|
|
@ -2714,10 +2714,20 @@ impl Blockstore {
|
|||
// Returns the existing shred if `new_shred` is not equal to the existing shred at the
|
||||
// given slot and index as this implies the leader generated two different shreds with
|
||||
// the same slot and index
|
||||
pub fn is_shred_duplicate(&self, slot: u64, index: u32, new_shred: &[u8]) -> Option<Vec<u8>> {
|
||||
let res = self
|
||||
.get_data_shred(slot, index as u64)
|
||||
.expect("fetch from DuplicateSlots column family failed");
|
||||
pub fn is_shred_duplicate(
|
||||
&self,
|
||||
slot: u64,
|
||||
index: u32,
|
||||
new_shred: &[u8],
|
||||
is_data: bool,
|
||||
) -> Option<Vec<u8>> {
|
||||
let res = if is_data {
|
||||
self.get_data_shred(slot, index as u64)
|
||||
.expect("fetch from DuplicateSlots column family failed")
|
||||
} else {
|
||||
self.get_coding_shred(slot, index as u64)
|
||||
.expect("fetch from DuplicateSlots column family failed")
|
||||
};
|
||||
|
||||
res.map(|existing_shred| {
|
||||
if existing_shred != new_shred {
|
||||
|
@ -7279,11 +7289,21 @@ pub mod tests {
|
|||
|
||||
// Check if shreds are duplicated
|
||||
assert_eq!(
|
||||
blockstore.is_shred_duplicate(slot, 0, &duplicate_shred.payload),
|
||||
blockstore.is_shred_duplicate(
|
||||
slot,
|
||||
0,
|
||||
&duplicate_shred.payload,
|
||||
duplicate_shred.is_data()
|
||||
),
|
||||
Some(shred.payload.clone())
|
||||
);
|
||||
assert!(blockstore
|
||||
.is_shred_duplicate(slot, 0, &non_duplicate_shred.payload)
|
||||
.is_shred_duplicate(
|
||||
slot,
|
||||
0,
|
||||
&non_duplicate_shred.payload,
|
||||
duplicate_shred.is_data()
|
||||
)
|
||||
.is_none());
|
||||
|
||||
// Store a duplicate shred
|
||||
|
|
Loading…
Reference in New Issue