Repository navigation
view: stay responsive and fast over HTTP - #747
Merged
Merged
Conversation
dfa1
force-pushed
the
view-nonblocking-744
branch
from
November 13, 2026 15:26
58d382f to
10bedb0
Compare
`vortex view <https url>` froze while it fetched data, and each window took one sequential range request per column. A JFR of the viewer showed 270 requests at ~150 ms each, one at a time, 226 of them starting within 1 KB of the previous one's end, and 72 re-reading a range already read. - The render loop never waits on the IoWorker: LazyGridSource.peekRows returns cached rows plus placeholders and posts a latest-wins request; the loop polls keys on a 50 ms tick while loading. A load superseded or queued before close is skipped, and teardown waits at most 250 ms for the worker, so q quits even with a request stalled. A failed load is tied to its window instead of poisoning the session. - Only the visible columns, plus a margin of two, are formatted. - Chunk.prefetch / VortexHandle.prefetch start the range requests of those columns together on virtual threads, at most 8 in flight, merging segments up to 1 MiB apart (16 MiB per request, Rust's CoalesceConfig::object_storage). A call queues at most 64 MiB on the heap, responses are sliced into the arena without a second copy, and a chunked layout's stats child is not fetched. - VortexHttpReader keeps every segment it has read, so scrolling back makes no request. No eviction or TTL: the file is immutable for the life of the handle and the bytes stay in the arena anyway. Not done from #744: jumping straight to a chunk instead of rescanning from chunk 0. Refs #744 Co-Authored-By: Claude Sonnet 5 <[email protected]>
dfa1
force-pushed
the
view-nonblocking-744
branch
from
November 13, 2026 16:34
10bedb0 to
3abc812
Compare
The render loop reads through peekRows; the blocking readRows and its row wrapper had no production caller left, only tests, which now read through peekRows after the worker has loaded the window. Co-Authored-By: Claude Sonnet 5 <[email protected]>
The viewer reaches a far chunk by stepping over the ones in between. Chunks decode a column when it is read, so that costs no request; this test fails if a change makes the decode eager. Refs #744 (item 3). Co-Authored-By: Claude Sonnet 5 <[email protected]>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The viewer froze on
vortex view <https url>and took one sequential range request per column. A JFR showed 270 requests at ~150 ms each, one at a time, 226 starting within 1 KB of the previous one's end, 72 re-reading a range already read.LazyGridSource.peekRowsreturns cached rows plus…placeholders; the loop polls keys on a 50 ms tick while loading, soqquits at once. Title leads with a spinner.Chunk.prefetch/VortexHandle.prefetch: concurrent range requests (max 8 in flight, virtual threads), neighboring segments merged (1 MiB distance, 16 MiB max, Rust'sCoalesceConfig::object_storage).VortexHttpReaderkeeps every segment it read: scrolling back makes no request. No TTL/eviction: immutable file, bytes live in the arena anyway.Not included: jumping straight to a chunk instead of rescanning from chunk 0 (item 3), so the issue stays open. No vortex-jni cross-check test: prefetch changes when bytes are fetched, not what is decoded.
Refs #744
🤖 Generated with Claude Code