bug(connectors): Flink source skips records after checkpoint recovery
I maintainer di solito rispondono entro 1 giorno
@goutamadwant ci sta già lavorando.
Dal 16/9/2026.
Valutazione
Questa issue non è ancora stata valutata.
Descrizione
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
- Lingua principale
- Rust
- Stelle
- 5.2k
- Fork
- 502
- Merge medio
- 3g 8h
- PR unite (30g)
- 146
Preparare l'ambiente
Avvia il container di sviluppo del progetto nel browser, con il tuo account GitHub.
- Include un Dockerfile o un file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/iggy
-
Go examples: add a message envelope producer and consumerForse già presa @ThunderGod77 l’ha presa oggi. Apertago good first issue
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/iggy#4694 · 3 commenti · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
-
HTTP client treats a consumer group as a plain consumerForse già presa @mohitduhan19 l’ha presa 18 giorni fa. Apertabug rust server
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
apache/iggy#4408 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
Add the fail-fast connection option to the Rust and Python quick-startsForse già presa @QIW9 l’ha presa 6 giorni fa. Apertadocs good first issue
Difficoltà 1/5 1-3 ore Idoneità per principianti 92/100
apache/iggy#4261 · 3 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
bug python sdk
Difficoltà 2/5 1-3 ore Idoneità per principianti 68/100
apache/iggy#3748 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
perf(cluster): reduce idle replica traffic caused by Commit heartbeatsForse già presa @mmmmxa l’ha presa oggi. Apertaapi cluster performance
apache/iggy#4707 · 1 assegnatario ·
I maintainer di solito rispondono entro 1 giorno
Issue simili
-
area:docs documentation good first issue priority:medium
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 78/100
rtk-ai/rtk#4958 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
calagopus/panel#285 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug]: streamed Responses API flex_unavailable error maps to 500 InternalServerError instead of 429Apertallm translation
Difficoltà 2/5 Meno di un'ora Idoneità per principianti 85/100
BerriAI/litellm#49736 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
question
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
autoindex tests: denied loopback bind shows only PermissionDenied (255 failures), not the causeApertafield-report
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
I maintainer di solito rispondono entro 1 giorno