iouring-batch-follow-up-codex
O_DIRECT padded write 처리 계획
배경
리뷰어가 지적한 문제는 put_many의 io_uring batch 경로에서
패딩이 필요한 O_DIRECT write가 진짜 batched write로 처리되지 않는다는 점이다.
다만 현재 PR에서 correctness/safety fallback은 이미 존재한다.
RawBlockCore._write_buffers()는 payload_len == total_len인 경우에만
batched_write()를 호출한다.
패딩이 필요한 경우에는 payload_len < total_len이 되므로,
해당 write는 batched_write()가 아니라 개별 write_uring() 경로로 fallback된다.
write_uring()은 Rust 쪽에 payload_len과 total_len을 둘 다 전달하므로,
패딩이 필요한 O_DIRECT write를 안전하게 처리할 수 있다.
이번 PR에서 처리할 내용
이번 PR에서는 기존 fallback 동작을 유지하되, 이 동작이 암묵적으로 보이지 않도록 명시성과 테스트를 보강한다.
수정 방향:
-
_write_buffers()의can_batch조건 근처에 주석 추가batched_write()는 현재total_lens만 받는다는 점을 설명한다.- O_DIRECT padded write는
payload_len과total_len을 분리해서 처리해야 하므로write_uring()fallback을 사용해야 한다는 점을 명시한다.
-
O_DIRECT padded fallback 유닛 테스트 추가
io_engine="io_uring",use_odirect=True로RawBlockCore를 구성한다.- block alignment에 맞지 않는 payload size를 사용한다.
put_many()가 성공하는지 확인한다.batched_write()가 호출되지 않는지 확인한다.- header/payload write가 개별
write_uring()경로로 호출되는지 확인한다.
이번 PR의 목표는 true batched O_DIRECT padded write 지원이 아니라, 현재 fallback 경로가 의도된 동작이며 안전하게 유지된다는 것을 코드와 테스트로 명확히 하는 것이다.
후속 PR 방향
패딩이 필요한 O_DIRECT write까지 진짜 batched 방식으로 지원하려면 Rust API 변경이 필요하다.
후속 PR에서 고려할 변경 사항:
- Rust
batched_writeAPI 확장
현재 형태:
batched_write(offsets, buffers, total_lens)
제안 형태:
batched_write(offsets, buffers, payload_lens, total_lens)
2. Rust validation 추가/수정
- 모든 입력 vector 길이가 같은지 확인
- payload_len <= total_len 확인
- buffer capacity가 최소 payload_len 이상인지 확인
- O_DIRECT에서는 offset과 total_len alignment 확인
3. Rust batched write 내부 padding 처리
- buffer가 aligned이고 total_len만큼 충분하면 직접 submit
- buffer가 unaligned이거나 total_len보다 짧으면 aligned bounce buffer 사용
- payload_len만큼 복사
- total_len - payload_len 구간은 zero-fill
4. Python call site 업데이트
- _write_buffers()에서 payload_lens와 total_lens를 모두 batched_write()에 전달
- 그 이후에는 padded O_DIRECT write도 fallback 없이 batched path를 탈 수 있음
5. 테스트 추가
- Rust API 단위 테스트
- Python RawBlockCore에서 padded O_DIRECT put_many()가 batched_write()를 사용하는지 검증
- round-trip correctness 테스트
- padding 영역 안전성 검증
## 리뷰어 응답 초안
Thanks, let me clarify. The part I meant to leave for a follow-up is true
batched support for padded O_DIRECT writes.
The safety fallback is already here: batched_write only runs when
payload_len == total_len, and padded writes fall back to per-entry write_uring.
I can add a comment and a unit test to make that explicit in this PR.
Would it be okay to handle the larger Rust batched_write API change in a
follow-up PR?