mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-06-01 04:31:02 +00:00
grandpa: minor cleanup for gossip round start instant (#5976)
* grandpa: move gossip round start instant to LocalView * grandpa: round duration is 2 gossip periods
This commit is contained in:
@@ -110,7 +110,7 @@ const CATCH_UP_THRESHOLD: u64 = 2;
|
|||||||
const PROPAGATION_ALL: u32 = 4; //in rounds;
|
const PROPAGATION_ALL: u32 = 4; //in rounds;
|
||||||
const PROPAGATION_ALL_AUTHORITIES: u32 = 2; //in rounds;
|
const PROPAGATION_ALL_AUTHORITIES: u32 = 2; //in rounds;
|
||||||
const PROPAGATION_SOME_NON_AUTHORITIES: u32 = 3; //in rounds;
|
const PROPAGATION_SOME_NON_AUTHORITIES: u32 = 3; //in rounds;
|
||||||
const ROUND_DURATION: u32 = 4; // measured in gossip durations
|
const ROUND_DURATION: u32 = 2; // measured in gossip durations
|
||||||
|
|
||||||
const MIN_LUCKY: usize = 5;
|
const MIN_LUCKY: usize = 5;
|
||||||
|
|
||||||
@@ -181,15 +181,27 @@ impl<N: Ord> View<N> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A local view of protocol state. Only differs from `View` in that we also
|
/// A local view of protocol state. Similar to `View` but we additionally track
|
||||||
/// track the round and set id at which the last commit was observed.
|
/// the round and set id at which the last commit was observed, and the instant
|
||||||
|
/// at which the current round started.
|
||||||
struct LocalView<N> {
|
struct LocalView<N> {
|
||||||
round: Round,
|
round: Round,
|
||||||
set_id: SetId,
|
set_id: SetId,
|
||||||
last_commit: Option<(N, Round, SetId)>,
|
last_commit: Option<(N, Round, SetId)>,
|
||||||
|
round_start: Instant,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<N> LocalView<N> {
|
impl<N> LocalView<N> {
|
||||||
|
/// Creates a new `LocalView` at the given set id and round.
|
||||||
|
fn new(set_id: SetId, round: Round) -> LocalView<N> {
|
||||||
|
LocalView {
|
||||||
|
set_id,
|
||||||
|
round,
|
||||||
|
last_commit: None,
|
||||||
|
round_start: Instant::now(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Converts the local view to a `View` discarding round and set id
|
/// Converts the local view to a `View` discarding round and set id
|
||||||
/// information about the last commit.
|
/// information about the last commit.
|
||||||
fn as_view(&self) -> View<&N> {
|
fn as_view(&self) -> View<&N> {
|
||||||
@@ -205,9 +217,16 @@ impl<N> LocalView<N> {
|
|||||||
if set_id != self.set_id {
|
if set_id != self.set_id {
|
||||||
self.set_id = set_id;
|
self.set_id = set_id;
|
||||||
self.round = Round(1);
|
self.round = Round(1);
|
||||||
|
self.round_start = Instant::now();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Updates the current round.
|
||||||
|
fn update_round(&mut self, round: Round) {
|
||||||
|
self.round = round;
|
||||||
|
self.round_start = Instant::now();
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the height of the block that the last observed commit finalizes.
|
/// Returns the height of the block that the last observed commit finalizes.
|
||||||
fn last_commit_height(&self) -> Option<&N> {
|
fn last_commit_height(&self) -> Option<&N> {
|
||||||
self.last_commit.as_ref().map(|(number, _, _)| number)
|
self.last_commit.as_ref().map(|(number, _, _)| number)
|
||||||
@@ -656,7 +675,6 @@ struct Inner<Block: BlockT> {
|
|||||||
local_view: Option<LocalView<NumberFor<Block>>>,
|
local_view: Option<LocalView<NumberFor<Block>>>,
|
||||||
peers: Peers<NumberFor<Block>>,
|
peers: Peers<NumberFor<Block>>,
|
||||||
live_topics: KeepTopics<Block>,
|
live_topics: KeepTopics<Block>,
|
||||||
round_start: Instant,
|
|
||||||
authorities: Vec<AuthorityId>,
|
authorities: Vec<AuthorityId>,
|
||||||
config: crate::Config,
|
config: crate::Config,
|
||||||
next_rebroadcast: Instant,
|
next_rebroadcast: Instant,
|
||||||
@@ -689,7 +707,6 @@ impl<Block: BlockT> Inner<Block> {
|
|||||||
local_view: None,
|
local_view: None,
|
||||||
peers: Peers::default(),
|
peers: Peers::default(),
|
||||||
live_topics: KeepTopics::new(),
|
live_topics: KeepTopics::new(),
|
||||||
round_start: Instant::now(),
|
|
||||||
next_rebroadcast: Instant::now() + REBROADCAST_AFTER,
|
next_rebroadcast: Instant::now() + REBROADCAST_AFTER,
|
||||||
authorities: Vec::new(),
|
authorities: Vec::new(),
|
||||||
pending_catch_up: PendingCatchUp::None,
|
pending_catch_up: PendingCatchUp::None,
|
||||||
@@ -715,10 +732,9 @@ impl<Block: BlockT> Inner<Block> {
|
|||||||
debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.",
|
debug!(target: "afg", "Voter {} noting beginning of round {:?} to network.",
|
||||||
self.config.name(), (round, set_id));
|
self.config.name(), (round, set_id));
|
||||||
|
|
||||||
local_view.round = round;
|
local_view.update_round(round);
|
||||||
|
|
||||||
self.live_topics.push(round, set_id);
|
self.live_topics.push(round, set_id);
|
||||||
self.round_start = Instant::now();
|
|
||||||
self.peers.reshuffle();
|
self.peers.reshuffle();
|
||||||
}
|
}
|
||||||
self.multicast_neighbor_packet()
|
self.multicast_neighbor_packet()
|
||||||
@@ -729,11 +745,10 @@ impl<Block: BlockT> Inner<Block> {
|
|||||||
fn note_set(&mut self, set_id: SetId, authorities: Vec<AuthorityId>) -> MaybeMessage<Block> {
|
fn note_set(&mut self, set_id: SetId, authorities: Vec<AuthorityId>) -> MaybeMessage<Block> {
|
||||||
{
|
{
|
||||||
let local_view = match self.local_view {
|
let local_view = match self.local_view {
|
||||||
ref mut x @ None => x.get_or_insert(LocalView {
|
ref mut x @ None => x.get_or_insert(LocalView::new(
|
||||||
round: Round(1),
|
|
||||||
set_id,
|
set_id,
|
||||||
last_commit: None,
|
Round(1),
|
||||||
}),
|
)),
|
||||||
Some(ref mut v) => if v.set_id == set_id {
|
Some(ref mut v) => if v.set_id == set_id {
|
||||||
if self.authorities != authorities {
|
if self.authorities != authorities {
|
||||||
debug!(target: "afg",
|
debug!(target: "afg",
|
||||||
@@ -1121,8 +1136,10 @@ impl<Block: BlockT> Inner<Block> {
|
|||||||
/// underlying gossip layer, which should happen every 30 seconds.
|
/// underlying gossip layer, which should happen every 30 seconds.
|
||||||
fn round_message_allowed<N>(&self, who: &PeerId, peer: &PeerInfo<N>) -> bool {
|
fn round_message_allowed<N>(&self, who: &PeerId, peer: &PeerInfo<N>) -> bool {
|
||||||
let round_duration = self.config.gossip_duration * ROUND_DURATION;
|
let round_duration = self.config.gossip_duration * ROUND_DURATION;
|
||||||
let round_elapsed = self.round_start.elapsed();
|
let round_elapsed = match self.local_view {
|
||||||
|
Some(ref local_view) => local_view.round_start.elapsed(),
|
||||||
|
None => return false,
|
||||||
|
};
|
||||||
|
|
||||||
if !self.config.is_authority
|
if !self.config.is_authority
|
||||||
&& round_elapsed < round_duration * PROPAGATION_ALL
|
&& round_elapsed < round_duration * PROPAGATION_ALL
|
||||||
@@ -1185,7 +1202,10 @@ impl<Block: BlockT> Inner<Block> {
|
|||||||
/// underlying gossip layer, which should happen every 30 seconds.
|
/// underlying gossip layer, which should happen every 30 seconds.
|
||||||
fn global_message_allowed<N>(&self, who: &PeerId, peer: &PeerInfo<N>) -> bool {
|
fn global_message_allowed<N>(&self, who: &PeerId, peer: &PeerInfo<N>) -> bool {
|
||||||
let round_duration = self.config.gossip_duration * ROUND_DURATION;
|
let round_duration = self.config.gossip_duration * ROUND_DURATION;
|
||||||
let round_elapsed = self.round_start.elapsed();
|
let round_elapsed = match self.local_view {
|
||||||
|
Some(ref local_view) => local_view.round_start.elapsed(),
|
||||||
|
None => return false,
|
||||||
|
};
|
||||||
|
|
||||||
match peer.roles {
|
match peer.roles {
|
||||||
ObservedRole::OurSentry | ObservedRole::OurGuardedAuthority => true,
|
ObservedRole::OurSentry | ObservedRole::OurGuardedAuthority => true,
|
||||||
@@ -2320,7 +2340,8 @@ mod tests {
|
|||||||
|
|
||||||
let test = |num_round, peers| {
|
let test = |num_round, peers| {
|
||||||
// rewind n round durations
|
// rewind n round durations
|
||||||
val.inner.write().round_start = Instant::now() - round_duration * num_round;
|
val.inner.write().local_view.as_mut().unwrap().round_start =
|
||||||
|
Instant::now() - round_duration * num_round;
|
||||||
let mut message_allowed = val.message_allowed();
|
let mut message_allowed = val.message_allowed();
|
||||||
|
|
||||||
move || {
|
move || {
|
||||||
@@ -2448,7 +2469,8 @@ mod tests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
val.inner.write().round_start = Instant::now() - round_duration * 4;
|
val.inner.write().local_view.as_mut().unwrap().round_start =
|
||||||
|
Instant::now() - round_duration * 4;
|
||||||
let mut message_allowed = val.message_allowed();
|
let mut message_allowed = val.message_allowed();
|
||||||
// on the fourth round duration we should allow messages to authorities
|
// on the fourth round duration we should allow messages to authorities
|
||||||
// (on the second we would do `sqrt(authorities)`)
|
// (on the second we would do `sqrt(authorities)`)
|
||||||
|
|||||||
Reference in New Issue
Block a user