bug(connectors): Flink source skips records after checkpoint recovery
Los mantenedores suelen responder en 1 día
@goutamadwant ya está trabajando en esto.
Desde el 16/9/2026.
Evaluación
Este issue todavía no se ha evaluado.
Descripción
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
- Lenguaje dominante
- Rust
- Estrellas
- 5.2k
- Forks
- 502
- Merge medio
- 3 d 8 h
- PR fusionados (30 d)
- 146
Preparar el entorno
Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.
- Incluye un Dockerfile o un archivo de Docker Compose
- Tiene una plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de apache/iggy
-
Go examples: add a message envelope producer and consumerPosiblemente ocupada @ThunderGod77 la tomó hace 1 día. Abiertogo good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 82/100
apache/iggy#4694 · 3 comentarios · 1 asignado ·
Los mantenedores suelen responder en 1 día
-
HTTP client treats a consumer group as a plain consumerPosiblemente ocupada @mohitduhan19 la tomó hace 19 días. Abiertobug rust server
Dificultad 2/5 1-3 horas Aptitud para principiantes 75/100
apache/iggy#4408 · 2 comentarios ·
Los mantenedores suelen responder en 1 día
-
Add the fail-fast connection option to the Rust and Python quick-startsPosiblemente ocupada @QIW9 la tomó hace 6 días. Abiertodocs good first issue
Dificultad 1/5 1-3 horas Aptitud para principiantes 92/100
apache/iggy#4261 · 3 comentarios ·
Los mantenedores suelen responder en 1 día
-
bug python sdk
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
apache/iggy#3748 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
perf(cluster): reduce idle replica traffic caused by Commit heartbeatsPosiblemente ocupada @mmmmxa la tomó hace 1 día. Abiertoapi cluster performance
apache/iggy#4707 · 1 asignado ·
Los mantenedores suelen responder en 1 día
Todos los issues de apache/iggy
Issues similares
-
docs(metrics): replace stale src/metrics.rs line anchors in dashboard-metrics.md with symbol namesAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 88/100
Los mantenedores suelen responder en 1 día
-
ci-cd desktop size:low telemetry-improvement telemetry-round-1
Dificultad 2/5 1-3 horas Aptitud para principiantes 66/100
vfarcic/dot-agent-deck#2079 ·
Los mantenedores suelen responder en 1 día
-
[Feature] 侧边栏Agent HTTP请求UA适配Abiertoenhancement user-priority/P3
Dificultad 2/5 1-3 horas Aptitud para principiantes 68/100
t8y2/dbx#14196 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 65/100
Los mantenedores suelen responder en 1 día
-
Rename SerVtdExt to ServtdExtAbierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 62/100
Los mantenedores suelen responder en 2 días