[PR] L2 — per-key fan-out → batched put_many
[!tldr] 업무 관점 takeaway 우리 팀(Nayeon) raw_block 성능 PR.
batched_submit_put_task가 N키를 N개 독립 코루틴으로 fan-out하던 걸 단일put_many(specs, objs)호출로 치환 —put_many의 배치 이점을 실제로 살리고 이벤트루프 N배 오버헤드 제거. 아키텍처 관점 핵심 = 옛 per-key 코드의 "한 키 실패 = 한 키만 영향"이라는 격리 특성이 깨지면서, accepted key 전체가 하나의 Future를 공유 → peer backend와 실패 시맨틱이 갈라진다. batch 실패 격리 계약을 abstract 레벨에서 정의해야 한다는 게 큰 흐름의 숙제.
- 커밋:
93403c0f(2026-05-29) · 작성자: Nayeon Kim (우리) - 항목: [[raw_block-성능-우선순위|L2]] · 출처:
raw/work/reviews/cr-93403c0f-*.md
문제
RustRawBlockBackend.batched_submit_put_task가 키마다 _submit_put_one 코루틴을 따로 띄움 → put_many(단일 락 N키 처리) 능력이 무용지물, 이벤트루프에 N개 작업이 쌓여 오버헤드.
변경
_submit_put_one 제거, _submit_put_batch 도입: dedup 필터 → 일괄 ref_count_up → 단일 Future dispatch → 단일 put_many 워커 디스패치. _put_lock 보호 구간이 멤버십 검사 + bitmap 필터 + exists_inflight까지 포함하도록 확장.
아키텍처 관점 지적 (큰 흐름)
- 실패 격리 상실 — accepted key 전체가 하나의 Future를 공유. 옛 코드는 키별 독립이라 한 키 실패가 격리됐는데, 이제 dispatch가 raise하면 N키
ref_count+_put_tasks가 일괄 누수(finally미진입)된다. 이건 한 줄 버그가 아니라 "공유 Future 모델에서 부분 실패를 어떻게 회수하느냐"라는 설계 공백. - abstract contract 미정의 — batch 격리/공유 Future 시맨틱이
abstract_backend에 정의돼 있지 않아 backend마다 다르게 구현됨(peer backend와 불일치). → 공유 Future의 부분 실패·격리 계약을 추상 레벨에서 명문화해야 backend 간 일관.
상태
리뷰에서 Tier1(N키 자원 누수·dedup TOCTOU) 지적. 우리 작업 영역.
관련 페이지
- [[raw_block-성능-우선순위]] — L2 항목
- [[raw_block-put_many-lock-PR]] — 짝이 되는 L1 (락 합치기)
- [[L2-어댑터]] — L2Adapter store 워커 경로