[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_indexed를 delete_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코드 근거