Skip to content

1.10e1

Latest

Choose a tag to compare

@assam258-5892 assam258-5892 released this 16 Apr 00:27
· 17 commits to master since this release

Release Notes: pg_store_plans 1.10e1

주요 변경 사항

1. PostgreSQL 버전별 지원 및 호환성 보강

  • 업그레이드 경로
    • 1.9e1 → 1.10e1 업그레이드 지원 (pg_store_plans--1.9e1--1.10e1.sql 제공)
  • 지원 버전
    • 1.10e1: PostgreSQL 14~18 전 버전에 걸친 호환성 안정화
    • 1.9e1: PostgreSQL 16 이하 및 17 모두 지원
  • PostgreSQL 18 토큰 타입 분리 (upstream 1.10 결함 수정)
    • upstream 1.10이 PG17 분기를 PG18까지 그대로 확장하여 PG18에서 NULL, TRUE, FALSE, LOCALTIME(STAMP) 상수의 정규화에 실패, 동일 logical plan에 대해 planid가 불안정해져 중복 plan entry가 생성됨
    • 1.10e1은 PG17/PG18 분기를 분리하고 PG18 전용 토큰 값을 적용하여 정규화 동작 복원
  • PG14~17용 대체 expected 파일 갱신
    • 1.10의 PG18 지원 커밋이 store.out만 갱신하고 store_2.out에 stale Async Capable: false 라인을 남겨 PG14~17 빌드에서 make check가 실패
    • PG14~17 환경에서 캡처한 출력으로 store_2.out 교체

2. 1.9e1 보고 결함 중 upstream 1.10에 미반영되어 재이식한 항목

1.9e1에서 보고·수정한 결함들이 upstream 1.10에는 반영되지 않아 동일 결함이 잔존함. 1.10e1은 다음 패치들을 1.10 코드 베이스에 다시 이식함.

  • Coverity가 검출한 메모리 누수 수정 (1.9e1의 ff976a5 → 1.10e1의 da27333)

    • 1.9e1 시점의 누수 패턴이 1.10에도 여전히 존재하여 동일 위치들에 재적용
    • pgsp_shmem_startup의 num 범위 검증, pgsp_shmem_shutdown 및 pg_store_plans_internal의 pbuffer free 보강
  • 해시 키 초기화되지 않은 메모리 사용 수정 (1.9e1의 53101a1 → 1.10e1의 bfeecba)

    • upstream에 미반영 상태로 1.10에서도 동일 잠재 결함이 잔존
    • pgsp_store의 키 할당 직전 memset으로 padding까지 0 초기화

참고로 다음 1.9e1 패치는 upstream에서 동등한 형태로 처리되어 1.10e1에서는 별도 재이식이 불필요했음.

  • plan text read 실패 방지(c3557f8) → upstream d92665d ("Guard against NULL result from ptext fetch")로 동일 위치에 동일한 NULL 가드가 추가됨
  • PG 17 이전 버전 호환성 확보(1c38939) → upstream 1.10이 PG14~18 다중 버전 지원을 자체적으로 재구성 (a92efda + 0200b32 + e54c9f1)

3. 1.10e1에서 신규로 발견 및 수정한 결함

  • GROUPING SETS의 sort key 메모리 누수 수정 (68e0977)

    • pgsp_json_text.c의 json_text_objend에서 sort key를 libc strdup으로 복사
    • 상위 grouping_set은 palloc 메모리 컨텍스트로 관리되어 컨텍스트 reset 시 해제되지만, sort_keys는 컨텍스트 외부의 malloc 영역이라 함께 해제되지 않고 누수
    • GROUPING SETS와 ORDER BY를 함께 사용하는 plan에 대해 pg_store_plans 조회마다 누수 발생
    • 동일 함수 내 다른 세 군데와 동일하게 pstrdup으로 변경하여 해결
  • _PG_fini에서 shmem_request_hook 복원 누락 수정 (d0f9a5c)

    • PG15 이상에서 _PG_init이 이전 shmem_request_hook을 보관하고 pgsp_shmem_request를 설치하지만, _PG_fini에 대응되는 복원 코드가 없었음
    • 모듈 언로드 후에도 hook chain이 사라진 함수를 가리켜 dangling pointer가 되는 문제 발생 가능
    • _PG_fini에 동일 PG15+ 가드(PG_VERSION_NUM >= 150000)로 shmem_request_hook = prev_shmem_request_hook 추가
  • macOS 빌드 및 in-tree make check 수정 (393390f)

    • macOS의 ld는 --build-id를 지원하지 않으므로 Darwin에서 해당 LDFLAG 제외 (기존 SunOS 제외 분기에 추가)
    • 회귀 테스트의 regress.conf가 shared_preload_libraries에 pg_stat_statements를 요구하므로, in-tree 빌드 시 자동 설치되도록 EXTRA_INSTALL = contrib/pg_stat_statements 선언
    • 빌드 산출물과 테스트 출력 제외를 위한 .gitignore 추가

4. 다운스트림 운영 정책에 따른 기본값 변경 (a601bd0)

결함 수정이 아닌, downstream 운영 환경에 맞춘 기본값 조정. 1.9e1에서 적용한 정책을 1.10 코드 베이스에 그대로 이어감.

  • pg_store_plans.max: 1000 → 5000
  • pg_store_plans.min_duration: 0ms → 10ms
  • pg_store_plans.log_timing: on → off
  • 회귀 테스트가 새 기본 필터의 영향을 받지 않도록 regress.conf에 pg_store_plans.min_duration = 0 추가

업그레이드 절차

  1. PostgreSQL에서 아래 명령 실행

    ALTER EXTENSION pg_store_plans UPDATE TO '1.10e1';
  2. 업그레이드 시 내부 동작

    • 기존 pg_store_plans() 함수를 1.10 C 진입점(pg_store_plans_1_10)에 재바인딩
    • CREATE OR REPLACE FUNCTION을 사용하므로 기존 뷰(pg_store_plans)와 사용자 정의 종속 객체(뷰, 함수)는 그대로 유지
    • PostgreSQL 버전에 따라 적절한 컬럼 시그니처로 함수 재정의
      • PostgreSQL 17 이상: shared_blk_read_time, shared_blk_write_time, local_blk_read_time, local_blk_write_time, temp_blk_read_time, temp_blk_write_time 컬럼 포함
      • PostgreSQL 16 이하: 기존 통합 blk_read_time, blk_write_time 컬럼 유지