test(db): 실패한 테스트가 프로세스를 붙잡지 않게 한다 - #6
Merged
Merged
Conversation
빨간 테스트가 25분 타임아웃으로 둔갑하고 있었다. 느려진 게 아니라 멈춘 것이다.
mysql·postgres·batch 테스트가 전부 이 모양이었다.
const db = await freshDb();
...
expect(results[0]?.changes).toBe(0); // ← 여기서 던지면
await db.close(); // ← 이 줄은 실행되지 않는다
단언이 하나 깨지면 풀이 살아남고, 열린 핸들이 이벤트 루프를 붙잡아 node 가 종료하지
못한다. `--test-timeout=20000` 은 이걸 못 잡는다 — 멈추는 곳이 테스트 안이 아니라
**모든 테스트가 끝난 뒤 프로세스 종료 시점**이기 때문이다.
실측(MySQL 8, 로컬):
수정 전 스위트 5.6초 종료 · 프로세스는 90초 상한에서 SIGKILL
수정 후 6초 · 종료코드 1 · 실패 내용 그대로 출력
CI 에서는 2026-08-24 부터 이 상태였다(마지막 초록은 c07e7ec). 25분을 채우고 죽으니
무엇이 깨졌는지는 로그 끝에서 잘려 보이지도 않았다. 브랜치 보호가 없어 빨간 CI 가
아무것도 막지 않았으므로 아무도 눈치채지 못했다.
테스트 본문을 전부 try/finally 로 고치는 대신 여는 자리에서 등록하고 `afterEach` 에서
닫는다 — 새 테스트가 추가돼도 규율을 다시 지킬 필요가 없다. 정리 중의 예외는 삼킨다:
정리가 실패를 가리면 안 되고, 판정은 테스트가 한다.
`pool-error.test.ts` 는 처음부터 try/finally 로 이걸 지키고 있었다. 집안 관례가 이미
있었고 나머지가 안 따랐다.
이 PR 은 `insertIgnore` 실패 자체는 고치지 않는다 — 그건 MySQL 의 changes 계약 문제라
따로 간다. 여기서 바뀌는 것은 그 실패가 **25분이 아니라 6초 만에 보인다**는 것이다.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
mack-erel
force-pushed
the
fix/db-test-pool-leak
branch
from
August 26, 2026 04:50
a737201 to
d02a070
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
무엇이 문제였나
빨간 테스트가 25분 타임아웃으로 둔갑하고 있었다. CI 가 느려진 게 아니라 멈춘 것이다.
mysql·postgres·batch테스트가 전부 이 모양이었다.단언이 하나 깨지면 풀이 살아남고, 열린 핸들이 이벤트 루프를 붙잡아 node 가 종료하지 못한다.
--test-timeout=20000은 이걸 못 잡는다 — 멈추는 곳이 테스트 안이 아니라 모든 테스트가끝난 뒤 프로세스 종료 시점이기 때문이다.
실측 (MySQL 8, 로컬)
왜 아무도 몰랐나
CI 는 2026-08-24 부터 이 상태였다(마지막 초록
c07e7ec). 25분을 채우고 죽으니 무엇이깨졌는지는 로그 끝에서 잘려 보이지도 않았고, 브랜치 보호가 없어 빨간 CI 가 아무것도
막지 않았다.
접근
테스트 본문을 전부
try/finally로 고치는 대신 여는 자리에서 등록하고afterEach에서닫는다 — 새 테스트가 추가돼도 규율을 다시 지킬 필요가 없다. 정리 중의 예외는 삼킨다:
정리가 실패를 가리면 안 되고, 판정은 테스트가 한다.
pool-error.test.ts는 처음부터try/finally로 이걸 지키고 있었다 — 집안 관례가 이미있었고 나머지가 안 따랐다. 그래서 그 파일은 건드리지 않았다.
insertIgnore: 중복이어도 배치 생존은 여전히 실패한다. 그건 MySQL 의changes계약문제라 따로 간다. 여기서 바뀌는 것은 그 실패가 25분이 아니라 6초 만에 보인다는 것이다.
🤖 Generated with Claude Code