mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-05-30 23:21:02 +00:00
im-online: send heartbeats at a random period (#8819)
* im-online: send heartbeats at a random period * support: use permill to represent session progress * im-online: increase probability of heartbeating with session progress * babe, session: fix tests * babe: fix test
This commit is contained in:
@@ -433,10 +433,92 @@ fn should_handle_non_linear_session_progress() {
|
||||
assert!(ImOnline::send_heartbeats(5).ok().is_some());
|
||||
|
||||
// if we have a valid current session progress then we'll heartbeat as soon
|
||||
// as we're past 50% of the session regardless of the block number
|
||||
// as we're past 80% of the session regardless of the block number
|
||||
MOCK_CURRENT_SESSION_PROGRESS
|
||||
.with(|p| *p.borrow_mut() = Some(Some(Percent::from_percent(51))));
|
||||
.with(|p| *p.borrow_mut() = Some(Some(Permill::from_percent(81))));
|
||||
|
||||
assert!(ImOnline::send_heartbeats(2).ok().is_some());
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_does_not_heartbeat_early_in_the_session() {
|
||||
let mut ext = new_test_ext();
|
||||
let (offchain, _state) = TestOffchainExt::new();
|
||||
let (pool, _) = TestTransactionPoolExt::new();
|
||||
ext.register_extension(OffchainDbExt::new(offchain.clone()));
|
||||
ext.register_extension(OffchainWorkerExt::new(offchain));
|
||||
ext.register_extension(TransactionPoolExt::new(pool));
|
||||
|
||||
ext.execute_with(|| {
|
||||
// mock current session progress as being 5%. we only randomly start
|
||||
// heartbeating after 10% of the session has elapsed.
|
||||
MOCK_CURRENT_SESSION_PROGRESS.with(|p| *p.borrow_mut() = Some(Some(Permill::from_float(0.05))));
|
||||
assert_eq!(
|
||||
ImOnline::send_heartbeats(2).err(),
|
||||
Some(OffchainErr::TooEarly),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_probability_of_heartbeating_increases_with_session_progress() {
|
||||
let mut ext = new_test_ext();
|
||||
let (offchain, state) = TestOffchainExt::new();
|
||||
let (pool, _) = TestTransactionPoolExt::new();
|
||||
ext.register_extension(OffchainDbExt::new(offchain.clone()));
|
||||
ext.register_extension(OffchainWorkerExt::new(offchain));
|
||||
ext.register_extension(TransactionPoolExt::new(pool));
|
||||
|
||||
ext.execute_with(|| {
|
||||
let set_test = |progress, random: f64| {
|
||||
// the average session length is 100 blocks, therefore the residual
|
||||
// probability of sending a heartbeat is 1%
|
||||
MOCK_AVERAGE_SESSION_LENGTH.with(|p| *p.borrow_mut() = Some(100));
|
||||
MOCK_CURRENT_SESSION_PROGRESS.with(|p| *p.borrow_mut() =
|
||||
Some(Some(Permill::from_float(progress))));
|
||||
|
||||
let mut seed = [0u8; 32];
|
||||
let encoded = ((random * Permill::ACCURACY as f64) as u32).encode();
|
||||
seed[0..4].copy_from_slice(&encoded);
|
||||
state.write().seed = seed;
|
||||
};
|
||||
|
||||
let assert_too_early = |progress, random| {
|
||||
set_test(progress, random);
|
||||
assert_eq!(
|
||||
ImOnline::send_heartbeats(2).err(),
|
||||
Some(OffchainErr::TooEarly),
|
||||
);
|
||||
};
|
||||
|
||||
let assert_heartbeat_ok = |progress, random| {
|
||||
set_test(progress, random);
|
||||
assert!(ImOnline::send_heartbeats(2).ok().is_some());
|
||||
};
|
||||
|
||||
assert_too_early(0.05, 1.0);
|
||||
|
||||
assert_too_early(0.1, 0.1);
|
||||
assert_too_early(0.1, 0.011);
|
||||
assert_heartbeat_ok(0.1, 0.010);
|
||||
|
||||
assert_too_early(0.4, 0.015);
|
||||
assert_heartbeat_ok(0.4, 0.014);
|
||||
|
||||
assert_too_early(0.5, 0.026);
|
||||
assert_heartbeat_ok(0.5, 0.025);
|
||||
|
||||
assert_too_early(0.6, 0.057);
|
||||
assert_heartbeat_ok(0.6, 0.056);
|
||||
|
||||
assert_too_early(0.65, 0.086);
|
||||
assert_heartbeat_ok(0.65, 0.085);
|
||||
|
||||
assert_too_early(0.7, 0.13);
|
||||
assert_heartbeat_ok(0.7, 0.12);
|
||||
|
||||
assert_too_early(0.75, 0.19);
|
||||
assert_heartbeat_ok(0.75, 0.18);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user