Add more slot update notifications (#15734)
* Add more slot update notifications * fix merge * Address feedback and add integration test * switch to datapoint * remove unused shred method * fix clippy * new thread for rpc completed slots * remove extra constant * fixes * rely on channel closing * fix check
This commit is contained in:
@ -114,7 +114,7 @@ pub struct CompletedDataSetInfo {
|
||||
pub struct BlockstoreSignals {
|
||||
pub blockstore: Blockstore,
|
||||
pub ledger_signal_receiver: Receiver<bool>,
|
||||
pub completed_slots_receiver: CompletedSlotsReceiver,
|
||||
pub completed_slots_receivers: [CompletedSlotsReceiver; 2],
|
||||
}
|
||||
|
||||
// ledger window
|
||||
@ -378,15 +378,18 @@ impl Blockstore {
|
||||
enforce_ulimit_nofile,
|
||||
)?;
|
||||
let (ledger_signal_sender, ledger_signal_receiver) = sync_channel(1);
|
||||
let (completed_slots_sender, completed_slots_receiver) =
|
||||
let (completed_slots_sender1, completed_slots_receiver1) =
|
||||
sync_channel(MAX_COMPLETED_SLOTS_IN_CHANNEL);
|
||||
let (completed_slots_sender2, completed_slots_receiver2) =
|
||||
sync_channel(MAX_COMPLETED_SLOTS_IN_CHANNEL);
|
||||
|
||||
blockstore.new_shreds_signals = vec![ledger_signal_sender];
|
||||
blockstore.completed_slots_senders = vec![completed_slots_sender];
|
||||
blockstore.completed_slots_senders = vec![completed_slots_sender1, completed_slots_sender2];
|
||||
|
||||
Ok(BlockstoreSignals {
|
||||
blockstore,
|
||||
ledger_signal_receiver,
|
||||
completed_slots_receiver,
|
||||
completed_slots_receivers: [completed_slots_receiver1, completed_slots_receiver2],
|
||||
})
|
||||
}
|
||||
|
||||
@ -4302,7 +4305,7 @@ pub mod tests {
|
||||
let ledger_path = get_tmp_ledger_path!();
|
||||
let BlockstoreSignals {
|
||||
blockstore: ledger,
|
||||
completed_slots_receiver: recvr,
|
||||
completed_slots_receivers: [recvr, _],
|
||||
..
|
||||
} = Blockstore::open_with_signal(&ledger_path, None, true).unwrap();
|
||||
let ledger = Arc::new(ledger);
|
||||
@ -4328,7 +4331,7 @@ pub mod tests {
|
||||
let ledger_path = get_tmp_ledger_path!();
|
||||
let BlockstoreSignals {
|
||||
blockstore: ledger,
|
||||
completed_slots_receiver: recvr,
|
||||
completed_slots_receivers: [recvr, _],
|
||||
..
|
||||
} = Blockstore::open_with_signal(&ledger_path, None, true).unwrap();
|
||||
let ledger = Arc::new(ledger);
|
||||
@ -4372,7 +4375,7 @@ pub mod tests {
|
||||
let ledger_path = get_tmp_ledger_path!();
|
||||
let BlockstoreSignals {
|
||||
blockstore: ledger,
|
||||
completed_slots_receiver: recvr,
|
||||
completed_slots_receivers: [recvr, _],
|
||||
..
|
||||
} = Blockstore::open_with_signal(&ledger_path, None, true).unwrap();
|
||||
let ledger = Arc::new(ledger);
|
||||
|
@ -489,6 +489,18 @@ impl Shred {
|
||||
}
|
||||
}
|
||||
|
||||
// Get slot from a shred packet with partial deserialize
|
||||
pub fn get_slot_from_packet(p: &Packet) -> Option<Slot> {
|
||||
let slot_start = OFFSET_OF_SHRED_SLOT;
|
||||
let slot_end = slot_start + SIZE_OF_SHRED_SLOT;
|
||||
|
||||
if slot_end > p.meta.size {
|
||||
return None;
|
||||
}
|
||||
|
||||
limited_deserialize::<Slot>(&p.data[slot_start..slot_end]).ok()
|
||||
}
|
||||
|
||||
pub fn reference_tick_from_data(data: &[u8]) -> u8 {
|
||||
let flags = data[SIZE_OF_COMMON_SHRED_HEADER + SIZE_OF_DATA_SHRED_HEADER
|
||||
- size_of::<u8>()
|
||||
|
Reference in New Issue
Block a user