raw_block PR Landscape (2026-06-05 기준)
[!tldr] 업무 관점 takeaway upstream/dev 34de7177 기준 raw_block 관련 열린 PR이 12개. 우리 팀 PR은 #3526(L1), #3494(L3). I/O 계층 개선의 대부분은 #3274가 이미 커버하지만, 인덱스/락 계층(G1~G3)은 손 안 탄 빈틈이다. 다음 착수 순서: G1(쉬움, #3526 연장) → G2(#3274 머지 후) → G3.
2026-06-05 현재 열린 raw_block 관련 PR
| PR | 제목 | 영역 | 비고 |
|---|---|---|---|
| #3274 | Missing io_uring changes + nvme io_uring_cmd | I/O 계층 | _write_buffers/_read_buffers dispatcher, fixed buffer, use_uring_cmd, MDTS split |
| #3526 | [Perf][RawBlock] Reduce put_many lock count 4N→2N | 락 | 우리 팀 (L1) |
| #3494 | [perf] Reduce lock contention in batched_remove | 락 | 우리 팀 (L3), OPEN 리뷰 중 |
| #3480 | [Fix] TOCTOU accounting bug in delete() | 정합성 | = T1 |
| #3527 | [Core] Restore LRU eviction for rust raw-block backend | eviction | — |
| #3523 | [Fix] Tighten raw-block alignment validation | 정합성 | — |
| #3519 | [Feat][RawBlock] Add BLKDISCARD startup support | NVMe TRIM | discard() + blkdiscard_on_init |
| #3449 | raw_block: compress checkpoint payload | 체크포인트 | = D1 계열 |
| #3226 | raw_block: incremental base+delta checkpoint format | 체크포인트 | = D1/D2 계열 |
| #3305 | Add raw-block payload checksum validation | 정합성 | DRAFT |
| #3154 | Add Rust BlkioBlockDevice backend (libblkio I/O) | I/O 대체엔진 | io_engine="libblkio" |
| #3272 | [Tool] flame-graph profiling into bench l2 adapter | 측정 도구 | io_uring 벤치 확장 |
우선순위 항목 ↔ PR 매핑
| 항목 | 정의 | 진행 PR | 상태 |
|---|---|---|---|
| T1 | delete() TOCTOU 과대계상 | #3480 | ✅ PR 있음 |
| L1 | put_many key당 4→2 lock | #3526 | ✅ PR 있음 (우리 팀) |
| L2 | legacy batched_submit_put_task N-key 배치 분해 | — (priv/ny/legacy_batch_put) | 🔧 로컬 구현됨, upstream PR 미제출 |
| L3 | RustRawBlockBackend.batched_remove 락 N→1 | #3494 | ✅ PR 있음 (우리 팀) |
| P3 | Rust batch API → io_uring SQ 완전 활용 | #3274 (부분) | ⚠️ dispatcher만 도입, 호출자가 길이-1 list |
| D1/D2 | checkpoint 용량/threshold | #3449, #3226 | ✅ PR 있음 |
| B2+P2 | _free_slots deque+set | — | ⏸ 미착수 |
| P1 | _snapshot_state lock 내 copy 분리 | — | ⏸ 미착수 |
| D3 | 단일 글로벌 lock 분리 | — | ⏸ 미착수 |
#3274가 이미 커버한 것 (중복 주의)
io_uring/NVMe 관점에서 새로 제안하려던 것 대부분이 #3274에 있다:
- ✅ write 배치 (
_write_buffers→batched_write+wait_iouring) - ✅ read dispatcher (
load_many_into→_read_buffers→batched_read) - ✅ fixed-buffer zero-copy 등록 (
register_fixed_buffers_from_allocator) — plugin 경로만 - ✅ NVMe passthrough/queue depth (
use_uring_cmd, MDTS split)
단, 한계가 남음:
- 🆕 dispatcher 호출자 대다수가 길이-1 list →
batched_*의 의미 소실 (P3 여전히 유효) - 🆕
_read_uring_cmd_buffers는 chunk마다 동기read_uring(batched_read 미사용) - 🆕 MP/L2 경로(
RawBlockL2Adapter)는 fixed buffer 등록 안 함 — 경고만, zero-copy 미적용
#3274와 겹치지 않는 미착수 Gap
I/O 계층 외 인덱스/락 계층은 손 안 탐:
| Gap | 내용 | 난이도 | #3274와 독립? |
|---|---|---|---|
| G1 | put_many 배치 슬롯 일괄 할당 (_allocate_slots_locked(n)) | 낮음 | ✅ (L1=#3526 다음 단계) |
| G2 | dispatcher 호출자를 다중 키 단위로 (P3 핵심) | 중간 | ✅ (#3274 머지 후 follow-up) |
| G3 | MP/L2 경로 fixed-buffer 등록 hook | 중간 | ✅ |
| G4 | 단일 _lock N-way 샤딩 (D3) | 높음 (체크포인트/복구까지) | ✅ |
L2(legacy batched_submit_put_task 배치)는 이미 priv/ny/legacy_batch_put에 로컬 구현됨 — upstream PR 제출만 남음.
착수 순서: G1(쉬움, #3526 연장) → G2(#3274 머지 후) → G3 → G4
G4(D3)는 I/O가 이미 lock 밖이라 실측 contention 확인 후 착수 판단 권장.
다음 액션
- #3274 머지 여부/타임라인 확인 → G2는 머지 후 follow-up으로만 의미
- G1을 #3526의 후속 시리즈로 묶을지 검토
- D3(G4) 착수 전 단일 lock 실측 contention 프로파일 (#3272 flame-graph 활용)