fix: boucle de retry infinie — _retry_pending écrasé par l'envoi d'action
Bug : _schedule_retry stockait retry_count=N dans _retry_pending, mais l'envoi de l'action (ligne 2173) écrasait avec retry_count=0. Résultat : le retry_count retombait toujours à 0, la condition retry_count < 3 restait vraie → boucle infinie de retries. Corrections : - Ne pas écraser _retry_pending si l'entrée existe déjà (set par _schedule_retry) - Guard de sécurité : extraire retry_count depuis les suffixes _retry de l'action_id Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -2168,8 +2168,9 @@ async def get_next_action(session_id: str, machine_id: str = "default"):
|
||||
# Else: queue a changé entre temps (race condition bénigne), on envoie quand même
|
||||
|
||||
# Sauvegarder l'action envoyée pour le retry (si la vérification échoue)
|
||||
# NE PAS écraser si _schedule_retry a déjà mis le bon retry_count
|
||||
action_id_sent = action.get("action_id", "")
|
||||
if action_id_sent:
|
||||
if action_id_sent and action_id_sent not in _retry_pending:
|
||||
_retry_pending[action_id_sent] = {
|
||||
"action": dict(action),
|
||||
"retry_count": 0,
|
||||
@@ -2228,6 +2229,18 @@ async def report_action_result(report: ReplayResultReport):
|
||||
retry_count = retry_info["retry_count"] if retry_info else 0
|
||||
original_action = retry_info["action"] if retry_info else None
|
||||
|
||||
# Guard de sécurité : détecter le retry_count depuis l'action_id si non trouvé
|
||||
# Évite la boucle infinie si _retry_pending est désynchronisé
|
||||
if retry_count == 0 and "_retry" in action_id:
|
||||
import re
|
||||
retry_suffixes = re.findall(r"_retry\d+", action_id)
|
||||
retry_count = max(retry_count, len(retry_suffixes))
|
||||
if retry_count > 0:
|
||||
logger.warning(
|
||||
f"retry_count corrigé par action_id : {retry_count} "
|
||||
f"(action_id contient {len(retry_suffixes)} suffixes _retry)"
|
||||
)
|
||||
|
||||
# Mettre à jour le dernier screenshot reçu
|
||||
screenshot_after = report.screenshot_after or report.screenshot
|
||||
if screenshot_after:
|
||||
|
||||
Reference in New Issue
Block a user