mirror of
https://github.com/serai-dex/serai.git
synced 2025-12-09 12:49:23 +00:00
Remove async-trait from processor/
Part of https://github.com/serai-dex/issues/607.
This commit is contained in:
@@ -1,3 +1,5 @@
|
||||
use core::future::Future;
|
||||
|
||||
use scale::Decode;
|
||||
use serai_db::{DbTxn, Db};
|
||||
|
||||
@@ -19,149 +21,157 @@ impl<D: Db, C: Coordinator> CoordinatorTask<D, C> {
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait::async_trait]
|
||||
impl<D: Db, C: Coordinator> ContinuallyRan for CoordinatorTask<D, C> {
|
||||
async fn run_iteration(&mut self) -> Result<bool, String> {
|
||||
let mut iterated = false;
|
||||
fn run_iteration(&mut self) -> impl Send + Future<Output = Result<bool, String>> {
|
||||
async move {
|
||||
let mut iterated = false;
|
||||
|
||||
for session in RegisteredKeys::get(&self.db).unwrap_or(vec![]) {
|
||||
// Publish the messages generated by this key's signers
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = CosignerToCoordinatorMessages::try_recv(&mut txn, session) else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = BatchSignerToCoordinatorMessages::try_recv(&mut txn, session) else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = SlashReportSignerToCoordinatorMessages::try_recv(&mut txn, session) else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = TransactionSignerToCoordinatorMessages::try_recv(&mut txn, session) else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
// Publish the cosigns from this session
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
while let Some(((block_number, block_id), signature)) = Cosign::try_recv(&mut txn, session)
|
||||
{
|
||||
iterated = true;
|
||||
self
|
||||
.coordinator
|
||||
.publish_cosign(block_number, block_id, <_>::decode(&mut signature.as_slice()).unwrap())
|
||||
.await
|
||||
.map_err(|e| format!("couldn't publish Cosign: {e:?}"))?;
|
||||
}
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
// If this session signed its slash report, publish its signature
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
if let Some(slash_report_signature) = SlashReportSignature::try_recv(&mut txn, session) {
|
||||
for session in RegisteredKeys::get(&self.db).unwrap_or(vec![]) {
|
||||
// Publish the messages generated by this key's signers
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = CosignerToCoordinatorMessages::try_recv(&mut txn, session) else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.publish_slash_report_signature(
|
||||
session,
|
||||
<_>::decode(&mut slash_report_signature.as_slice()).unwrap(),
|
||||
)
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
format!("couldn't send slash report signature to the coordinator: {e:?}")
|
||||
})?;
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Publish the Batches
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
while let Some(batch) = scanner::Batches::try_recv(&mut txn) {
|
||||
iterated = true;
|
||||
self
|
||||
.coordinator
|
||||
.publish_batch(batch)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't publish Batch: {e:?}"))?;
|
||||
}
|
||||
txn.commit();
|
||||
}
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = BatchSignerToCoordinatorMessages::try_recv(&mut txn, session) else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
// Publish the signed Batches
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
// The last acknowledged Batch may exceed the last Batch we published if we didn't sign for
|
||||
// the prior Batch(es) (and accordingly didn't publish them)
|
||||
let last_batch =
|
||||
crate::batch::last_acknowledged_batch(&txn).max(db::LastPublishedBatch::get(&txn));
|
||||
let mut next_batch = last_batch.map_or(0, |id| id + 1);
|
||||
while let Some(batch) = crate::batch::signed_batch(&txn, next_batch) {
|
||||
iterated = true;
|
||||
db::LastPublishedBatch::set(&mut txn, &batch.batch.id);
|
||||
self
|
||||
.coordinator
|
||||
.publish_signed_batch(batch)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't publish Batch: {e:?}"))?;
|
||||
next_batch += 1;
|
||||
}
|
||||
txn.commit();
|
||||
}
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
Ok(iterated)
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = SlashReportSignerToCoordinatorMessages::try_recv(&mut txn, session)
|
||||
else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
loop {
|
||||
let mut txn = self.db.txn();
|
||||
let Some(msg) = TransactionSignerToCoordinatorMessages::try_recv(&mut txn, session)
|
||||
else {
|
||||
break;
|
||||
};
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.send(msg)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't send sign message to the coordinator: {e:?}"))?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
// Publish the cosigns from this session
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
while let Some(((block_number, block_id), signature)) =
|
||||
Cosign::try_recv(&mut txn, session)
|
||||
{
|
||||
iterated = true;
|
||||
self
|
||||
.coordinator
|
||||
.publish_cosign(
|
||||
block_number,
|
||||
block_id,
|
||||
<_>::decode(&mut signature.as_slice()).unwrap(),
|
||||
)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't publish Cosign: {e:?}"))?;
|
||||
}
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
// If this session signed its slash report, publish its signature
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
if let Some(slash_report_signature) = SlashReportSignature::try_recv(&mut txn, session) {
|
||||
iterated = true;
|
||||
|
||||
self
|
||||
.coordinator
|
||||
.publish_slash_report_signature(
|
||||
session,
|
||||
<_>::decode(&mut slash_report_signature.as_slice()).unwrap(),
|
||||
)
|
||||
.await
|
||||
.map_err(|e| {
|
||||
format!("couldn't send slash report signature to the coordinator: {e:?}")
|
||||
})?;
|
||||
|
||||
txn.commit();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Publish the Batches
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
while let Some(batch) = scanner::Batches::try_recv(&mut txn) {
|
||||
iterated = true;
|
||||
self
|
||||
.coordinator
|
||||
.publish_batch(batch)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't publish Batch: {e:?}"))?;
|
||||
}
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
// Publish the signed Batches
|
||||
{
|
||||
let mut txn = self.db.txn();
|
||||
// The last acknowledged Batch may exceed the last Batch we published if we didn't sign for
|
||||
// the prior Batch(es) (and accordingly didn't publish them)
|
||||
let last_batch =
|
||||
crate::batch::last_acknowledged_batch(&txn).max(db::LastPublishedBatch::get(&txn));
|
||||
let mut next_batch = last_batch.map_or(0, |id| id + 1);
|
||||
while let Some(batch) = crate::batch::signed_batch(&txn, next_batch) {
|
||||
iterated = true;
|
||||
db::LastPublishedBatch::set(&mut txn, &batch.batch.id);
|
||||
self
|
||||
.coordinator
|
||||
.publish_signed_batch(batch)
|
||||
.await
|
||||
.map_err(|e| format!("couldn't publish Batch: {e:?}"))?;
|
||||
next_batch += 1;
|
||||
}
|
||||
txn.commit();
|
||||
}
|
||||
|
||||
Ok(iterated)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user