Make validator timestamping more coincident, and increase timestamp sample range (#7673)

automerge
This commit is contained in:
Tyera Eulberg 2020-01-03 23:38:00 -07:00 committed by Grimes
parent 7e94cc2cc3
commit 84a37a2c0c
2 changed files with 32 additions and 23 deletions

View File

@ -432,7 +432,7 @@ impl Tower {
fn maybe_timestamp(&mut self, current_slot: Slot) -> Option<UnixTimestamp> { fn maybe_timestamp(&mut self, current_slot: Slot) -> Option<UnixTimestamp> {
if self.last_timestamp.slot == 0 if self.last_timestamp.slot == 0
|| self.last_timestamp.slot + TIMESTAMP_SLOT_INTERVAL <= current_slot || self.last_timestamp.slot < (current_slot - (current_slot % TIMESTAMP_SLOT_INTERVAL))
{ {
let timestamp = Utc::now().timestamp(); let timestamp = Utc::now().timestamp();
self.last_timestamp = BlockTimestamp { self.last_timestamp = BlockTimestamp {

View File

@ -61,7 +61,7 @@ thread_local!(static PAR_THREAD_POOL: RefCell<ThreadPool> = RefCell::new(rayon::
pub const MAX_COMPLETED_SLOTS_IN_CHANNEL: usize = 100_000; pub const MAX_COMPLETED_SLOTS_IN_CHANNEL: usize = 100_000;
pub const MAX_TURBINE_PROPAGATION_IN_MS: u64 = 100; pub const MAX_TURBINE_PROPAGATION_IN_MS: u64 = 100;
pub const MAX_TURBINE_DELAY_IN_TICKS: u64 = MAX_TURBINE_PROPAGATION_IN_MS / MS_PER_TICK; pub const MAX_TURBINE_DELAY_IN_TICKS: u64 = MAX_TURBINE_PROPAGATION_IN_MS / MS_PER_TICK;
const TIMESTAMP_SLOT_RANGE: usize = 5; const TIMESTAMP_SLOT_RANGE: usize = 50;
// An upper bound on maximum number of data shreds we can handle in a slot // An upper bound on maximum number of data shreds we can handle in a slot
// 32K shreds would allow ~320K peak TPS // 32K shreds would allow ~320K peak TPS
@ -1249,7 +1249,7 @@ impl Blocktree {
) -> Option<UnixTimestamp> { ) -> Option<UnixTimestamp> {
let mut total_stake = 0; let mut total_stake = 0;
let stake_weighted_timestamps_sum: u64 = self let stake_weighted_timestamps_sum: u64 = self
.get_timestamp_slots(slot, TIMESTAMP_SLOT_INTERVAL) .get_timestamp_slots(slot, TIMESTAMP_SLOT_INTERVAL, TIMESTAMP_SLOT_RANGE)
.iter() .iter()
.flat_map(|timestamp_slot| { .flat_map(|timestamp_slot| {
let offset = (slot - timestamp_slot) as u32 * slot_duration; let offset = (slot - timestamp_slot) as u32 * slot_duration;
@ -1276,7 +1276,12 @@ impl Blocktree {
} }
} }
fn get_timestamp_slots(&self, slot: Slot, timestamp_interval: u64) -> Vec<Slot> { fn get_timestamp_slots(
&self,
slot: Slot,
timestamp_interval: u64,
timestamp_sample_range: usize,
) -> Vec<Slot> {
let rooted_slots = RootedSlotIterator::new(0, &self); let rooted_slots = RootedSlotIterator::new(0, &self);
if !self.is_root(slot) || rooted_slots.is_err() { if !self.is_root(slot) || rooted_slots.is_err() {
return vec![]; return vec![];
@ -1287,7 +1292,7 @@ impl Blocktree {
.filter(|&iter_slot| iter_slot <= slot) .filter(|&iter_slot| iter_slot <= slot)
.collect(); .collect();
if slots.len() < TIMESTAMP_SLOT_RANGE { if slots.len() < timestamp_sample_range {
return slots; return slots;
} }
@ -1296,8 +1301,8 @@ impl Blocktree {
.position(|&x| x >= slot - (slot % timestamp_interval)) .position(|&x| x >= slot - (slot % timestamp_interval))
.unwrap(); .unwrap();
let filtered_iter = if slots.len() - TIMESTAMP_SLOT_RANGE >= recent_timestamp_slot_position let filtered_iter =
{ if slots.len() - timestamp_sample_range >= recent_timestamp_slot_position {
slots.iter().skip(recent_timestamp_slot_position) slots.iter().skip(recent_timestamp_slot_position)
} else { } else {
let earlier_timestamp_slot_position = slots let earlier_timestamp_slot_position = slots
@ -1306,7 +1311,10 @@ impl Blocktree {
.unwrap(); .unwrap();
slots.iter().skip(earlier_timestamp_slot_position) slots.iter().skip(earlier_timestamp_slot_position)
}; };
filtered_iter.take(TIMESTAMP_SLOT_RANGE).cloned().collect() filtered_iter
.take(timestamp_sample_range)
.cloned()
.collect()
} }
pub fn get_confirmed_block(&self, slot: Slot) -> Result<RpcConfirmedBlock> { pub fn get_confirmed_block(&self, slot: Slot) -> Result<RpcConfirmedBlock> {
@ -4456,6 +4464,7 @@ pub mod tests {
#[test] #[test]
fn test_get_timestamp_slots() { fn test_get_timestamp_slots() {
let timestamp_sample_range = 5;
let ticks_per_slot = 5; let ticks_per_slot = 5;
// Smaller interval than TIMESTAMP_SLOT_INTERVAL for convenience of building blocktree // Smaller interval than TIMESTAMP_SLOT_INTERVAL for convenience of building blocktree
let timestamp_interval = 7; let timestamp_interval = 7;
@ -4485,11 +4494,11 @@ pub mod tests {
blocktree.set_roots(&[1, 2, 3]).unwrap(); blocktree.set_roots(&[1, 2, 3]).unwrap();
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(2, timestamp_interval), blocktree.get_timestamp_slots(2, timestamp_interval, timestamp_sample_range),
vec![0, 1, 2] vec![0, 1, 2]
); );
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(3, timestamp_interval), blocktree.get_timestamp_slots(3, timestamp_interval, timestamp_sample_range),
vec![0, 1, 2, 3] vec![0, 1, 2, 3]
); );
@ -4525,23 +4534,23 @@ pub mod tests {
blocktree.set_roots(&desired_roots).unwrap(); blocktree.set_roots(&desired_roots).unwrap();
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(2, timestamp_interval), blocktree.get_timestamp_slots(2, timestamp_interval, timestamp_sample_range),
vec![0, 1, 2] vec![0, 1, 2]
); );
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(8, timestamp_interval), blocktree.get_timestamp_slots(8, timestamp_interval, timestamp_sample_range),
vec![0, 1, 2, 3, 4] vec![0, 1, 2, 3, 4]
); );
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(13, timestamp_interval), blocktree.get_timestamp_slots(13, timestamp_interval, timestamp_sample_range),
vec![8, 9, 10, 11, 12] vec![8, 9, 10, 11, 12]
); );
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(18, timestamp_interval), blocktree.get_timestamp_slots(18, timestamp_interval, timestamp_sample_range),
vec![8, 9, 10, 11, 12] vec![8, 9, 10, 11, 12]
); );
assert_eq!( assert_eq!(
blocktree.get_timestamp_slots(19, timestamp_interval), blocktree.get_timestamp_slots(19, timestamp_interval, timestamp_sample_range),
vec![14, 16, 17, 18, 19] vec![14, 16, 17, 18, 19]
); );
} }