Fix assertion failure (#13626)
Co-authored-by: Carl Lin <carl@solana.com>
This commit is contained in:
parent
6276360468
commit
afc1b59475
|
@ -2490,7 +2490,8 @@ impl Blockstore {
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let data_shreds = data_shreds?;
|
let data_shreds = data_shreds?;
|
||||||
assert!(data_shreds.last().unwrap().data_complete());
|
let last_shred = data_shreds.last().unwrap();
|
||||||
|
assert!(last_shred.data_complete() || last_shred.last_in_slot());
|
||||||
|
|
||||||
let deshred_payload = Shredder::deshred(&data_shreds).map_err(|e| {
|
let deshred_payload = Shredder::deshred(&data_shreds).map_err(|e| {
|
||||||
BlockstoreError::InvalidShredData(Box::new(bincode::ErrorKind::Custom(format!(
|
BlockstoreError::InvalidShredData(Box::new(bincode::ErrorKind::Custom(format!(
|
||||||
|
@ -7304,4 +7305,24 @@ pub mod tests {
|
||||||
}
|
}
|
||||||
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
Blockstore::destroy(&blockstore_path).expect("Expected successful database destruction");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_remove_shred_data_complete_flag() {
|
||||||
|
let (mut shreds, entries) = make_slot_entries(0, 0, 1);
|
||||||
|
|
||||||
|
let ledger_path = get_tmp_ledger_path!();
|
||||||
|
let ledger = Blockstore::open(&ledger_path).unwrap();
|
||||||
|
|
||||||
|
// Remove the data complete flag from the last shred
|
||||||
|
shreds[0].unset_data_complete();
|
||||||
|
|
||||||
|
ledger.insert_shreds(shreds, None, false).unwrap();
|
||||||
|
|
||||||
|
// Check that the `data_complete` flag was unset in the stored shred, but the
|
||||||
|
// `last_in_slot` flag is set.
|
||||||
|
let stored_shred = &ledger.get_data_shreds_for_slot(0, 0).unwrap()[0];
|
||||||
|
assert!(!stored_shred.data_complete());
|
||||||
|
assert!(stored_shred.last_in_slot());
|
||||||
|
assert_eq!(entries, ledger.get_any_valid_slot_entries(0, 0));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -433,6 +433,24 @@ impl Shred {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
pub fn unset_data_complete(&mut self) {
|
||||||
|
if self.is_data() {
|
||||||
|
self.data_header.flags &= !DATA_COMPLETE_SHRED;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Data header starts after the shred common header
|
||||||
|
let mut start = SIZE_OF_COMMON_SHRED_HEADER;
|
||||||
|
let size_of_data_shred_header = SIZE_OF_DATA_SHRED_HEADER;
|
||||||
|
Self::serialize_obj_into(
|
||||||
|
&mut start,
|
||||||
|
size_of_data_shred_header,
|
||||||
|
&mut self.payload,
|
||||||
|
&self.data_header,
|
||||||
|
)
|
||||||
|
.expect("Failed to write data header into shred buffer");
|
||||||
|
}
|
||||||
|
|
||||||
pub fn data_complete(&self) -> bool {
|
pub fn data_complete(&self) -> bool {
|
||||||
if self.is_data() {
|
if self.is_data() {
|
||||||
self.data_header.flags & DATA_COMPLETE_SHRED == DATA_COMPLETE_SHRED
|
self.data_header.flags & DATA_COMPLETE_SHRED == DATA_COMPLETE_SHRED
|
||||||
|
|
Loading…
Reference in New Issue