본문으로 건너뛰기

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_lentotal_len을 둘 다 전달하므로, 패딩이 필요한 O_DIRECT write를 안전하게 처리할 수 있다.

이번 PR에서 처리할 내용

이번 PR에서는 기존 fallback 동작을 유지하되, 이 동작이 암묵적으로 보이지 않도록 명시성과 테스트를 보강한다.

수정 방향:

  1. _write_buffers()can_batch 조건 근처에 주석 추가

    • batched_write()는 현재 total_lens만 받는다는 점을 설명한다.
    • O_DIRECT padded write는 payload_lentotal_len을 분리해서 처리해야 하므로 write_uring() fallback을 사용해야 한다는 점을 명시한다.
  2. O_DIRECT padded fallback 유닛 테스트 추가

    • io_engine="io_uring", use_odirect=TrueRawBlockCore를 구성한다.
    • 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에서 고려할 변경 사항:

  1. Rust batched_write API 확장

현재 형태:

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?