Go로 PostgreSQL 프록시 만들기 (24) - 좀비 고루틴과 Dangling Pointer
pgmux에서 발견된 두 가지 CRITICAL 버그 — HTTP 클라이언트 끊김을 무시해 고루틴과 DB 커넥션이 영원히 블로킹되는 좀비 누수와, 핫-리로드 후 Admin/Data API가 닫힌 풀을 바라보는 Dangling Pointer — 를 분석하고 수정한다.
pgmux에서 발견된 두 가지 CRITICAL 버그 — HTTP 클라이언트 끊김을 무시해 고루틴과 DB 커넥션이 영원히 블로킹되는 좀비 누수와, 핫-리로드 후 Admin/Data API가 닫힌 풀을 바라보는 Dangling Pointer — 를 분석하고 수정한다.
2,259줄짜리 server.go를 역할별 9개 파일로 분리한 리팩토링 과정 — 왜 쪼개야 했는지, 어떤 기준으로 경계를 나눴는지, Go 패키지 내 파일 분리 전략을 정리한다.
QA에서 발견된 3가지 버그 — CancelRequest 무시, Graceful Shutdown 무한 대기, Balancer 데이터 레이스 — 의 원인 분석과 수정 과정을 정리한다.
QA에서 발견된 5가지 버그 — Data API 인증 stale, 캐시 전파 누락, ConfigMap symlink 미감지, Reload 주석 불일치, 테스트 race — 의 원인 분석과 수정 과정을 정리한다.
QA에서 발견된 2가지 버그 — /admin/reload 실패에도 HTTP 200 반환, 감사 로그 Webhook 고루틴 미추적으로 종료 시 유실 — 의 원인과 수정 과정을 정리한다.
WriteHeader 호출 이후 Content-Type이 사라지는 버그, SetReloadFunc data race, httptest.ResponseRecorder가 감지하지 못하는 회귀의 원인과 수정 과정을 정리한다.
QA 3차 리포트 5건 — AST 분류가 라우팅에 미반영, 캐시 테이블 무효화 no-op, 중복 파싱 5회/요청, 헬스체크 순차 지연, splitStatements 달러쿼팅 미처리 — 의 원인과 수정 과정을 정리한다.
QA 4차 리포트 5건 — 캐시 키 네임스페이스 부재로 JSON/wire 응답 충돌, 읽기 캐시 무효화 실종, balancer 상태 초기화, HTTP 서버 lifecycle 미관리, AST 재파싱 — 의 원인과 수정 과정을 정리한다.
프로덕션 쿼리를 Shadow DB에 비동기 미러링하여 패턴별 P50/P99 레이턴시를 비교하고 성능 회귀를 자동 감지하는 기능을 구현한다. PgBouncer에 없는 pgmux만의 킬러 피처.
사용량 계량, 실시간 쿼터 차단, 월말 청구 정산을 분리·연결해서 운영하는 실무 아키텍처와 의사결정 기준을 정리합니다.