본문으로 건너뛰기

[PR] delete() TOCTOU 정산 버그 수정

[!tldr] 업무 관점 takeaway 권상윤(팀) 머지 커밋 — [[raw_block-성능-우선순위|T1]](우선순위 1티어 correctness 버그). delete()가 두 번 락 잡는 사이의 race window 때문에 _total_bytes_used영구 과대 계상 → eviction 조기 발동·불필요 키 삭제. raw_block 회계 정확도에 직결돼 우리도 추적해야 할 변경. 정합성은 승인. 아키텍처 관점 = 새로 만든 공유 반환 타입의 "유효 조건"을 타입/문서에 박지 않으면 외부에서 오용된다.

  • 커밋: 9fc5a901 (2026-05-28) · 작성자: Sangyoon Kwon (권상윤)
  • 제목: [Fix][RawBlock] Fix TOCTOU accounting bug in delete() · 출처: raw/work/reviews/9fc5a901-*.md

문제

delete 경로가 "존재 확인"과 "실제 삭제+정산"을 별도 락으로 처리 → 그 사이 다른 스레드가 상태를 바꾸면 was_indexed 판단이 어긋나 slot_bytes만큼 사용량이 영구 누수. eviction이 실제보다 일찍 발동.

변경

was_indexeddelete_many 안으로 병합해 단일 락에서 _index.pop_inflight 취소를 한 번에 처리. 새 반환 타입 RawBlockDeleteResult(deleted, was_indexed). 호출처 2곳(raw_block_l2_adapter, rust_raw_block_backend) 모두 갱신.

아키텍처 관점 지적 (큰 흐름)

  • 정합성·마이그레이션·커밋 메시지 모두 통과 → Approve.
  • 다만 was_indexed"deleted=True일 때만 의미가 있는" 암묵 계약을 가진다. lock-skip 분기에선 인덱스에 존재해도 was_indexed=False를 반환하므로, 누군가 이 필드를 별도 신호("커밋된 키였는지")로 활용하면 잘못된 결론(예: 메트릭). → 반환 타입을 공유 계약으로 쓸 거면 유효 조건을 dataclass docstring/타입에 명시해 오용을 구조적으로 막아야 한다(코드 한 줄이 아니라 계약 설계 문제).

상태

머지된 커밋. 우선순위 페이지 T1으로 추적. follow-up은 모두 non-blocking.

관련 페이지

  • [[raw_block-성능-우선순위]] — T1 (이 버그)
  • [[Samsung-LMCache-팀]] — 권상윤 담당 영역
  • [[raw_block-내부구조]] — delete_many·_total_bytes_used 코드 근거