Reader: concurrent scan with a confined arena per worker thread
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 5/5
- Thời gian dự kiến
- Hơn một tuần
- Mức phù hợp với người mới
- 12/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- java
- Lĩnh vực
- data, performance
Hướng nghiên cứu
This is a design proposal, so the first step is deciding the open questions, not editing code. Read ScanIterator, Chunk and the existing confined-versus-shared arena handling, plus ADR 0003 for the exception contract on worker threads. Done means a recorded decision on shared versus per-worker mapping and ordered versus unordered delivery, then an A/B run with RealFileScanBenchmark.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Parked design for a concurrent reader scan. Follow-up to #474 (writer side, shipped).
Reference behavior
- Rust (
vortex-layout/src/scan/scan_builder.rs): the scan is split into row-range tasks (SplitBy), each spawned onto the session runtime, up toconcurrency * num_workersin flight (default 4 per worker).ordered(default) uses.buffered(n), otherwise.buffer_unordered(n). A per-splitmapfunction runs on the spawned task. - .NET (Vorticity):
MaxDegreeOfParallelismper session or per scan,MaxConcurrentReadsfor I/O, sharedSegmentCache, concurrent scans over one open file. - vortex-java today:
ScanIteratoris single-threaded, every arena isofConfined.
Proposed shape
A confined Arena per worker thread, so the callback runs on the worker and the caller never touches decoded memory from another thread:
scan.parallel(executor) // executor + bounded in-flight window on ScanOptions
.map(chunk -> r) // runs on the worker; chunk and its arena close on return
Rmust not reference chunk memory (aggregates, copied-out values); Javadoc states the contract.- Results delivered ordered (Rust
buffered, default) or unordered (buffer_unordered). - The file mapping becomes
ofShared(one close at the end), since workers must read it. Alternative: each worker maps its own view. scan()/ScanIterator/Chunklifetime rules stay unchanged.
Pros
- Rust-shaped (map on the spawned task, ordered/unordered, bounded window), so parity with the reference.
- Confined arenas keep the cheap alloc/close path;
Arena.ofShared().close()needs a cross-thread handshake per chunk. - No change to the existing single-threaded API or its safety checks.
- Same bounded-window idea as the writer's
pendingqueue /MAX_IN_FLIGHT_SEGMENTS. - Overlaps decode with consumption; wide files and slow consumers benefit most.
Cons
- No ordered, parallel, zero-copy
Iterator<Chunk>for a consumer thread: a chunk decoded on a worker cannot be read elsewhere. That case would need a shared per-chunk arena (slower close, and relaxes the "secondnext()while aChunkis open is rejected" rule). - Callback API is less ergonomic than an iterator; callers who must keep data have to copy out.
- Mapping arena goes shared; any cross-thread use after
close()becomes a hazard to test (ADR 0003 security contract still applies on worker threads: onlyVortexExceptionmay escape). - Worker exceptions must be propagated and in-flight work cancelled/drained on failure (the writer's
discardPendingequivalent). - Needs A/B on all 7 real files (
RealFileScanBenchmark, interleaved): memory-bandwidth-bound scans may not scale, and oversubscribing the pool gains nothing.
Out of scope / not planned
- Per-column parallel decode within a chunk: not a Rust pattern, so it would be a deliberate divergence needing an explicit decision.
- Parallel I/O for
VortexHttpReader(concurrent range requests): independent of this, worth its own ticket if pursued. - Writer follow-ups (parallel scheme trials in
CascadingCompressor.chooseBest): comment on #474.
- Ngôn ngữ chính
- Java
- Star
- 3
- Fork
- 2
- Merge trung bình
- 9 giờ 47 phút
- Pull request đã merge (30 ngày)
- 128
Chuẩn bị môi trường
- Không có Dockerfile hay tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của dfa1/vortex-java
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
dfa1/vortex-java#636 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 3/5 1-2 ngày Mức phù hợp với người mới 70/100
dfa1/vortex-java#655 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
perf
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
dfa1/vortex-java#651 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Writer: string columns written as per-chunk dicts where Rust uses its dict layout (up to 2x larger)Đang mởperf
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 30/100
dfa1/vortex-java#650 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
perf
Độ khó 4/5 3-5 ngày Mức phù hợp với người mới 28/100
dfa1/vortex-java#649 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của dfa1/vortex-java
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
objectionary/lints#1640 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
openhab/openhab-addons#22168 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
wildfly/wildfly-channel#446 ·
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 62/100
Maintainer thường phản hồi trong vòng 1 ngày
-
5.0.x backport enhancement
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 63/100
spring-cloud/spring-cloud-function#1507 ·
Maintainer thường phản hồi trong vòng 1 ngày