mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-08 20:29:23 +00:00
Remove async-trait from processor/
Part of https://github.com/serai-dex/issues/607.
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
use serai_db::{Get, DbTxn, Db};
|
||||
use core::future::Future;
|
||||
|
||||
use serai_db::{Get, DbTxn, Db};
|
||||
use primitives::{task::ContinuallyRan, BlockHeader};
|
||||
|
||||
use crate::ScannerFeed;
|
||||
@@ -56,58 +57,59 @@ impl<D: Db, S: ScannerFeed> IndexTask<D, S> {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl<D: Db, S: ScannerFeed> ContinuallyRan for IndexTask<D, S> {
|
||||
async fn run_iteration(&mut self) -> Result<bool, String> {
|
||||
// Fetch the latest finalized block
|
||||
let our_latest_finalized = IndexDb::latest_finalized_block(&self.db)
|
||||
.expect("IndexTask run before writing the start block");
|
||||
let latest_finalized = match self.feed.latest_finalized_block_number().await {
|
||||
Ok(latest_finalized) => latest_finalized,
|
||||
Err(e) => Err(format!("couldn't fetch the latest finalized block number: {e:?}"))?,
|
||||
};
|
||||
|
||||
if latest_finalized < our_latest_finalized {
|
||||
// Explicitly log this as an error as returned ephemeral errors are logged with debug
|
||||
// This doesn't panic as the node should sync along our indexed chain, and if it doesn't,
|
||||
// we'll panic at that point in time
|
||||
log::error!(
|
||||
"node is out of sync, latest finalized {} is behind our indexed {}",
|
||||
latest_finalized,
|
||||
our_latest_finalized
|
||||
);
|
||||
Err("node is out of sync".to_string())?;
|
||||
}
|
||||
|
||||
// Index the hashes of all blocks until the latest finalized block
|
||||
for b in (our_latest_finalized + 1) ..= latest_finalized {
|
||||
let block = match self.feed.unchecked_block_header_by_number(b).await {
|
||||
Ok(block) => block,
|
||||
Err(e) => Err(format!("couldn't fetch block {b}: {e:?}"))?,
|
||||
fn run_iteration(&mut self) -> impl Send + Future<Output = Result<bool, String>> {
|
||||
async move {
|
||||
// Fetch the latest finalized block
|
||||
let our_latest_finalized = IndexDb::latest_finalized_block(&self.db)
|
||||
.expect("IndexTask run before writing the start block");
|
||||
let latest_finalized = match self.feed.latest_finalized_block_number().await {
|
||||
Ok(latest_finalized) => latest_finalized,
|
||||
Err(e) => Err(format!("couldn't fetch the latest finalized block number: {e:?}"))?,
|
||||
};
|
||||
|
||||
// Check this descends from our indexed chain
|
||||
{
|
||||
let expected_parent =
|
||||
IndexDb::block_id(&self.db, b - 1).expect("didn't have the ID of the prior block");
|
||||
if block.parent() != expected_parent {
|
||||
panic!(
|
||||
"current finalized block (#{b}, {}) doesn't build off finalized block (#{}, {})",
|
||||
hex::encode(block.parent()),
|
||||
b - 1,
|
||||
hex::encode(expected_parent)
|
||||
);
|
||||
}
|
||||
if latest_finalized < our_latest_finalized {
|
||||
// Explicitly log this as an error as returned ephemeral errors are logged with debug
|
||||
// This doesn't panic as the node should sync along our indexed chain, and if it doesn't,
|
||||
// we'll panic at that point in time
|
||||
log::error!(
|
||||
"node is out of sync, latest finalized {} is behind our indexed {}",
|
||||
latest_finalized,
|
||||
our_latest_finalized
|
||||
);
|
||||
Err("node is out of sync".to_string())?;
|
||||
}
|
||||
|
||||
// Update the latest finalized block
|
||||
let mut txn = self.db.txn();
|
||||
IndexDb::set_block(&mut txn, b, block.id());
|
||||
IndexDb::set_latest_finalized_block(&mut txn, b);
|
||||
txn.commit();
|
||||
}
|
||||
// Index the hashes of all blocks until the latest finalized block
|
||||
for b in (our_latest_finalized + 1) ..= latest_finalized {
|
||||
let block = match self.feed.unchecked_block_header_by_number(b).await {
|
||||
Ok(block) => block,
|
||||
Err(e) => Err(format!("couldn't fetch block {b}: {e:?}"))?,
|
||||
};
|
||||
|
||||
// Have dependents run if we updated the latest finalized block
|
||||
Ok(our_latest_finalized != latest_finalized)
|
||||
// Check this descends from our indexed chain
|
||||
{
|
||||
let expected_parent =
|
||||
IndexDb::block_id(&self.db, b - 1).expect("didn't have the ID of the prior block");
|
||||
if block.parent() != expected_parent {
|
||||
panic!(
|
||||
"current finalized block (#{b}, {}) doesn't build off finalized block (#{}, {})",
|
||||
hex::encode(block.parent()),
|
||||
b - 1,
|
||||
hex::encode(expected_parent)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// Update the latest finalized block
|
||||
let mut txn = self.db.txn();
|
||||
IndexDb::set_block(&mut txn, b, block.id());
|
||||
IndexDb::set_latest_finalized_block(&mut txn, b);
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
// Have dependents run if we updated the latest finalized block
|
||||
Ok(our_latest_finalized != latest_finalized)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user