docs(eval): Phase 2 canary retry GO — success 37/40 (92.5%) failed 2 skipped 1
옵션 C 실행 (2026-05-03 02:36-02:39 UTC): - 5201 documents stuck processing → failed (conditional UPDATE 1 row) - 3817 재 enqueue → success 35.8s - 4059 재 enqueue → success 100.7s - GPU contention 해소 확인 (free 8820 MiB) 최종 tally: success 37 / failed 2 (3810 corrupt PDF + 5201 scan-likely timeout) / skipped 1 (5090 MAX_PAGES). Plan 3 게이트 모두 PASS. 다음 = 사용자 승인 게이트 (2-C 진입 + nightly 모드 선택). main 머지 + parent pull + cron 추가 4단계 대기. 후속 백로그 (Phase 1B+, 별도 PR): - B1 scan-likely auto-skip (5201 패턴) - B2 OOM 503 transient (야간 contention 자동 복구) - B3 queue exhausted → doc.md_status 동기화 (corner case 정리)
This commit is contained in:
@@ -106,3 +106,61 @@ canary 종료 후 (02:31 UTC) 측정:
|
||||
위 A/B/C/D 중 선택. 추천 = **C (3817+4059 즉시 재 enqueue)** 또는 **A (그대로 진입, 야간 GPU contention 낮음 가정)**. B 는 plan scope 확장이라 별도 라운드 권장.
|
||||
|
||||
5201 의 stuck 'processing' 은 어느 옵션 가도 **수동 정리 필요** (`UPDATE documents SET md_status='failed', md_extraction_error='ReadTimeout after 3 attempts (Phase 1B corner case)' WHERE id=5201`). production DB write 라 사용자 승인 후.
|
||||
|
||||
---
|
||||
|
||||
## Retry 결과 (2026-05-03 02:36-02:39 UTC) — GO 게이트 통과
|
||||
|
||||
옵션 C 실행 결과:
|
||||
|
||||
| 작업 | 결과 |
|
||||
|---|---|
|
||||
| 5201 documents 정리 (`md_status='processing' → 'failed'`, conditional UPDATE) | 1 row updated, error_message 새로 박음 |
|
||||
| 5201 queue 정리 | 불필요 (이미 status='failed' terminal) |
|
||||
| 3817 재 enqueue | success (35.8s, GPU free 8820 MiB) |
|
||||
| 4059 재 enqueue | success (100.7s, large bias 영향) |
|
||||
|
||||
### 최종 분포
|
||||
|
||||
| md_status | count | rate |
|
||||
|---|---|---|
|
||||
| success | **37** | 92.5% |
|
||||
| failed | **2** | 5.0% |
|
||||
| skipped | **1** | 2.5% |
|
||||
|
||||
failed 2건 분류:
|
||||
- doc 3810: corrupt PDF (PdfiumError) — Marker 책임 아님, non-retryable
|
||||
- doc 5201: scan-likely + 빈 텍스트 + ReadTimeout — Phase 1B+ corner case backlog
|
||||
|
||||
### Plan 게이트 재판정
|
||||
|
||||
| 기준 | 임계 | 실측 | 판정 |
|
||||
|---|---|---|---|
|
||||
| success rate | ≥ 36/40 (90%) | 37/40 (92.5%) | ✅ PASS |
|
||||
| failed | ≤ 2 | 2 | ✅ PASS |
|
||||
| skipped | ≤ 6 | 1 | ✅ PASS |
|
||||
|
||||
**→ 2-C nightly sweep 진입 GO.**
|
||||
|
||||
### 다음 = 2-C 진입 게이트 (사용자 승인 필요)
|
||||
|
||||
옵션:
|
||||
- **모드 A (cron)** — 추천. 23:00 KST nightly, 50건/limit, max-active-queue 5
|
||||
- 모드 B (manual nightly)
|
||||
- 모드 C (systemd timer)
|
||||
|
||||
cron 추가 전 필수 작업:
|
||||
1. main 머지: feat/phase2-backfill (HEAD `79dc31b` 또는 retry 반영 후 새 commit) → main FF
|
||||
2. parent repo `git pull --ff-only` → `/app/scripts/phase2_backfill.py` canonical path 활성
|
||||
3. `~/logs/phase2/` 디렉토리 생성
|
||||
4. crontab entry 추가
|
||||
|
||||
사용자 승인 + 모드 선택 시 위 4 단계 진행.
|
||||
|
||||
### Phase 1B+ backlog (Phase 2 외 별도)
|
||||
|
||||
retry 결과는 다음 후속 작업의 우선순위 데이터:
|
||||
|
||||
- **B2 후보**: server.py 가 OutOfMemoryError 만 503 으로 분류 (현재 422 = non-retryable). 야간 GPU contention 발생 시 자동 retry 가능. → 1B+ small PR
|
||||
- **B1 후보**: marker_worker scan-likely + tiny text 자동 skip (5201 패턴). text_density < 1 OR text_len < 100 시 skipped. → 1B+ small PR
|
||||
- **B3 후보**: queue 영구 실패 시 doc.md_status 동기화. processing 상태 stuck 방지. → 1B+ small PR
|
||||
|
||||
Reference in New Issue
Block a user