Skip to content

fix(temporal): tolérer une tâche périmée sur les réponses du worker d'activité - #32

Merged
gplanchat merged 1 commit into
mainfrom
fix/temporal-stale-activity-task
Aug 26, 2026
Merged

fix(temporal): tolérer une tâche périmée sur les réponses du worker d'activité#32
gplanchat merged 1 commit into
mainfrom
fix/temporal-stale-activity-task

Conversation

@gplanchat

@gplanchat gplanchat commented Aug 26, 2026

Copy link
Copy Markdown
Owner

Extrait de la PR #21, réécrit pour main.

Le bug

RespondActivityTask{Completed,Failed,Canceled} pour une tâche dont l'activité a expiré, ou dont le workflow est déjà clos, renvoie gRPC NOT_FOUND (5) : le serveur ne suit plus cette tâche. C'est bénin — mais GrpcUnary::wait() lève, et l'exception remonte jusqu'à tuer la boucle de poll du worker d'activité.

WorkflowTaskProcessor::respond() traite déjà ce cas côté workflow (if (5 === $code) { return; }). Le worker d'activité, non.

Le correctif

Les trois réponses passent par ignoringStaleTask(), qui avale NOT_FOUND et repropage tout le reste.

Pour le distinguer, GrpcUnary reporte le code gRPC dans le code de l'exception au lieu de l'enfouir dans le message — sans quoi il faudrait analyser une chaîne de caractères.

Origine

Reprise de 832da9a (branche origin/backup/pr21-wip), pas un cherry-pick : cette branche reposait sur une hiérarchie TemporalProtocolException qui n'existe pas sur main. La logique et les tests ont été réécrits sur l'existant (\RuntimeException + code gRPC), et les métadonnées PHPUnit passées en attributs comme le reste de la suite.

Vérifications

  • 4 nouveaux tests (TemporalActivityWorkerTest) : NOT_FOUND avalé, toute autre erreur gRPC repropagée, réponse OK sans exception, poll vide sans réponse. Le statut gRPC est piloté via un WorkflowServiceClient mocké.
  • Suite complète : 308 tests verts. PHP-CS-Fixer, PHPStan et Psalm verts.

…'activité

RespondActivityTask{Completed,Failed,Canceled} pour une tâche dont
l'activité a expiré ou dont le workflow est déjà clos renvoie NOT_FOUND
(gRPC 5). Le serveur ne suit plus la tâche : c'est bénin, et cela ne doit
pas tuer la boucle de poll. Les trois réponses passent par
ignoringStaleTask(), à l'image du traitement déjà présent dans
WorkflowTaskProcessor::respond().

GrpcUnary reporte désormais le code gRPC dans le code de l'exception :
sans lui, distinguer NOT_FOUND du reste passerait par l'analyse du
message d'erreur.

Reprise de 832da9a (branche backup/pr21-wip), réécrit : cette branche
reposait sur une hiérarchie TemporalProtocolException qui n'existe pas
sur main.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@gplanchat gplanchat closed this Aug 26, 2026
@gplanchat gplanchat reopened this Aug 26, 2026
@gplanchat
gplanchat merged commit f49142e into main Aug 26, 2026
13 of 26 checks passed
@gplanchat
gplanchat deleted the fix/temporal-stale-activity-task branch August 26, 2026 18:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant