perf(io): batch scheduled object store range reads - #9125
Closed
Xuanwo wants to merge 1 commit into
Closed
Conversation
Xuanwo
marked this pull request as ready for review
September 10, 2026 09:08
Contributor
There was a problem hiding this comment.
✅ Gate recommendation: approve.
This batches scheduled cloud ranges through one OpenDAL reader while preserving per-range concurrency accounting, bounded bytes, result ordering, and length validation. The bounded reader-scoped approach is preferable to the operator-wide cache closed in apache/opendal#8242, which could return stale or mixed file versions across its TTL.
Member
Author
|
didn't work |
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.
Lance currently passes one range at a time to
ObjectStore::get_ranges, discarding OpenDAL's per-reader HF XET resolution cache after each scheduled read. Submit bounded batches through both schedulers so cloud reads can share a backend reader. Local and custom readers retain independent scheduling by default.Reserve concurrency per range and memory for the batch's total bytes, cap batches at the bridge's eight concurrent reads, and disable additional OpenDAL gap coalescing after Lance has budgeted the reads. Refund only admitted tasks when closing the standard queue, and preserve result order and length validation across batch failures and cancellation.
Integration coverage exercises
ScanScheduler::open_filethrough the real OpenDAL adapter and checks shared readers, exact fetched ranges, and returned bytes. HF resolution reuse requires the existinghf_download_mode=xetsetting and is limited to a batch; the default remains HTTP.Live HF benchmark
Baseline
71c49d90eb220b0b71d7ca77d83cd8fa5c1cfb91(includes #9123) versus candidate25916efac287968ea49d84df405fbabadb68ba4c, on the same EC2 c7i.8xlarge in us-east-2. Three alternating pairs per workload/mode, identical dependencies andrelease-no-ltobuilds, fresh processes and dataset sessions, XET disk chunk cache disabled. Timings cover native Lance operations, excluding dataset opening, Python dispatch, and output packing.Data:
lance-format/lerobot-bench/droid_1.0.1-lance-compacted/videos.lanceversion 399 anddroid_1.0.1-lance/frames.lanceversion 86. The video ranges match the reported example. The scalar workload uses a fixed representative projection; the original report did not specify its exact projection or seed. All paired and cross-mode outputs match, and dataset identities remained unchanged.XET scalar latency improved by 5.1–8.9% in each pair (7.8% lower median). HTTP paired results have mixed direction, so these medians do not establish a stable HTTP speedup. The video example retains separate blob objects and shows no request-reduction benefit. This is a limited optimization, not a complete fix for HF throttling; sustained multiworker training was not tested.