Hi Anton,

Thanks for the careful review, all good points. I've updated the FIP, responses 
below.

> §3.10, sort-merge rationale: ... Would you update the switch-point rationale 
> to reflect that?

Done. The section now says both approaches buffer the bounded tail so memory is 
comparable, and the real benefit of sort-merge would be key-ordered output plus 
a streaming lake side. The switch stays internal and only kicks in once the 
lake reader can give us bucket-wide primary-key ordering.

> Same section: does the blocker description still hold after paimon-rust #374 
> ... it may be worth stating that dependency explicitly.

Yes, #374 is what guarantees one-row-per-key across splits, and I've added that 
as an explicit assumption in the "V1 strategy: hash overlay" section. 

> §3.3, "latest readable snapshot": ... would you consider folding it into the 
> FIP text?

Yes, added. The planner requests the readable snapshot from the server. For 
DV-enabled Paimon tables the readable snapshot can lag the latest committed one 
until compaction catches up; for non-DV formats they're the same. If there's no 
readable snapshot yet, the planner falls back to a full log read.

> §3.3/§3.5, plan/read consistency: if a worker's read-side projection or 
> filter drifts ... How do you see this resolving?

This follows the paimon-rust model: splits stay lightweight and carry only 
positioning, while projection/filter live on the reader. The upstream engine 
must reconstruct the same FlussLakeScan configuration on every worker. A 
mismatch is a caller-side programming error and can produce wrong-shaped 
output. We considered embedding a config fingerprint in splits but rejected it 
to keep splits small; it's documented under Rejected Alternatives.

> §3.5, descriptor_version: ... compatibility contract?

Reject-newer, accept-older. A reader that receives a split with a higher 
descriptor_version than it supports fails with 
FlussLakeError::IncompatibleSplitVersion and reports both versions. Older 
supported versions are decoded through internal dispatch.

> §3.6, DataUnavailable: ... can it block indefinitely?

DataUnavailable is the "plan is stale, re-plan and retry" signal. We 
intentionally don't add a reader-level no-progress timeout; callers wrap 
stream.next() with their own timeout/cancellation, matching fluss-java's 
poll(Duration) behavior. A stop offset that becomes unreachable due to 
truncation surfaces as DataUnavailable, not an indefinite block.

> §3.7, exact filter: ... If it's total, stating that explicitly would let 
> engines drop their filter operators with confidence.

Yes, the guarantee is total for every expressible FlussLakePredicate passed to 
with_filter(). Engines can safely drop residual filters for those predicates; 
only unsupported expressions stay as engine-side residuals.

> §3.10, PK tables: which Paimon merge engines are covered ... what should the 
> caller see?

V1 only supports deduplicate for PK union read. Other engines fail at plan() 
time with FlussLakeError::UnsupportedMergeEngine. We don't reject at open() 
because lake-only reads on the same table are still valid; NotLakeReadable is 
reserved for non-lake-readable tables.

> §3.9, append tables - just to confirm the parallelism model ... intra-bucket 
> parallelism of the lake side is out of scope?

The unit of parallelism is (partition, bucket), one stream per split, and 
intra-bucket file-level parallelism is out of scope for V1. Ordering across 
buckets is not guaranteed.

All changes are on the Confluence page. Thanks again for the detailed feedback.

Best Regards,
Jim

> 2026年8月6日 上午11:42,Jim Hu <[email protected]> 写道:
> 
> 
> Hi Anton and Keith,
> 
> Thank you very much for the detailed and thoughtful feedback. These are all 
> valid points that deserve clearer treatment in the FIP, particularly around 
> the plan/read consistency contract, descriptor compatibility, retry and 
> liveness semantics, resource bounds, PK merge semantics, split parallelism, 
> and object-storage security.
> 
> I’m considering these points and revising the FIP accordingly. I’ll follow up 
> with a revised version.
> 
> Best,
> Jim
> 
>> 2026年8月6日 上午10:47,Jim Hu <[email protected]> 写道:
>> 
>> Hi, all
>> 
>> Thanks Anton and Keith for
>> 
>> Keith Lee <[email protected] <mailto:[email protected]>> 于2026年7月31日周五 
>> 18:59写道:
>>> Hello Jim,
>>> 
>>> Thank you for the FIP, the general direction looks solid. I have the
>>> following questions:
>>> 
>>> 1. Have we considered timeout, liveness or retry semantics? A hung storage
>>> request or dead server would stall the stream indefinitely without timeout.
>>> This also apply for PK splits where merge must first materialise the whole
>>> changeling tail before emitting anything. It might be worth adding
>>> configurable timeouts. Without this, user will have to resort to wrapping
>>> the kernel with watchdog.
>>> 2. On PK hash overlay, the proposal relies on the premise that tail is
>>> bounded and small. There's no defined behaviour when that premise fails.
>>> Could we specify a failure mode? e.g. configurable memory / tail-size cap
>>> surfacing an error such as FlakeLakeError("snapshot too stale") rather than
>>> risking OOMing the host process?
>>> 3. Can we include in the proposal on the credential and security story for
>>> object storage? I appreciate that the proposal might be following Java side
>>> implementation, calling it out in the proposal would make it clear.
>>> 
>>> It's a great FIP, looking forward to your response.
>>> 
>>> Best regards
>>> Keith
>>> 
>>> On Thu, Jul 30, 2026 at 4:15 PM Jim Hu <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> > Hi all,
>>> >
>>> > I'd like to start a discussion on FIP-48: Introduce a Union Read Kernel
>>> > for fluss-rust.
>>> >
>>> > The proposal is available here:
>>> >
>>> > https://cwiki.apache.org/confluence/spaces/FLUSS/pages/444334625/FIP-48+Introduce+a+Union+Read+Kernel+for+fluss-rust
>>> >
>>> > Union read is already available to Java engines through the Flink
>>> > connector (FIP-6). FIP-48 brings the same capability to fluss-rust, so 
>>> > that
>>> > non-JVM engines (StarRocks, DataFusion, Python) can read lake-enabled
>>> > tables without embedding a JVM. This FIP was drafted together with 
>>> > beryllw.
>>> >
>>> > In short, it proposes a new fluss-lake crate (Paimon-first) providing:
>>> >
>>> > - A bounded batch read model: one lake snapshot plus its bounded log tail,
>>> > stitched at the readable-snapshot seam with no overlap and no gap
>>> > - A table -> scan -> plan -> read_split contract with distributable,
>>> > serializable, versioned splits; engines schedule splits and consume Arrow
>>> > streams without reimplementing seam or merge logic
>>> > - Three read semantics: append/log tables, primary-key tables (merged
>>> > current view), and lake-only
>>> > - Predicate pushdown with automatic partition/bucket pruning, plan-level
>>> > statistics, and a typed error surface
>>> >
>>> > Looking forward to your feedback and suggestions. Please feel free to
>>> > raise questions in this thread, and I will keep updating FIP-48 based on
>>> > the discussion. If there are no further concerns, I plan to start a vote
>>> > next week.
>>> >
>>> > Best regards,
>>> > Jim
> 

Reply via email to