mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 12:19:24 +00:00
Further space out requests for cosigns from the network
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
use core::future::Future;
|
use core::future::Future;
|
||||||
use std::time::{Duration, SystemTime};
|
use std::time::{Duration, Instant, SystemTime};
|
||||||
|
|
||||||
use serai_db::*;
|
use serai_db::*;
|
||||||
use serai_task::ContinuallyRan;
|
use serai_task::ContinuallyRan;
|
||||||
@@ -77,12 +77,22 @@ pub(crate) fn currently_evaluated_global_session(getter: &impl Get) -> Option<[u
|
|||||||
pub(crate) struct CosignEvaluatorTask<D: Db, R: RequestNotableCosigns> {
|
pub(crate) struct CosignEvaluatorTask<D: Db, R: RequestNotableCosigns> {
|
||||||
pub(crate) db: D,
|
pub(crate) db: D,
|
||||||
pub(crate) request: R,
|
pub(crate) request: R,
|
||||||
|
pub(crate) last_request_for_cosigns: Instant,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<D: Db, R: RequestNotableCosigns> ContinuallyRan for CosignEvaluatorTask<D, R> {
|
impl<D: Db, R: RequestNotableCosigns> ContinuallyRan for CosignEvaluatorTask<D, R> {
|
||||||
type Error = String;
|
type Error = String;
|
||||||
|
|
||||||
fn run_iteration(&mut self) -> impl Send + Future<Output = Result<bool, Self::Error>> {
|
fn run_iteration(&mut self) -> impl Send + Future<Output = Result<bool, Self::Error>> {
|
||||||
|
let should_request_cosigns = |last_request_for_cosigns: &mut Instant| {
|
||||||
|
const REQUEST_COSIGNS_SPACING: Duration = Duration::from_secs(60);
|
||||||
|
if Instant::now() < (*last_request_for_cosigns + REQUEST_COSIGNS_SPACING) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
*last_request_for_cosigns = Instant::now();
|
||||||
|
true
|
||||||
|
};
|
||||||
|
|
||||||
async move {
|
async move {
|
||||||
let mut known_cosign = None;
|
let mut known_cosign = None;
|
||||||
let mut made_progress = false;
|
let mut made_progress = false;
|
||||||
@@ -118,12 +128,13 @@ impl<D: Db, R: RequestNotableCosigns> ContinuallyRan for CosignEvaluatorTask<D,
|
|||||||
// Check if the sum weight doesn't cross the required threshold
|
// Check if the sum weight doesn't cross the required threshold
|
||||||
if weight_cosigned < (((global_session_info.total_stake * 83) / 100) + 1) {
|
if weight_cosigned < (((global_session_info.total_stake * 83) / 100) + 1) {
|
||||||
// Request the necessary cosigns over the network
|
// Request the necessary cosigns over the network
|
||||||
// TODO: Add a timer to ensure this isn't called too often
|
if should_request_cosigns(&mut self.last_request_for_cosigns) {
|
||||||
self
|
self
|
||||||
.request
|
.request
|
||||||
.request_notable_cosigns(global_session)
|
.request_notable_cosigns(global_session)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| format!("{e:?}"))?;
|
.map_err(|e| format!("{e:?}"))?;
|
||||||
|
}
|
||||||
// We return an error so the delay before this task is run again increases
|
// We return an error so the delay before this task is run again increases
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
"notable block (#{block_number}) wasn't yet cosigned. this should resolve shortly",
|
"notable block (#{block_number}) wasn't yet cosigned. this should resolve shortly",
|
||||||
@@ -180,11 +191,13 @@ impl<D: Db, R: RequestNotableCosigns> ContinuallyRan for CosignEvaluatorTask<D,
|
|||||||
// If this session hasn't yet produced notable cosigns, then we presume we'll see
|
// If this session hasn't yet produced notable cosigns, then we presume we'll see
|
||||||
// the desired non-notable cosigns as part of normal operations, without needing to
|
// the desired non-notable cosigns as part of normal operations, without needing to
|
||||||
// explicitly request them
|
// explicitly request them
|
||||||
|
if should_request_cosigns(&mut self.last_request_for_cosigns) {
|
||||||
self
|
self
|
||||||
.request
|
.request
|
||||||
.request_notable_cosigns(global_session)
|
.request_notable_cosigns(global_session)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| format!("{e:?}"))?;
|
.map_err(|e| format!("{e:?}"))?;
|
||||||
|
}
|
||||||
// We return an error so the delay before this task is run again increases
|
// We return an error so the delay before this task is run again increases
|
||||||
return Err(format!(
|
return Err(format!(
|
||||||
"block (#{block_number}) wasn't yet cosigned. this should resolve shortly",
|
"block (#{block_number}) wasn't yet cosigned. this should resolve shortly",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
#![deny(missing_docs)]
|
#![deny(missing_docs)]
|
||||||
|
|
||||||
use core::{fmt::Debug, future::Future};
|
use core::{fmt::Debug, future::Future};
|
||||||
use std::{sync::Arc, collections::HashMap};
|
use std::{sync::Arc, collections::HashMap, time::Instant};
|
||||||
|
|
||||||
use blake2::{Digest, Blake2s256};
|
use blake2::{Digest, Blake2s256};
|
||||||
|
|
||||||
@@ -288,7 +288,11 @@ impl<D: Db> Cosigning<D> {
|
|||||||
.continually_run(intend_task, vec![evaluator_task_handle]),
|
.continually_run(intend_task, vec![evaluator_task_handle]),
|
||||||
);
|
);
|
||||||
tokio::spawn(
|
tokio::spawn(
|
||||||
(evaluator::CosignEvaluatorTask { db: db.clone(), request })
|
(evaluator::CosignEvaluatorTask {
|
||||||
|
db: db.clone(),
|
||||||
|
request,
|
||||||
|
last_request_for_cosigns: Instant::now(),
|
||||||
|
})
|
||||||
.continually_run(evaluator_task, vec![delay_task_handle]),
|
.continually_run(evaluator_task, vec![delay_task_handle]),
|
||||||
);
|
);
|
||||||
tokio::spawn(
|
tokio::spawn(
|
||||||
|
|||||||
Reference in New Issue
Block a user