본문으로 건너뛰기

[PR #3449] raw_block checkpoint payload zlib 압축

[!tldr] 업무 관점 takeaway Daejun의 PR #3449는 checkpoint payload를 zlib으로 압축해 동일 ceiling 안에 ~5배 더 많은 인덱스 엔트리를 수용한다. 이로 인해 Std SSD(1.92~7.68TB)의 S2 overflow 문제가 사실상 해소됐다. HC SSD(15/30TB)는 여전히 ceiling에 닿는다. 코드리뷰 지적사항: 테스트가 private 멤버를 직접 호출하는 ERROR급 문제 1건 포함.

  • PR: #3449 — OPEN
  • 브랜치: priv/dp/checkpoint_compression
  • 커밋: 197dfc8a

한 줄 주장

체크포인트 payload는 key prefix가 반복되는 JSON이라 압축률이 높다. zlib level 1 압축으로:

  • 더 많은 항목이 동일 메타데이터 컨테이너에 들어감 — 기존 overflow 억제
  • write amplification 감소 — 매 체크포인트 사이클에 쓰는 바이트 수 감소

구현 방식

  • payload 앞에 magic tag b"LMCZ1\x00" 추가 → recovery 시 codec 자동 감지
  • 구버전(uncompressed) payload는 항상 {(0x7B)로 시작 → magic tag 충돌 없음 (하위 호환 O)
  • CRC는 저장된 bytes(압축 후)에 대해 계산 → torn-write 감지 유지
  • zlib level 1: 대부분의 압축 이득을 얻고 높은 레벨 대비 CPU 절감
RawBlockCheckpointCompression = Literal["none", "zlib"]
DEFAULT_CHECKPOINT_COMPRESSION: RawBlockCheckpointCompression = "zlib"

# RawBlockCoreConfig에 추가된 필드
meta_checkpoint_compression: RawBlockCheckpointCompression = DEFAULT_CHECKPOINT_COMPRESSION

변경 파일

파일내용
raw_block/core.py압축 타입, 상수, 인코딩/디코딩 메서드, config 필드
raw_block/__init__.py새 public 심볼 export
raw_block_l2_adapter.pyadapter config에 meta_checkpoint_compression 추가
rust_raw_block_backend.pyextra config key 지원
docs/design/...raw_block.md설계 문서 업데이트
tests/압축 roundtrip, 하위호환, oversize, corrupt payload 테스트

S2 overflow와의 관계

압축률 실측 ~4.6×, capacity +5.5×:

디바이스압축 전 overflow압축 후 overflow
Std SSD 3.84TBYESNO (해소)
Std SSD 7.68TBYESNO (해소)
HC SSD 15TBYESYES (여전히)
HC SSD 30TBYESYES (여전히)

→ S2 트랙: "단계 1 PR 불요, HC SSD 전용 단계 2 저우선"으로 축소.


코드리뷰 지적사항

ERROR — 머지 전 필수 수정

1. 테스트가 private 멤버를 직접 접근 (코딩 스탠다드 §5.2 위반)

test_rust_raw_block_backend.py에서 core._select_latest_checkpoint(), core._rawdev(), core1._decode_checkpoint_payload(...), core1._write_checkpoint(...), _CHECKPOINT_COMPRESS_MAGIC 상수를 직접 호출/import.

수정 방향: behavior 기반으로 재작성 — put_manycheckpoint_now() → close → reopen → indexed_key_count() / exists_many() 패턴으로 검증.

2. _decode_checkpoint_payload 예외 계약 불일치

docstring에 Raises: zlib.error 명시하지만 유일한 호출자가 except Exception:으로 묵살. 수정 방향: (a) None 반환으로 변경 또는 (b) docstring에서 Raises 항목 제거.

3. validate_checkpoint_compression 이중 호출

raw_block_l2_adapter.py에서 from_dict()__init__() 양쪽에서 검증. 다른 필드들은 from_dict에서 추출만 하고 변환/검증은 __init__에 맡기는 패턴인데 이 필드만 예외. → from_dict에서 값 추출만, 검증은 __init__으로.

WARNING

4. cast() 대신 타입 내로잉 활용 가능

frozenset membership check로는 mypy가 narrowing 못해 cast 사용. if value == "none": return "none" 패턴이 더 타입 안전.

5. _encode_checkpoint_payload docstring에 제어 필드 미언급

"controlled by self.meta_checkpoint_compression" 한 줄 추가하면 흐름 추적 용이.


다운그레이드 주의

압축된 체크포인트는 이 기능 이전 버전에서 읽을 수 없음. 다운그레이드 전 "none"으로 변경 후 체크포인트 1회 실행 필요.


관련 페이지

  • [[S2-checkpoint-overflow]] — overflow 버그 원인 및 이 PR로 인한 Std SSD 해소 경위
  • [[raw_block-PR-Landscape]] — 열린 PR 전체 지형도