Skip to content

다른 테스트의 임대가 격리 수렴 검사를 막던 문제 수리 — #1495 (2026-09-10)

  • 기간: 2026-09-10. 오너 지시: “그러면 이슈 만들어서 수정하고 17.9에 반영해줘”.
  • 랜딩: 이슈 #1495, 앱 PR #1496·head 4d41b223release/v0.17.9 병합 10d4df67(2026-09-10 03:26:07 KST). 사전검증·Merge Check 각 1회 통과. staging·main·Production에는 아직 반영하지 않음. 제품 SQL·DB migration·Edge 변경 없음.
  • 설계서: 없음(수리 건).
  • 정본: BUG-090. 앱의 격리 수렴 probe와 실제 PostgreSQL snapshot 회귀 검사.
  • 도구: 기존 pg_dump·psql과 로컬 precheck. 다른 담당자의 DB·PR·큐 상태는 수정하지 않는다.
  • 게이트: 전용 PostgreSQL 17.6의 실제 dump·restore 회귀에서 수정 전 실패(6.8초), 수정 후 1건 통과·실패 0·skip 0(7.6초). 앱 precheck 1회 5분 33초 통과: 정적·단위 3,421건·DB reset/schema·pgTAP 130파일/2,328단언·실제 DB 회귀 15건·격리 수렴 probe. 일반 release 통합은 Merge Check를 사용한다.
  • 버그리포트: BUG-090 — 격리 통계 수렴 검사가 다른 테스트의 임대를 복사해 시작에 실패함.
  • 계약: 제품 계산·데이터 계약 변경 없음. 격리 probe의 복사 입력에서 원본 작업 상태를 제외한다.

Phase 현황

Phase내용상태
Phase 1원본 작업 상태 복사 제외·DB 회귀·v0.17.9 통합완료 — PR #1496, release 병합 10d4df67

1. 배경

오너가 #1454의 precheck 실패 설명을 전달했다. 약 8분 5초 검증의 마지막 단계에서 fixture의 통계 작업을 시작하지 못했다. 실패 로그의 직접 관측과 “당시 활성 임대가 정확히 2개였다”는 설명을 구분해 검토했다.

2. 문제 제기

격리 DB를 만들 때 원본의 큐·세대·임대 행까지 복사했다. 이를 처리할 cron·worker가 없는 복사본에서도 활성 임대는 전역 실행 슬롯을 차지하므로, 격리 검사가 원본 테스트의 실행 시점에 영향을 받았다. 상세 인과와 로그의 한계는 BUG-090 §1·2에 기록했다.

3. 해결 방안

D1(2026-09-10): 오너의 v0.17.9 반영 지시에 따라 #1454의 기존 세 표 복사 제외 수정만 재사용하고 실제 DB 회귀를 보완한다. 재시도·임대 만료 대기는 원인을 남기며, 제품 슬롯 제한 변경은 범위 밖이므로 채택하지 않았다.

4. 적용한 내용

큐·세대·임대 세 표의 데이터만 dump에서 제외한다. 스키마·제약·나머지 데이터와 원본 DB를 보존하며 fixture가 자기 작업 상태를 생성한다. 기존 수정은 커밋 79589cbb로 재사용했고, 4d41b223에서 probe와 회귀가 같은 snapshot 함수를 사용하게 하며 실제 PostgreSQL 회귀를 기존 로컬·GitHub DB 검사에 연결했다. #1454의 D04 제품 로직은 이 수리에 포함하지 않는다.

회귀는 원본에 세 표의 행과 활성 임대를 각각 2개 준비한다. 복사 제외 옵션을 제거한 수정 전 조건에서 실패하고 복구 후 통과했으며, 원본 상태·계산 입력과 복사본 FK·CHECK 제약도 보존됐다. 전용 검사용 DB·컨테이너는 정리했다. 오너의 중복 CI 최소화 지시에 따라 정적·단위 검사를 포함하는 precheck 1회로 검사하며, 별도 npm run check 전체 반복이나 브라우저 full은 실행하지 않는다.

5. 적용 결과

항목전 → 후 / 확인 상태
복사본의 원본 작업 상태큐·세대·임대 각 2개 → 각 0개. 실제 PostgreSQL 17.6 dump·restore로 확인
활성 임대 2개를 가진 원본의 snapshot복사본 활성 임대 2개 → 0개. 원본 상태·계산 입력 불변, 복사본 FK·CHECK 제약 보존·새 fixture 작업 생성 확인
DB 회귀수정 전 1건 실패(6.8초) → 수정 후 1건 통과·실패 0·skip 0(7.6초)
기존 수렴·취소 검증기존 단언 유지. 660세션·7,920세트, 저장(create 54ms·update 40ms·delete 19ms)·영수증 각 1개·오래된 결과 폐기·재계산 수렴·취소 57014·임대 교체 통과. probe 88,535ms, ok·cleanedUp 모두 true
앱 precheckhead 4d41b223·base 6afe58ec, local-1788977915593-44680, 2026-09-10 03:18:35~03:24:07 KST. 1회 332,956ms(5분 33초) 통과. 정적·단위 3,421건(실패 0·조건부 skip 31), pgTAP 130파일/2,328단언, 실제 DB 회귀 15건(실패 0·skip 0). 샌드박스 정리 성공. 브라우저 full 미실행
문서 검사npm run check: 약관 4버전·로컬 경로 309개 통과. build:docs: 29.42초 통과. check:docs-artifact: 자산 31개 통과
Merge Check실행 34388890267, 정상 1회·잡 52초 성공. ci.full=false, mode=integration, migration 0파일. 실행 생성 03:25:18~최종 갱신 03:26:17 KST
v0.17.9 반영PR #1496, 03:26:07 KST release 병합 10d4df67. 원격 release의 커밋·tree 2b31b659ed8fbac38fdf6e09bb2310934547b3de 일치 확인. staging·main·Production에는 아직 반영하지 않음

6. 이번 개선으로 향상된 것

격리 수렴 검사가 원본에서 다른 테스트가 남긴 실행 상태에 좌우되지 않도록 시작 조건을 고정한다. 단순 재시도 횟수나 제품의 동시 실행 제한을 바꾸지 않고 검증 입력의 오염을 제거한다. 전체 CI 속도나 사용자 통계 게시 시간의 개선 수치는 이번 수리에서 측정하지 않는다.