Vectored Parquet reads can fall back unsafely after partial asynchronous reads and exceed allocation limits
- Ngôn ngữ chính
- Java
- Star
- 3.1k
- Fork
- 1.6k
- Merge trung bình
- 3 ngày 12 giờ
- Pull request đã merge (30 ngày)
- 33
Mô tả
### Describe the bug, including details regarding any error messages, version, and platform.
`ParquetFileReader` can produce unsafe fallback behavior when Hadoop vectored I/O
is enabled and a filesystem partially submits or completes a vectored read before
raising `IllegalArgumentException` or `UnsupportedOperationException`.
The current implementation catches those exceptions around `readVectored(...)`
and retries every range using ordinary reads against the same `ChunkListBuilder`.
If an earlier range already populated the builder, its data is appended again.
For a filtered column with selected pages `P0` and `P2`, the buffered page
sequence can become `[P0, P0, P2]` although the page index still describes
`[P0, P2]`. Depending on the page contents, decoding can fail or silently
associate the wrong page with the selected rows. Even when no page has been
consumed yet, scalar fallback is unsafe once sibling asynchronous reads may still
be operating on the same stream.
Current upstream code:
https://github.com/apache/parquet-java/blob/8e30c4cee3c7e85a8cf2133697f13138509b05b7/parquet-hadoop/src/main/java/org/apache/parquet/hadoop/ParquetFileReader.java#L1293-L1307
The same vectored path also allocates one buffer for an entire contiguous
requested range instead of honoring `parquet.read.allocation.size` (8 MiB by
default), unlike the ordinary read path. Large projected column chunks or
filtered pages can therefore create unexpectedly large heap allocations.
The current `master` branch and Apache Parquet Java 1.18.0 contain this behavior.
The vulnerable path is also present in the 1.15.x, 1.16.x, and 1.17.x release
lines. Vectored I/O defaults to enabled starting in 1.16.0, so supported Hadoop
filesystems can reach this path without an explicit opt-in; in 1.15.2 it is
reachable when explicitly enabled.
Expected behavior:
- Preserve ordinary fallback only when vectored I/O is unavailable or range
preparation fails before asynchronous submission starts.
- Once submission begins, fail the read safely rather than replaying scalar reads
against a partially populated builder or an active stream.
- Wait for already-published sibling reads before returning the original failure.
- Split filesystem byte ranges to respect the configured allocation limit without
changing the logical read plan or decoded results.
- Add regression coverage for partial submission/completion, pending sibling
futures, filtered pages, oversized columns, and checksum-enabled reads.
### Component(s)
parquet-hadoop
Hướng dẫn đóng góp
Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này
Hướng nghiên cứu
Bắt đầu trong parquet-hadoop's ParquetFileReader.java tại đường dẫn đọc vectored quanh các dòng 1293-1307, sau đó lần theo ChunkListBuilder, các lần đọc anh em không đồng bộ và việc xử lý parquet.read.allocation.size. Thêm kiểm thử hồi quy cho việc gửi hoặc hoàn tất một phần, các future của anh em đang chờ, các trang đã lọc, các cột quá lớn và các lần đọc bật checksum; hoàn thành nghĩa là có khả năng thất bại an toàn hoặc fallback và các cấp phát được giới hạn, mà không thay đổi kết quả đã giải mã.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- java
- Lĩnh vực
- data-engineering
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 45/100