-
Notifications
You must be signed in to change notification settings - Fork 2.7k
client/authority-discovery: Publish and query on exponential interval #7545
Changes from all commits
6a2e46e
d4e3f9f
934381c
114aec1
a100023
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,62 @@ | ||||||||||
| // Copyright 2020 Parity Technologies (UK) Ltd. | ||||||||||
| // This file is part of Substrate. | ||||||||||
|
|
||||||||||
| // Substrate is free software: you can redistribute it and/or modify | ||||||||||
| // it under the terms of the GNU General Public License as published by | ||||||||||
| // the Free Software Foundation, either version 3 of the License, or | ||||||||||
| // (at your option) any later version. | ||||||||||
|
|
||||||||||
| // Substrate is distributed in the hope that it will be useful, | ||||||||||
| // but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||||||
| // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||||||||||
| // GNU General Public License for more details. | ||||||||||
|
|
||||||||||
| // You should have received a copy of the GNU General Public License | ||||||||||
| // along with Substrate. If not, see <http://www.gnu.org/licenses/>. | ||||||||||
|
|
||||||||||
| use futures::stream::Stream; | ||||||||||
| use futures::future::FutureExt; | ||||||||||
| use futures::ready; | ||||||||||
| use futures_timer::Delay; | ||||||||||
| use std::pin::Pin; | ||||||||||
| use std::task::{Context, Poll}; | ||||||||||
| use std::time::Duration; | ||||||||||
|
|
||||||||||
| /// Exponentially increasing interval | ||||||||||
| /// | ||||||||||
| /// Doubles interval duration on each tick until the configured maximum is reached. | ||||||||||
| pub struct ExpIncInterval { | ||||||||||
| max: Duration, | ||||||||||
| next: Duration, | ||||||||||
| delay: Delay, | ||||||||||
| } | ||||||||||
|
|
||||||||||
| impl ExpIncInterval { | ||||||||||
| /// Create a new [`ExpIncInterval`]. | ||||||||||
| pub fn new(start: Duration, max: Duration) -> Self { | ||||||||||
| let delay = Delay::new(start); | ||||||||||
| Self { | ||||||||||
| max, | ||||||||||
| next: start * 2, | ||||||||||
| delay, | ||||||||||
| } | ||||||||||
| } | ||||||||||
|
|
||||||||||
| /// Fast forward the exponentially increasing interval to the configured maximum. | ||||||||||
| pub fn set_to_max(&mut self) { | ||||||||||
| self.next = self.max; | ||||||||||
| self.delay = Delay::new(self.next); | ||||||||||
| } | ||||||||||
| } | ||||||||||
|
|
||||||||||
| impl Stream for ExpIncInterval { | ||||||||||
| type Item = (); | ||||||||||
|
|
||||||||||
| fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Option<Self::Item>> { | ||||||||||
| ready!(self.delay.poll_unpin(cx)); | ||||||||||
| self.delay = Delay::new(self.next); | ||||||||||
|
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Indeed this need to be done, otherwise the thing doesn't work at all.
Contributor
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Wait, no, you actually don't need this. (this code had passed my review the other day) Since you return To phrase it differently: the documentation of
Member
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ahh yeah, I mixed Stream with Future. Sorry! |
||||||||||
| self.next = std::cmp::min(self.max, self.next * 2); | ||||||||||
|
|
||||||||||
| Poll::Ready(Some(())) | ||||||||||
| } | ||||||||||
| } | ||||||||||
Uh oh!
There was an error while loading. Please reload this page.