본문으로 건너뛰기

[PR] LRU eviction retry (rust raw-block)

[!tldr] 업무 관점 takeaway daegyu94(팀) 커밋 — 슬롯이 꽉 차면 put이 그냥 드롭되던 걸, LRU 키를 evict 후 재시도하도록 보강. non-MP eviction 부재([[raw_block-개선-Task|S1]] 영역, daegyu94가 [[Issue-3394-NonMP-Eviction|#3394]]로 진행) 대응이라 우리 S1 착수 금지 배경과 직결. 아키텍처 관점 핵심 = eviction 정책을 Python 레이어 LRU에 얹으면 Rust core 인덱스와 source-of-truth가 이중화되어 동기화 레이스가 생긴다.

  • 커밋: 4803df4a (2026-06-01), 브랜치 priv/dg/raw-block-cache-eviction
  • 작성자: Daegyu Han (daegyu94) · 출처: raw/work/reviews/cr-4803df4a-*.md

문제

raw_block은 슬롯이 꽉 차면 put이 실패(데이터 조용히 드롭) → non-MP 경로에 자체 eviction이 없음.

변경

RustRawBlockBackendPython 레이어 LRU 트래커(OrderedDict) 추가. put 슬롯 부족 시 _evict_one_lru → 재시도 루프. put_many 결과에 no_free_slot_keys 필드를 추가해 capacity miss만 판별(다른 실패엔 LRU 손대지 않음), _pinned_keys는 evict 제외, checkpoint 후 _sync_lru_with_index로 동기화.

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

  1. 락 순서 불일치 → 잠재 데드락_evict_one_lru_pin_lock보유한 채 delete_many/contains_key(내부에서 core 락)를 호출. 락 보유 중 I/O·다른 락 진입은 데드락 위험.
  2. source-of-truth 이중화 — eviction 정책이 Python LRU와 Rust core 인덱스 두 곳에 분산. _sync_lru_with_index로 맞추지만 apply_loaded_state 후 진행 중 put과 레이스. → 흐름 차원: eviction은 core(단일 락 안)에서 결정하거나, Python/core 동기화 계약을 명시해야 한다. (이는 [[raw_block-개선-Task|S1]]에서 "core 내부 FIFO eviction"으로 접근했던 것과 대비 — 어느 레이어가 eviction 권한을 갖느냐의 설계 선택)

상태

커밋(2026-06-01). [error] 락 순서, [error] 동기화 레이스 지적.

관련 페이지

  • [[Issue-3394-NonMP-Eviction]] — daegyu94의 non-MP eviction 이슈 (S1 착수 금지 배경)
  • [[raw_block-개선-Task]] — S1 (core 레이어 eviction 대안)
  • [[raw_block-batched-remove-PR]] — _pin_lock을 공유하는 삭제 경로