bug(connectors): Flink source skips records after checkpoint recovery
メンテナーはふだん 1 日以内に返信
@goutamadwant がすでに取り組んでいます。
2026年9月16日 から。
評価
この issue はまだ評価されていません。
説明
Bug description
The Flink source skips records after restoring a completed checkpoint when those records were polled before a task failure but were not included in the checkpoint. The job resumes processing newer records without replaying the skipped batch.
Expected: records after the restored checkpoint are replayed, preserving at-least-once delivery. This does not require an exactly-once external sink.
Actual: in a real Flink checkpoint/restart test, records 10–19 were missing from recovered downstream state, while records 0–9 and a newly published record 20 were present. An independent explicit-offset read confirmed all 21 records remained in Iggy. This is skipped delivery, not deletion from server storage.
Affected area / component
Connectors, Java SDK
The Java Flink source under foreign/java/external-processors/iggy-connector-flink/iggy-connector-library.
Deployment
Docker (DockerHub image)
Versions
- Iggy server 0.9.0 and Java SDK/connector built from
71f29618ba04917fded0ef5cd085c206fef0ee49. - Server image:
apache/iggy@sha256:4524170018b8d3b7c24753dfd63bfa6437055e3e4ff3e49027d300fd9dea9c14; its revision label and startup log match the checkout. - Flink 2.3.0, Java 21.0.5.
- The two source files discussed below are unchanged on current master
5c571ceddf532c250871cb138d58e0b5a43e0339.
Hardware / environment
Local ARM64 environment with a Linux Iggy container and a Flink local MiniCluster. One Iggy server, one topic partition, one consumer group, and Flink parallelism 1. No multi-reader or rescaling claim.
Reproduction
Use the existing IggySource<String> with StringDeserializationSchema, poll batch size 10, earliest starting offset, checkpointing every 200 ms, and one fixed-delay restart. The downstream operator stores processed record IDs in checkpointed ListState<String>.
- Create an isolated stream, a single-partition topic and a consumer group. Publish
record-0throughrecord-9to partition 0. - Start the Flink job and wait for a completed checkpoint containing those ten IDs in downstream state.
- Publish
record-10throughrecord-19in one batch. - In the downstream operator, throw once when receiving
record-10, before adding it to state. Keep the failure-injected flag outside checkpointed state so recovery does not fail repeatedly. - Wait for Flink to restore its completed checkpoint. The downstream operator restores records 0–9.
- Publish
record-20and wait for it to reach the recovered operator. - Compare the recovered IDs with records 0–20. Records 10–19 are missing.
- Read the topic independently with explicit offset 0 and auto-commit disabled: all 21 input records are still present.
The job-level reproduction produced the same result in a focused run and a subsequent full connector-module run. All 109 existing module tests and two uninterrupted-consumption controls passed; the added recovery assertions failed. Production source and build configuration were not modified.
Logs
Condensed from the reproduction output:
Completed checkpoint: processed = [record-0 ... record-9]
Injected failure: before processing record-10
Restored operator state: [record-0 ... record-9]
Expected recovered state: [record-0 ... record-20]
Actual recovered state: [record-0 ... record-9, record-20]
Independent Iggy read: [record-0 ... record-20]
Iggy server config
Default server settings apart from test credentials and networking overrides:
IGGY_TCP_ADDRESS=0.0.0.0:18090
IGGY_HTTP_ADDRESS=0.0.0.0:18000
IGGY_NODE_ADVERTISED_ADDRESS=127.0.0.1
IGGY_SHARDING_CPU_ALLOCATION=all
Both ports were published only on loopback. The container was restricted to two CPUs with the usual integration-test seccomp/memlock settings.
Suspected cause and scope
IggyPartitionSplitReader.poll() always polls with PollingStrategy.next() and autoCommit=true. The broker offset advances before Flink processing completes, and the offset carried by the restored split is not used to select the polling position.
Checkpoint bookkeeping also needs consideration: IggySourceReader.snapshotState() captures fetched split offsets even while records remain queued. A separate real-server reader test emitted only record 0 before snapshotting offset 10; the broker already stored offset 9. Restoring that serialized split did not emit records 1–9.
The scope here is the Flink source's checkpoint/replay behavior. Related: #2205 tracks broader Java offset APIs; #2928 concerns the separate Rust sink runtime. Simply disabling auto-commit is not a complete proposed fix; polling position and checkpoint state need a consistent ownership model.
Contribution
- I'm willing to submit a pull request to fix this bug
- 主要言語
- Rust
- スター
- 5.2k
- フォーク
- 516
- 平均マージ
- 2日 21時間
- マージ済み PR(30日)
- 159
環境構築
このプロジェクトの開発コンテナを、あなたの GitHub アカウントでブラウザ上に起動します。
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートあり
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/iggy のほかの issue
-
Go examples: add a message envelope producer and consumer対応中かも @ThunderGod77 が 5 日前に担当しました。 オープンgo good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
apache/iggy#4694 · コメント 3 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
HTTP client treats a consumer group as a plain consumer対応中かも @mohitduhan19 が 23 日前に担当しました。 オープンbug rust server
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
メンテナーはふだん 1 日以内に返信
-
Add the fail-fast connection option to the Rust and Python quick-starts対応中かも @QIW9 が 11 日前に担当しました。 オープンdocs good first issue
難易度 1/5 1〜3時間 初心者へのやさしさ 92/100
メンテナーはふだん 1 日以内に返信
-
ResourceNotFound from the binary protocol prints an empty key対応中かも @xalestar が 2 日前に担当しました。 オープンapi python rust
apache/iggy#4767 · コメント 2 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
-
Node SDK: send accepts malformed user headers that fail during polling対応中かも @Subham-KRLX が 3 日前に担当しました。 オープンbug good first issue javascript
apache/iggy#4750 · コメント 3 件 · 担当者 1 名 ·
メンテナーはふだん 1 日以内に返信
似ている issue
-
bug priority: low
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
storytold/photocraft#12183 · コメント 1 件 ·
メンテナーはふだん 2 日以内に返信
-
area:render needs-triage
難易度 2/5 1〜3時間 初心者へのやさしさ 78/100
bherbruck/solvecraft#13138 ·
-
testing
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
-
難易度 2/5 1〜3時間 初心者へのやさしさ 86/100
ratatui/ratatui-textarea#39 ·
-
bug
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
transit-audio/transit#369 ·