From dcfed095309909ae1902167ecdf474a8d606d642 Mon Sep 17 00:00:00 2001 From: hyungi Date: Mon, 29 Jun 2026 13:18:24 +0900 Subject: [PATCH] =?UTF-8?q?fix(workers):=20marker=20200-malformed=20json?= =?UTF-8?q?=20transient=20=EB=B6=84=EB=A5=98=20+=20classify=20summary=20?= =?UTF-8?q?=EA=B0=80=EC=8B=9C=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - marker_worker: resp.json() JSONDecodeError(200 응답 truncated/malformed body)가 catch-all except 로 _fail(non-retryable) 되던 것을 별도 except 로 raise → queue retry. transient 연결흔들림이 영구 failed 로 박히는 것 차단. - classify_worker: ai_summary fallback 비-deferrable 실패를 warning→error 로 격상. ai_summary NULL 완료는 digest/briefing 에서 조용히 제외되므로 운영 추적성 보강(best-effort 강등은 유지). Co-Authored-By: Claude Opus 4.8 (1M context) --- app/workers/classify_worker.py | 4 +++- app/workers/marker_worker.py | 5 +++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/app/workers/classify_worker.py b/app/workers/classify_worker.py index e2b8db6..a51e7e1 100644 --- a/app/workers/classify_worker.py +++ b/app/workers/classify_worker.py @@ -608,7 +608,9 @@ async def process( except Exception as exc: if legacy_cfg is not None and is_deferrable_error(exc): raise StageDeferred(f"macbook_unavailable:{type(exc).__name__}") from exc - logger.warning(f"[summary-fallback] id={document_id}: {exc}") + # ai_summary=NULL 로 완료되면 digest/briefing 이 조용히 제외 → ERROR 로 가시화 + # (best-effort 강등 자체는 유지, 운영 추적성만 보강). + logger.error(f"[summary-fallback] id={document_id} ai_summary 미생성: {exc}") finally: await client.close() diff --git a/app/workers/marker_worker.py b/app/workers/marker_worker.py index 228daa5..29a0e20 100644 --- a/app/workers/marker_worker.py +++ b/app/workers/marker_worker.py @@ -300,6 +300,11 @@ async def _process_single( f"[marker] transient error id={document_id} kind={type(exc).__name__}: {exc}" ) raise + except json.JSONDecodeError as exc: + # 200 응답의 truncated/malformed body — 연결 흔들림 등 transient. _fail(non-retryable) + # 로 박지 말고 raise → queue retry (max_attempts 까지). 진짜 손상이면 재시도 후 failed. + logger.warning(f"[marker] malformed json body (200) id={document_id}: {exc}") + raise except Exception as exc: logger.exception(f"[marker] unexpected error id={document_id}: {exc}") await _fail(session, document_id, str(exc)[:1000])