use aion_proto::generated;
use crate::worker::dispatch::ActivityCompletion;
use super::WorkerSession;
pub(super) fn handle_task_refusal(session: &WorkerSession<'_>, refusal: generated::TaskRefused) {
let (Some(workflow_id), Some(activity_id)) = (refusal.workflow_id, refusal.activity_id) else {
tracing::error!(
worker_id = ?session.worker_id,
reason = refusal.reason,
"malformed task-refusal frame: it names no activity, so there is nothing to re-park"
);
return;
};
let workflow_id = match aion_core::WorkflowId::try_from(aion_proto::ProtoWorkflowId {
uuid: workflow_id.uuid,
}) {
Ok(workflow_id) => workflow_id,
Err(error) => {
tracing::error!(
worker_id = ?session.worker_id,
%error,
"malformed task-refusal frame: its workflow id could not be decoded"
);
return;
}
};
let activity_id = aion_core::ActivityId::from(aion_proto::ProtoActivityId {
sequence_position: activity_id.sequence_position,
});
let completion_token = match crate::worker::CompletionToken::from_wire(
&workflow_id,
&activity_id,
refusal.completion_token,
) {
Ok(token) => token,
Err(error) => {
tracing::error!(
worker_id = ?session.worker_id,
workflow_id = %workflow_id,
activity_id = %activity_id,
%error,
"task refusal carries no usable execution-generation token; leaving the dispatch to its other resolutions rather than re-parking it unfenced"
);
return;
}
};
let after_accept = || {
let _ = crate::worker::bridge::clear_completed_task_tracking(
session.heartbeat,
session.registry,
session.worker_id,
&workflow_id,
&activity_id,
);
Ok(())
};
if let Err(error) = session.pending.complete_activity_after_accept(
ActivityCompletion {
workflow_id: workflow_id.clone(),
activity_id: activity_id.clone(),
run_id: None,
completion_token,
outcome: crate::worker::ActivityCompletionOutcome::Refused {
worker_id: session.worker_id,
reason: refusal.reason,
},
},
after_accept,
) {
tracing::error!(
worker_id = ?session.worker_id,
workflow_id = %workflow_id,
activity_id = %activity_id,
%error,
"task refusal rejected by execution-generation proof; it is from a generation this site has already moved past and re-parking it would displace the attempt that superseded it"
);
}
}