orch/engine/subscribers/
unblock.rs1use crate::backends::ExternalBackend;
4use crate::engine::events::TaskEvent;
5use crate::engine::tasks::TaskManager;
6use crate::store::TaskStore;
7use std::sync::Arc;
8use tokio::sync::broadcast;
9
10pub fn spawn(
16 mut rx: broadcast::Receiver<TaskEvent>,
17 backend: Arc<dyn ExternalBackend>,
18 task_manager: Arc<TaskManager>,
19 store: Arc<TaskStore>,
20 repo: String,
21) {
22 tokio::spawn(async move {
23 loop {
24 match rx.recv().await {
25 Ok(event) if event.new_status == "done" && event.repo == repo => {
26 tracing::info!(
27 task_id = event.task_id,
28 "event-driven parent unblock triggered"
29 );
30 if let Err(e) = crate::engine::tick::tick_unblock_parents(
31 &backend,
32 &task_manager,
33 &store,
34 &repo,
35 )
36 .await
37 {
38 tracing::warn!(?e, "event-driven unblock failed (tick will retry)");
39 }
40 }
41 Ok(_) => {} Err(broadcast::error::RecvError::Lagged(n)) => {
43 tracing::debug!(n, "unblock subscriber lagged, tick will catch up");
44 }
45 Err(_) => break, }
47 }
48 });
49}