feat: JFR events for open, HTTP range, segment decode/encode, chunk filtering and writer back-pressure
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ó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 55/100
- Loại issue
- Tính năng
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- java
- Lĩnh vực
- backend, observability
Hướng nghiên cứu
Start by reading the reader and writer entry points named in the issue: VortexReader.open, VortexHttpReader.open, SerializedArrayDecoder.decode, ScanIterator, and VortexWriter. Add the JFR event classes and wire them into those paths as specified, then use the named tests to check event fields, filtering counts, and back-pressure duration. Done when the event tests pass and the reference guide, how-to guide, changelog, and module map are updated.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Goal
Emit JDK Flight Recorder events from the reader and writer, so a JFR recording shows where a read or write spends its time (file open/mapping, HTTP range fetches, per-segment decode/encode, chunk pruning, writer back-pressure) with no extra dependency and near-zero cost when recording is off.
Events
New package core/src/main/java/io/github/dfa1/vortex/core/jfr/ (with package-info.java). Each event is a public class extending jdk.jfr.Event, annotated @Name("io.github.dfa1.vortex.X"), @Label, @Category({"Vortex", …}), @Description and @StackTrace(false). Public fields get /// docs (doclint is all); byte sizes get @DataAmount.
| Class | Category | Fields |
|---|---|---|
FileOpenedEvent |
I/O | source, fileSize, formatVersion, segmentCount |
FileMappingEvent |
I/O | file, size |
HttpRangeEvent |
I/O | source, offset (-1 = tail), length, status (0 = no response) |
SegmentDecodedEvent |
Decode | encoding, rowCount, segmentSize |
ChunkFilterEvent |
Filter | totalChunks, chunksPruned, chunksWithoutMatch, chunksReturned, rowsReturned |
SegmentEncodedEvent |
Encode | encoding, bufferCount, encodedSize |
SegmentWaitEvent |
Pipeline | segmentsInFlight |
Reader wiring
Pattern: event.begin(), set fields, commit().
VortexReader.open(path, registry, layoutRegistry):FileOpenedspans the whole open and is committed after parse;FileMappingwrapschannel.map. A failed open emits noFileOpened.VortexHttpReader.open(uri, registry, layoutRegistry, client):FileOpenedbegins beforefetchTailand is committed after the reader is built.- New private
sendRange(req, client, uri, offset, length)wrapsclient.sendin try/finally and always commitsHttpRange, withstatus = 0on failure.fetchTailcalls it with offset-1andTAIL_SIZE.bytes();fetchRangewithfromandto - from + 1. - New package-private
static String describe(URI)returningscheme://host[:port]+ raw path. It drops user info, query and fragment, because presigned URLs carry credentials. Used for everysourcefield.
- New private
SerializedArrayDecoder.decode: begin at the top; afterregistry.decode(ctx)setencoding = node.encodingId().id(),rowCount,segmentSize = segLen, then commit. Covers both readers.ScanIterator:- New counters
chunksPruned,chunksWithoutMatch,chunksReturned. - In
hasNext(), splitcanPruneChunk(...) || !selectMatchingRows(...)into two branches that each count,chunkIndex++; continue. - Increment
chunksReturnedinnext(). close()callsemitChunkFilterEvent(), a no-op whenfilter == null || chunks == null.
- New counters
Writer wiring (VortexWriter)
encodeSegment: begin at the top; before returning,if (event.shouldCommit())fillencodingfromresult.rootNode().encodingId().id(),bufferCount,encodedSize, then commit. Failures emit nothing.drainSegments: replacepending.poll().join()with a staticawaitHead(head, pending.size() + 1). It joins directly ifhead.isDone(); otherwise begins aSegmentWaitEvent, joins in atry, commits in thefinally.- No change to the writer's default behavior. (The default executor runs tasks on the caller, so
SegmentWaitnever appears there.)
Tests
Given/When/Then throughout. For events committed on other threads, assert presence and field values, never exact counts.
core/src/test/.../core/testing/JfrRecorderTest.java: abstract base; aRecordingStreamwithsetReuse(false)starts in@BeforeEach; offersawaitEvents()andevents(name).- reader
VortexReaderJfrTest(fixtureprimitives.vortex):FileOpenedandFileMappingfields; a too-small file emits noFileOpened. - reader
VortexHttpReaderJfrTest(mockedHttpClient): tailHttpRange(offset -1, status 206);sourcehas no credentials or query; status 0 whensendthrowsIOException. - writer
JfrEventsTest(usesLegacyZoneMaps.OPTIONS, same package):SegmentEncodedpresent with non-negative sizes (avortex.sequencesegment has 0 buffers).- Default executor: no
SegmentWait. - Executor sleeping 200 ms before each task:
SegmentWaitduration > 50 ms andsegmentsInFlight> 0. - Chunks 1..50, 51..100, 101..150 with
eq(id, 75)→ totals 3/2/0/1 and 1 row. - Single chunk {1, 100} with
eq(id, 50)→ 1/0/1/0 and 0 rows. - Unfiltered scan emits no
ChunkFilter.
Docs (same commit)
docs/reference.md: "JFR events" section (event table) + TOC entry.docs/how-to.md: "Find where a read or write spends its time (JFR)".CHANGELOG.md:## [Unreleased]→ Added.AGENTS.md:core.jfrline in the module map.
Verify
./mvnw test -pl core,reader,writer -am./mvnw verify -DskipTests(Javadoc lint + checkstyle)
- Ngôn ngữ chính
- Java
- Star
- 3
- Fork
- 2
- Merge trung bình
- 9 giờ 51 phút
- Pull request đã merge (30 ngày)
- 127
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ó 4/5 3-5 ngày Mức phù hợp với người mới 35/100
dfa1/vortex-java#657 ·
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
Tất cả issue của dfa1/vortex-java
Issue tương tự
-
status:pending type:bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
EngineHub/WorldGuard#2329 ·
Maintainer thường phản hồi trong vòng 3 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
Dans-Plugins/Medieval-Roleplay-Engine#396 ·
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
Maintainer thường phản hồi trong vòng 6 ngày
-
Update spring-security to 7.1.3Đang mởtype: dependency-upgrade
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 70/100
spring-projects/spring-session#4156 ·
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 68/100
quarkiverse/quarkus-langchain4j#3127 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày