v0.3.13-pre.008

This commit is contained in:
2026-09-10 17:52:35 +02:00
parent 8bb530e9b4
commit 1f2720463b
18 changed files with 899 additions and 36 deletions

View File

@@ -1,5 +1,5 @@
// file: crates/ksp-worker-raw-transaction-ingest-lib/src/runtime.rs
// version: 14
// version: 15
type PersistencePort = std::sync::Arc<dyn crate::RawTransactionIngestPersistencePort + 'static>;
type PersistenceTasks = tokio::task::JoinSet<ksp_core_lib::Result<crate::RawTransactionIngestPersistenceOutcome>>;
@@ -189,6 +189,7 @@ async fn drain_admission_and_persistence(
lifecycle: &ksp_worker_api::WorkerLifecycle,
admission: &mut crate::RawTransactionAdmission,
persistence: &mut PersistenceTasks,
persistence_convergence: &std::sync::Arc<crate::RawTransactionIngestPersistenceConvergence>,
port: &std::option::Option<PersistencePort>,
snapshots: &mut crate::RawTransactionIngestSnapshotPublisher,
) -> std::option::Option<ksp_core_lib::ErrorCode> {
@@ -207,7 +208,7 @@ async fn drain_admission_and_persistence(
let backpressure_wait_observed = admission.take_backpressure_wait_observed();
match received {
std::result::Result::Ok(std::option::Option::Some(acquisition)) => {
let spawned = spawn_persistence(persistence, port, acquisition);
let spawned = spawn_persistence(persistence, persistence_convergence, port, acquisition);
let published = snapshots.record_admission_success(lifecycle.state(), admission.queue_depth(), persistence.len(), backpressure_wait_observed);
if !spawned && fault.is_none() {
fault = std::option::Option::Some(crate::ERROR_CODE_RAW_TRANSACTION_INGEST_RUNTIME_INVALID);
@@ -247,11 +248,12 @@ async fn drain_owned_work(
children: &mut SourceTasks,
admission: &mut crate::RawTransactionAdmission,
persistence: &mut PersistenceTasks,
persistence_convergence: &std::sync::Arc<crate::RawTransactionIngestPersistenceConvergence>,
port: &std::option::Option<PersistencePort>,
snapshots: &mut crate::RawTransactionIngestSnapshotPublisher,
) -> std::option::Option<ksp_core_lib::ErrorCode> {
let drain = async {
let mut fault = drain_admission_and_persistence(settings, lifecycle, admission, persistence, port, snapshots).await;
let mut fault = drain_admission_and_persistence(settings, lifecycle, admission, persistence, persistence_convergence, port, snapshots).await;
let child_fault = drain_children(lifecycle.state(), children, snapshots).await;
fault = merge_fault(fault, child_fault);
return fault;
@@ -380,6 +382,9 @@ async fn run_supervisor<Spawner>(
}
let mut children = SourceTasks::new();
let mut persistence = PersistenceTasks::new();
let persistence_convergence = std::sync::Arc::new(crate::RawTransactionIngestPersistenceConvergence::new(
settings.admission_queue_capacity().max(settings.persistence_concurrency()),
));
let (source_stop_sender, source_stop_receiver) = tokio::sync::watch::channel(false);
let (mut admission, admission_sender) = crate::RawTransactionAdmission::new(settings.admission_queue_capacity());
source_spawner(&mut children, source_stop_receiver, admission_sender);
@@ -391,6 +396,7 @@ async fn run_supervisor<Spawner>(
&mut children,
&mut admission,
&mut persistence,
&persistence_convergence,
&port,
&mut snapshots,
&mut processing_frontier_receiver,
@@ -399,7 +405,8 @@ async fn run_supervisor<Spawner>(
source_stop_sender.send_replace(true);
let stopping_fault = begin_stopping(&mut lifecycle, &mut snapshots, admission.queue_depth(), persistence.len());
fault = merge_fault(fault, stopping_fault);
let drain_fault = drain_owned_work(&settings, &lifecycle, &mut children, &mut admission, &mut persistence, &port, &mut snapshots).await;
let drain_fault =
drain_owned_work(&settings, &lifecycle, &mut children, &mut admission, &mut persistence, &persistence_convergence, &port, &mut snapshots).await;
match drain_fault {
std::option::Option::Some(code) if code == crate::ERROR_CODE_RAW_TRANSACTION_INGEST_DRAIN_TIMEOUT => {
fault = std::option::Option::Some(code);
@@ -418,6 +425,7 @@ async fn run_supervisor<Spawner>(
fn spawn_persistence(
persistence: &mut PersistenceTasks,
persistence_convergence: &std::sync::Arc<crate::RawTransactionIngestPersistenceConvergence>,
port: &std::option::Option<PersistencePort>,
acquisition: ksp_raw_transaction_lib::RawTransactionAcquisition,
) -> bool {
@@ -425,8 +433,9 @@ fn spawn_persistence(
std::option::Option::Some(value) => std::sync::Arc::clone(value),
std::option::Option::None => return false,
};
let persistence_convergence = std::sync::Arc::clone(persistence_convergence);
let _abort_handle = persistence.spawn(async move {
return crate::persist_raw_transaction_ingest_acquisition(port.as_ref(), acquisition).await;
return crate::persist_raw_transaction_ingest_converged_acquisition(port.as_ref(), acquisition, persistence_convergence.as_ref()).await;
});
return true;
}
@@ -507,6 +516,7 @@ async fn supervise_until_stop(
children: &mut SourceTasks,
admission: &mut crate::RawTransactionAdmission,
persistence: &mut PersistenceTasks,
persistence_convergence: &std::sync::Arc<crate::RawTransactionIngestPersistenceConvergence>,
port: &std::option::Option<PersistencePort>,
snapshots: &mut crate::RawTransactionIngestSnapshotPublisher,
processing_frontier_receiver: &mut std::option::Option<ProcessingFrontierReceiver>,
@@ -578,7 +588,7 @@ async fn supervise_until_stop(
match received {
std::result::Result::Ok(std::option::Option::Some(acquisition)) => {
let backpressure_wait_observed = admission.take_backpressure_wait_observed();
let spawned = spawn_persistence(persistence, port, acquisition);
let spawned = spawn_persistence(persistence, persistence_convergence, port, acquisition);
let published = snapshots.record_admission_success(
lifecycle.state(),
admission.queue_depth(),