> I'd also like us to focus on closing the gap with the Java client on > predicate pushdown. Agreed — predicate pushdown is a great optimization, and the read path will benefit significantly from it.
One thing that was missing in upstream paimon-rust was an object-store-safe existence check in the filesystem catalog. It checked whether database/table directories “exist”, which works on local filesystems but can fail on S3/OSS because those directories are just prefixes, not real objects. I forked it to fix that, so lake reads can reliably open Paimon tables from object storage. Thanks again, Anton, for putting this roadmap together! I think we could share it at the July 3rd community meeting. I've also been working on some designs around lake kernel read and the Fluss Gateway REST API — happy to discuss those as well if time allows. Best regards, Junbo Wang > 2026年6月25日 07:23,Anton Borisov <[email protected]> 写道: > > Hi Yuxia and Junbo, > > Yuxia, on PK changelog reads across the bindings: I have already > prepared record-mode CDC for Rust, Python and C++. It's small, and > the PK union read in Theme 2 needs it anyway. > > Junbo, I looked through your prototype branch. It is clear that a lot > of Themes 1, 2 and 4 already exist there as working code and it does > seem to answer two of the open questions: the three-way crate split > (lake kernel / adapter / gateway), and pinning a single Arrow/DataFusion > version at the workspace level. +1 to both. > > Two separate FIPs with detailed design for REST/SQL gateway parts - makes > sense. > > One thing I noticed and want to discuss: > The "lake read" currently depends on a fork of paimon-rust, can you share > what was missing in paimon-rust? > > I'd also like us to focus on closing the gap with the Java client on > predicate pushdown. > In the interim we can push predicates into the lake (Paimon already > supports it) and apply them as a filter pass over the real-time log > tail. > > Good to hear you want to drive this forward, given the prototype, that > makes sense to me. I am happy to review the design and following PRs. > > Looking forward to the write-up with your findings. > > -- Anton > > вт, 23 июн. 2026 г. в 15:10, Junbo Wang <[email protected]>: >> >> Thanks Anton for kicking this off — funnily enough, I'd been arriving at >> very similar conclusions while prototyping on my side, so let me share a bit >> of what came out of those experiments. >> >>> THEME 1: DATAFUSION INTEGRATION ADAPTER [MUST-HAVE] >> >> Agree. Having the DataFusion integration live in fluss-rust would make it >> reusable across more downstream projects. One thing we might want to keep in >> mind: it would probably be worth aligning the DataFusion and Arrow versions >> with pg-datafusion so the whole stack stays on a consistent set of versions. >> >>> THEME 2: LAKE + LOG UNION READ (PAIMON-FIRST) [MUST-HAVE] >> >> Agree. I'd lean toward putting this in a separate fluss-lake module that >> exposes a client capable of doing the union read over the lake and the Fluss >> log. That way the lake-side dependencies stay isolated in their own module >> and don't bleed into the core fluss-rust code. One thing that might be worth >> flagging here: the lake side already supports predicate pushdown, while >> Fluss doesn't yet — so we'd probably think about how the union read handles >> that asymmetry in the interim. >> >> THEME 4: GATEWAY [STRETCH] — A thin HTTP frontend over the client >> >> I wonder if we could expand on this one a bit. My suggestion would be to >> split the SQL REST surface and the plain REST API into two separate FIPs. A >> read/write REST API on its own — somewhat in the spirit of kafka-rest, >> covering reads, writes, and metadata management — would already be a quick >> win for broadening Fluss's data ingestion/access reach, and it doesn't >> depend on anything else. The SQL REST surface, on the other hand, has to >> wait on Themes 1–2, so it might make sense to split them and ship the plain >> REST API first. >> >> >> >> Also, it might make sense to have the gateway as a separate crate inside the >> Fluss project itself — especially since fluss-rust will be moving into the >> Fluss repo anyway. >> >> On a personal note, this is something I'm really excited about and would >> love to help push forward. I'll share a write-up of what came out of my demo >> experiments with the community over the next few weeks. >> >> >> Best regards, >> Junbo Wang >> >>> 2026年6月23日 20:55,Yuxia Luo <[email protected]> 写道: >>> >>> Thanks for putting this together. +1 on the overall framing. My answers to >>> the open questions, plus one addition: >>> >>> Open questions: >>> - Themes 1-2 as must-have, rest stretch: agree, the ordering makes sense to >>> me. >>> - Paimon first, Iceberg later: +1. Reusing paimon-rust is the pragmatic >>> path, and the union-read design generalizes to Iceberg the same way later. >>> - Pin one arrow/DataFusion version across core, union-read/lake, and DF: >>> yes, we should pin a single version. Letting these drift will cause painful >>> Arrow type/ABI mismatches across the crate boundary, so a shared pinned >>> version (bumped deliberately, not per-crate) is worth the discipline. >>> - Separate crates (lake kernel, DataFusion adapter, gateway): +1 on >>> separate crates. It keeps the dependency surface clean - the adapter and >>> gateway are optional consumers, and the lake kernel shouldn't drag >>> DataFusion into anyone who only needs the core read path. >>> >>> One addition I'd like to propose for the scope: >>> PK-table CHANGELOG read, and expose it across the bindings - specifically >>> C++ and Python - so non-Rust CDC consumers can subscribe. >>> >>> On 2026/06/22 14:49:52 Anton Borisov wrote: >>>> Hi all, >>>> >>>> With the previous roadmap wrapping up - complex types >>>> (Array/Row/Map/nesting), limit and prefix scan, schema-aware KV >>>> decoding, the metrics framework, and write optimisations, thanks to >>>> everyone who contributed and reviewed, I'd like to open discussion on >>>> the roadmap. >>>> >>>> I propose framing around a single goal: make fluss-rust a first-class >>>> analytical query surface - a Rust-native SQL/DataFrame path over Fluss >>>> (DataFusion, and through it Polars/DuckDB/gateways), reading the lake >>>> tier at scale, built on the analytical primitives we just landed. >>>> >>>> As before, I grouped the items into themes with an initial must-have / >>>> stretch positioning. Please push back where you disagree. >>>> >>>> THEME 1: DATAFUSION INTEGRATION ADAPTER [MUST-HAVE] >>>> A standalone fluss-datafusion crate exposing TableProvider + Catalog >>>> over the existing client, so SELECT ... FROM . works from any >>>> DataFusion-based engine. It should be framed as an integration adapter >>>> over the Rust core, not a bundled engine. A gateway (FIP-32) or any >>>> analytical consumer can use it or not. >>>> >>>> Scope: TableProvider + CatalogProvider/SchemaProvider backed by the >>>> metadata path. >>>> >>>> Map DataFusion's projection/filter/limit pushdown onto the client's >>>> existing access paths: a full primary-key equality becomes a lookup, a >>>> bucket-key prefix becomes a prefix lookup, LIMIT becomes a bounded >>>> scan, otherwise a log scan. Filters an access path fully satisfies are >>>> reported exact, the rest are left for DataFusion to apply (server-side >>>> filter pushdown is Theme 3). >>>> >>>> THEME 2: LAKE + LOG UNION READ (PAIMON-FIRST) [MUST-HAVE] >>>> A client-side read that presents a lake-enabled table as one table. >>>> Its history is tiered to the lake (Paimon) and recent writes are still >>>> in the Fluss log, the lake snapshot records the log offset it covers, >>>> so we read the lake up to that offset and the Fluss log past it, then >>>> combine. >>>> Scope: >>>> - Per bucket: the lake snapshot plus the Fluss log past the tiered offset. >>>> - Log tables: concatenate the two. PK tables: apply the newer log >>>> records to get current state. >>>> - Paimon first, reusing paimon-rust, Iceberg/Lance later the same >>>> way. The DataFusion adapter reads lake-enabled tables through this >>>> path. >>>> - Bounded batch first, streaming later >>>> >>>> Reusing paimon-rust means wrapping an existing reader, so it's rather >>>> feasible and straightforward. >>>> >>>> THEME 3: FOUNDATIONS [STRETCH] >>>> Server-side value-predicate (filter) pushdown. The proto field exists, >>>> but the client currently sends none. This prunes lake/log scans and >>>> unblocks the gateway's filter pushdown (the open question I raised for >>>> 0.2.0), cross-checked against the Java PredicateConverter semantics. >>>> >>>> THEME 4: GATEWAY [STRETCH] >>>> A thin HTTP frontend over the client we already have independent of >>>> Themes 1–3. It's how non-Rust/non-SQL clients (TS/JS, microservices, >>>> curl) write to Fluss and do simple key access. >>>> - Write: upsert/append, delete, create/drop tables, metadata. The >>>> mature client write path essentially. >>>> - Read: point lookup, prefix lookup, bounded log / CDC poll - one >>>> endpoint per existing primitive, bounded and stateless. >>>> The tradeoff: no joins, filters, or aggregations - that's the SQL >>>> surface, and it needs the adapter and probably will be an ongoing >>>> effort to optimise later. >>>> - If Themes 1–2 ship, we unlock SQL frontends on top - PostgreSQL >>>> via datafusion-postgres, as one example >>>> In short: REST is the no-regret floor, SQL is the ceiling deferred >>>> until Themes 1–2. >>>> >>>> PARALLEL TRACK: ELIXIR + BINDING EXPOSURE >>>> Continue Elixir parity and expose newly-landed primitives (prefix >>>> lookup, etc.) across Python / C++ / Elixir. >>>> >>>> GOVERNANCE TRACK >>>> FIP-40: Consolidate apache/fluss-rust into apache/fluss - PR is ready, >>>> looks pretty good, waiting for a good moment to rebase/merge. >>>> >>>> OPEN QUESTIONS >>>> - Themes 1–2 must-have, the rest stretch. Reasonable? Anything >>>> missing or mis-ordered? >>>> - Paimon first, Iceberg later? >>>> - Pin one arrow/DataFusion version across core, union-read/lake, and DF? >>>> - Separate crates: lake kernel, DataFusion adapter, gateway? >>>> >>>> Looking forward to feedback. >>>> >>>> -- Anton >>>> >>
