Go로 PostgreSQL 프록시 만들기 (53) - QA 4차: 라우팅 우회와 운영 안전성
Prepared statement 재사용으로 read-only를 우회하는 버그, side-effectful SELECT의 잘못된 라우팅, extended query timeout 사각지대 등 QA 4차에서 발견된 5건의 버그를 분석하고 수정한다.
Prepared statement 재사용으로 read-only를 우회하는 버그, side-effectful SELECT의 잘못된 라우팅, extended query timeout 사각지대 등 QA 4차에서 발견된 5건의 버그를 분석하고 수정한다.
QA 4차 수정으로 dataapi.New 시그니처가 바뀌었지만 테스트가 따라가지 못해 컴파일이 깨졌고, watcher 테스트는 time.Sleep 의존으로 race detector에서 간헐 실패했다. 릴리즈 파이프라인을 막는 2건의 테스트 블로커를 수정한다.
앞쪽 주석(/*x*/ BEGIN)이 트랜잭션/세션 상태기를 통째로 우회하고, MERGE·COPY·CALL이 reader로 빠지며, 주석/리터럴 안의 키워드가 false positive를 내는 5건의 파서·라우터 버그를 수정한다.
v1.0.0 릴리즈 직전, 전체 코드베이스를 엣지케이스까지 훑어 CopyBoth 고루틴 race, 캐시 인덱스 정합성 파손, Synthesizer 메모리 고갈 등 14건을 수정한다.
7차 QA를 마치고 릴리즈 체크리스트를 점검한다. CHANGELOG.md를 작성하고, README와 코드 간 9곳의 불일치를 해소한다.
Audit log, OpenTelemetry span, slog, webhook 등 모든 외부 노출 경로에서 SQL 리터럴을 자동 마스킹하는 SQL Redaction 모듈을 구현한다.
Admin API를 통해 런타임 유지보수 모드를 활성화하여 신규 연결/쿼리를 거부하고, 진행 중인 트랜잭션은 안전하게 drain하는 기능을 구현한다.
Admin API를 통해 런타임 read-only 모드를 활성화하여 모든 쓰기 쿼리를 프록시 레벨에서 즉시 거부하고, 읽기 서비스는 유지하는 기능을 구현한다.
릴리스 전 하위호환 부채를 청산한다. top-level writer/readers와 databases 맵의 이중 설정 구조를 databases 단일 포맷으로 통합하고, 합성 shim과 분기 로직을 제거한다.
Transaction pooling 환경에서 LISTEN, 세션 SET, DECLARE CURSOR 같은 세션 의존 기능을 감지하고, block/warn/pin 모드로 제어하는 Session Compatibility Guard를 구현한다.