tasks/todo 통합 원장 (2026-06-25)
11개 문서에 흩어진 raw_block/NVMe 작업 항목을 중복 제거해 한 장으로 통합. PR/issue 상태는 2026-06-25
gh직접 확인.
ID 체계 (AREA-N)
| AREA | 범위 |
|---|---|
| RB | raw_block 코어 (슬롯·인덱스·락·체크포인트·slot geometry·TRIM·correctness) |
| IO | io_uring write/read 경로 & NVMe passthrough (batched submit/read·setup flag·coalescing·uring_cmd·queue-depth) |
| L2 | MP L2 어댑터·분산 (원격 connector·sharding·capability·serde·P2P·device-aware policy) |
| FS | filesystem/file backend — LocalDisk·fs L2·fs_connector (raw_block 외 storage tier) |
| OBS | observability / telemetry / stats |
| SYS | host memory / CPU backend accounting / engine 레벨 |
- 번호 N = 영역 내 고유 식별자일 뿐 우선순위 아님. 우선순위는 §0·§7.
- 옛 문서 ID(H1·E-5·B2·G1·T1…)는 변경 불가라 그대로 두고, 각 행에
(구 …)로 병기 + §6 매핑. - repo 전체 문서 맵은
tasks/index.md. 이 파일은 아이템 status SSOT.
0. 30초 요약
- 열린 우리 PR 5개: IO-1(#3636) · RB-4(#3835, DG) · RB-2(#3698) · RB-3(#3494) · RB-1(#3480) — 전부 OPEN.
- 로컬 완료·PR 대기 2개: IO-3(P0-B, #3636 stacked) · IO-2(recovery batched read, #3835 base) — 실 NVMe 6.08×.
- 즉시 착수 5개: RB-5(free_slots O(1)) · RB-6(FIFO) · IO-4(setup flag) · RB-7(RU 정렬) · FS-1(disk/fs 실배칭).
- 외부 대기: RB-8(TRIM, #3519+상윤) · RB-9(HC overflow, Daejun #3449) · IO-5(uring_cmd EINVAL, @DongDongJu) · OBS-1(텔레메트리, 이슈 #3752).
- 신규/후보: §4 (FS·SYS·OBS·IO·L2 12건).
1. 진행 중 — 열린 PR (리뷰 단계)
| ID (구) | 항목 | PR | 상태(06-25) | 상세 |
|---|---|---|---|---|
| IO-1 (P0·G1+G2) | put_many io_uring batched submit (_put_many_batch_io) | #3636 | OPEN · 리뷰 반영 중 | P0 계획 · finalize |
| RB-4 (Recovery·DG) | _validate_loaded_entries POSIX 병렬 검증 (이슈 #3753) · recovery 쌍 ↔ IO-2 | #3835 | OPEN | NY+DG 총괄 |
| RB-2 (L2-fix) | dispatch 실패 시 ref/put-task 롤백 (dedup은 폐기) | #3698 | OPEN · Gemini medium 1건 | 정리 |
| RB-3 (L3) | RustRawBlockBackend.batched_remove 락 N→1 | #3494 | OPEN | L3 노트 |
| RB-1 (T1) | delete() TOCTOU → _total_bytes_used 과대계상 (was_indexed) | #3480 | OPEN | priority T1 |
2. 로컬 구현 완료 — base 머지 대기 (PR 미생성)
| ID (구) | 항목 | base | 상태 |
|---|---|---|---|
| IO-3 (P0-B) | padded O_DIRECT write도 batched_write (Rust payload_lens + 꼬리 zero-fill, can_batch 게이트 제거) | #3636 stacked | 커밋 4개·테스트 green. #3636 머지 후 rebase→PR |
| IO-2 (V1) | io_uring batched recovery read (_validate_loaded_entries batched_read N헤더 1제출) · recovery 쌍 ↔ RB-4 | #3835 base | 실 NVMe 524K 6.08×. uring_cmd 경로는 IO-5로 분리 |
3. 착수 가능 / 대기 (열린 PR 없음)
| ID (구·별칭) | 항목 | 상태 | 선행/메모 |
|---|---|---|---|
| RB-5 (H1·E-5·C3) | _free_slots 멤버십 O(n)→O(1) (병렬 set) | 🟢 즉시 | 충돌 PR 없음. ~20줄 |
| RB-6 (H2·B2+P2) | _free_slots LIFO→FIFO (deque, wear leveling) | 🟢 즉시 | RB-5와 독립. FDP 선행 |
| IO-4 (M2) | io_uring setup flag 튜닝 (SINGLE_ISSUER 등) | 🟢 즉시 | #3274✓ + #3271✓(05-26 머지) 둘 다 충족 |
| RB-7 (A3) | RU-aligned slot geometry (erase-block/FDP RU 정렬 config) | 🟢 즉시 | 정렬=정책 아님 → 독립. FDP 시 효과 |
| RB-8 (N1·E-2) | 런타임 TRIM (슬롯 free 시 discard) | 🟡 대기 | #3519 머지 + 상윤 조율 선행. #3519 discard() 재사용 |
| RB-9 (S2·D1·C1·E-6) | checkpoint payload overflow (HC-SSD 15/30TB) | 🟡 대기 | Daejun #3449 답변. Std SSD는 #3449 zlib로 해소 |
| IO-5 (F2·E-3) | uring_cmd checkpoint read EINVAL (multi-page PRP 정렬) | 🟡 대기 | 이슈 미등록. Rust bounce @DongDongJu(lib.rs:2092). #3841/#3812 모두 미해결 |
| OBS-1 (B1·v1T1·v2B1·E-1) | L2/TTFT 단계별 latency 텔레메트리 (EventBus→OTel) | 🟡 대기 | 공식 이슈 #3752 OPEN·PR 공백. 규모 큼(메트릭6+모드별 plumbing 2벌) |
| RB-10 (P1·E-4·C2) | _snapshot_state lock 내 직렬화 분리 | ⏸ 미착수 | ⚠️ 코드가 노트보다 악화: lock 잡은 채 entry별 .tolist() |
| L2-1 (G3) | MP/L2 fixed-buffer 등록 hook (zero-copy) | ⏸ 미착수 | raw_block_l2_adapter.py:347 경고만 |
| RB-11 (D2) | max_dirty_threshold (sustained write 중 checkpoint) | ⏸ 미착수 | 비정상 종료 시 index 손실 |
| RB-12 (D3·G4) | 단일 _lock N-way 샤딩 | ⏸ 낮음 | I/O 이미 lock 밖 → 실측 contention 후 판단 |
| IO-6 (F1) | write coalescing (벡터드 writev, Tier1) | 📋 planned | Rust Writev 필요. IO-3와 batched_write 시그니처 공동설계 |
4. 신규 발굴 / 후보 풀 (2026-06-25) — task 미등록
🆕 = 2026-06-25 신규 발굴 · 📎 = 기존 문서서 이월. 근거는 코드 file:line / 점유 PR.
| ID (구·출처) | 항목 | Mode | 근거 (코드 / 점유 PR) | 판단 |
|---|---|---|---|---|
| FS-1 (N-1·disc) 🆕 | LocalDisk/fs L2 진짜 배칭 안 함 (키마다 직렬 write) | Both | local_disk_backend.py:370(TODO) · fs_l2_adapter.py:582 | 신규 최선. upstream TODO 명시·raw_block 배칭 경험 재사용·인터페이스 무변경 |
| FS-2 (N-2·disc) 🆕 | LocalDisk 디스크 공간 allocator 부재 (단편화) | non-MP | local_disk_backend.py:155,328 | 큰 설계(eviction 얽힘). MP는 #3859 점유 → 맨 뒤 |
| FS-3 (Task3·pool/v1) 📎 | fs_connector O_DIRECT 메타데이터 경로 (save_chunk_meta padding이 O_DIRECT 끔) | In-process | fs_connector.py:100 | Samsung SSD 성능 검증 직결. #3191과 무관 |
| SYS-1 (N-3·disc) 🆕 | EngineCore RssAnon 무한증가 (embedded) | non-MP | 이슈 #3767 · 부분 PR #3793 | raw_block/MemoryObj 관여 여부 빠른 확인(5분). #3793 중복 가능 |
| SYS-2 (pool) 🆕 | LocalCPU batched_allocate eviction accounting gap | Both | local_cpu_backend.py:788(TODO) · #3634 인접 | 메모리 계층 정합성. storage 직접성 중간 |
| OBS-2 (N-4·disc) 🆕 | GDS backend Statistics 미연결 | non-MP | gds_backend.py:327 | OBS-1에 흡수 권장 |
| IO-7 (pool) 🆕 | io_uring queue-depth / sysfs autotune·preflight | Both | core.py:149 · rust/raw_block/src/lib.rs:965 | IO-4(setup flag) 인접하나 device QD/MDTS 읽어 추천·검증은 별도 |
| L2-2 (pool) 🆕 | P2P read-only adapter store success semantics 정리 | MP | p2p_l2_adapter.py:186 · store_policy.py:144 | correctness gap이나 NVMe 비주력 → upstream hygiene 후보 |
| L2-3 (pool) 🆕 | L2 adapter capability bit / descriptor 확장 | MP | store_policy.py:22 | store/lookup-only/capacity/latency capability를 policy가 못 봄. L2-2 해결 토대 |
| L2-4 (pool) 🆕 | variable-size serde exact-size를 FS/mock 밖으로 확장 | MP | serde_wrapper.py:241 · s3_l2_adapter.py:427 · #3796 후속 | #3796은 FS/mock만. S3/HFBucket/native exact-size 후속 |
| L2-5 (pool) 🆕 | GCS/Azure MP L2 adapter parity | MP | s3_l2_adapter.py:427 · #3854/#3686(non-MP만) | upstream diversity엔 좋으나 NVMe/FDP 직접성 낮음 |
| L2-6 (pool) 🆕 | raw_block multi-device health/capacity/latency-aware sharding | MP | #3689 후속 | #3689는 단순 rank % len(paths). 머지 후 routing/rebalance 후속 (base는 점유) |
| L2-7 (Task5·pool/v1) 📎 | device-aware store/prefetch policy | MP | prefetch_policy.py:129 · store_policy.py:144 · 이슈 #2923 | OBS-1(B1) 텔레메트리 선행이면 효과 증명 쉬움 |
출처 (아이템별 어느 문서를 볼지):
disc= discovery_2026-06-25 — N-1~N-4 신규 발굴 + 우선순위 정렬 (FS-1·FS-2·SYS-1·OBS-2).pool= upstream_gap_pool — 넓은 MP/remote/serde 후보 풀 + 점유 회피 (FS-3·SYS-2·IO-7·L2-2~7).v1= v1 roadmap (Task3·Task5) · nvme TRIM/A3/B1 근거 = nvme feature 발굴.- ⚠️
disc·pool은 N-1~N-4·E-items에서 내용이 겹친다(같은 항목 다른 각도). 위 출처가 각 항목의 primary.
5. 폐기 / 타인 점유 (참고 — 착수 금지)
| 구 ID | 항목 | 사유 |
|---|---|---|
| put_many 락 4N→2N | drop — NVMe 50µs서 이득 <1% | |
| legacy batched_submit_put_task dedup | drop — NVMe regression. ref-rollback만 RB-2(#3698) 생존 | |
| non-MP io_uring 적용 | IO-1/#3274에 흡수(머지 완료) | |
| 커널 down-to-NVMe 추적 | #3272(flamegraph)가 커버 | |
| non-MP 자체 eviction | daegyu94 — 이제 PR #3527 OPEN | |
| MP raw_block multi-device sharding (base) | #3689 OPEN 점유 (health-aware 후속만 L2-6) | |
| A1/A2 | FDP placement 정책 | daegyu94 레인 (ankit-sam#1) — geometry(RB-7)만 우리 몫 |
6. ID 매핑 (새 AREA-N ↔ 옛 문서 ID)
| 새 ID | 항목 | v3 | priority | pr_landscape | nvme_disc | v1/v2 | discovery_06-25 |
|---|---|---|---|---|---|---|---|
| RB-1 | delete TOCTOU | — | T1 | T1 | — | — | — |
| RB-2 | dispatch ref rollback | — | L2(잔존분) | L2/G(노트) | — | — | — |
| RB-3 | batched_remove 락 | — | L3 | L3 | — | — | — |
| RB-4 | recovery POSIX 병렬 | — | — | — | — | — | — |
| RB-5 | free_slots O(1) | H1 | B2+P2 | B2+P2 | C3 | — | E-5 |
| RB-6 | free_slots FIFO | H2 | B2+P2 | B2+P2 | — | — | E-5 |
| RB-7 | RU geometry | — | — | — | A3 | — | — |
| RB-8 | runtime TRIM | — | — | — | N1 | — | E-2 |
| RB-9 | checkpoint overflow | S2 | D1 | D1/D2 | C1 | — | E-6 |
| RB-10 | snapshot lock | — | P1 | P1 | C2 | — | E-4 |
| RB-11 | max_dirty_threshold | — | D2 | — | C5 | — | — |
| RB-12 | single lock shard | — | D3 | G4 | — | — | — |
| IO-1 | put_many batched submit | M1흡수 | — | G1/G2/P3 | — | — | — |
| IO-2 | io_uring recovery read | — | — | — | — | — | — |
| IO-3 | padded O_DIRECT batched_write | — | — | — | — | — | — |
| IO-4 | setup flags | M2 | — | — | — | — | — |
| IO-5 | uring_cmd EINVAL | — | — | — | — | — | E-3 |
| IO-6 | write coalescing | — | — | — | — | — | — |
| IO-7 | queue-depth autotune | — | — | — | — | — | — |
| L2-1 | MP fixed-buffer hook | — | — | G3 | MP-B | — | — |
| L2-2 | P2P store semantics | — | — | — | — | — | — |
| L2-3 | L2 capability bit | — | — | — | — | — | — |
| L2-4 | serde exact-size 확장 | — | — | — | — | — | — |
| L2-5 | GCS/Azure MP parity | — | — | — | — | — | — |
| L2-6 | multi-device health sharding | — | — | — | MP-C후속 | — | — |
| L2-7 | device-aware policy | — | — | — | C2(nvme) | v1 Task5 | — |
| FS-1 | disk/fs 실배칭 | — | — | — | — | — | N-1 |
| FS-2 | disk allocator | — | — | — | — | — | N-2 |
| FS-3 | fs_connector O_DIRECT meta | — | — | — | — | v1 Task3 | — |
| OBS-1 | L2/TTFT 텔레메트리 | — | B1(latent별개) | — | B1 | v1 Task1·v2 B1 | E-1 |
| OBS-2 | GDS Statistics | — | — | — | — | — | N-4 |
| SYS-1 | RssAnon #3767 | — | — | — | — | — | N-3 |
| SYS-2 | LocalCPU accounting | — | — | — | — | — | — |
분석 본문: raw_block_line · raw_block_split, perf findings는 docs/notes/.
7. 임박 액션 (의존 체인)
- #3636 머지 → IO-3(P0-B) PR (rebase --onto dev)
- #3835(DG) 머지 → IO-2(io_uring recovery) PR
- IO-5 EINVAL 이슈 등록 (병목 언블록·~1h) → Rust bounce(@DongDongJu, lib.rs:2092
use_odirect||use_uring_cmd) → recovery 재활성화 - 즉시 병렬 착수: RB-5(H1) · IO-4(M2) · FS-1(신규 최선) · SYS-1(빠른 확인)
- 외부 대기: RB-8(#3519+상윤) · RB-9(Daejun #3449)
갱신 규칙: 아이템 status/추가 시 이 표 우선 갱신(SSOT). repo 문서 맵·분류 변경은 tasks/index.md.