Xiaobing Fang created FLINK-41207:
-------------------------------------

             Summary: Fluss pipeline source does not checkpoint consumed 
offsets across empty log intervals
                 Key: FLINK-41207
                 URL: https://issues.apache.org/jira/browse/FLINK-41207
             Project: Flink
          Issue Type: Bug
          Components: Flink CDC
            Reporter: Xiaobing Fang


h2. Description

The Fluss pipeline source loses consumption progress when the log scanner 
advances across an interval without returning any records.

{\{MultiTableRecords.consumedUpToOffset()}} reports the exclusive consumed 
offset for a bucket, even when its record list is empty. However, 
\{{FlussSplitReader}} only queues business records, and \{{FlussRecordEmitter}} 
only updates split state while processing those records.

The scanner can therefore advance while the checkpointed split offset remains 
unchanged. After recovery, the source scans the same empty interval again.

h2. Steps to reproduce

# Create an Indexed Log table and append one record.
# Consume the record through the CDC reader. The split's next offset becomes 
\{{1}}.
# Use ProduceLog RPC to append a valid batch with \{{recordCount=0}} whose 
\{{nextLogOffset}} advances to \{{2}}.
# Let the scanner consume the batch. It returns zero records and 
\{{consumedUpToOffset=2}}.
# Process the reader's fetched results, call \{{snapshotState()}}, and 
serialize the saved split.

*Expected:* The saved and serialized split offset is \{{2}}. Recovery resumes 
from offset \{{2}}.

*Actual:* The saved and serialized split offset remains \{{1}}. Recovery starts 
from offset \{{1}} and scans the empty interval again.

h2. Proposed fix

Carry consumption progress through the reader queue using a progress-only 
element:

* Queue it after all real records for the same bucket.
* Add it for empty buckets or when \{{consumedUpToOffset}} exceeds the last 
record's offset + 1.
* Update split state only when the reader thread processes it.
* Do not emit business records, consume pending schema events, or increase the 
input record count.

This also covers hybrid snapshot/log splits without changing the split 
serialization format.

h2. Validation

A real Fluss cluster regression test reproduces the failure with the old reader 
and passes with the fix. It verifies checkpoint timing, split serialization, 
and reading a new record after restoration.

Focused tests pass on:
* Flink 1.20.3 / Java 11
* Flink 2.2.0 / Java 17

h2. Scope

The empty batch above is a deterministic reproduction. A separate SDK batching 
defect can also produce such batches through normal append calls. Fixing that 
producer-side defect is outside the scope of this issue.



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to