Hanyu Zheng created FLINK-41217:
-----------------------------------

             Summary: VALUES source emits its rows again when a streaming job 
restores from a checkpoint taken before the source exits
                 Key: FLINK-41217
                 URL: https://issues.apache.org/jira/browse/FLINK-41217
             Project: Flink
          Issue Type: Bug
          Components: Runtime / Checkpointing, Table SQL / Planner
            Reporter: Hanyu Zheng


A VALUES clause in a streaming job is translated by CommonExecValues into an
InputFormatSourceFunction. This source has no state: it does not record how 
many rows
it has emitted. After a restore, the only thing that stops it from running 
again is the
"fully finished" marker in the checkpoint (FLIP-147).

That marker is not set as early as one would expect. After VALUES has emitted 
all of its
rows, the task does not exit right away. It waits for one more checkpoint to 
complete
(call it checkpoint N). Checkpoint N is triggered while the task is still 
RUNNING, so it
stores no state for VALUES and does not mark it as finished. Only the next 
checkpoint
(N+1), triggered after the task has exited, marks it as finished.

If the job fails and is restored from checkpoint N (or any earlier checkpoint), 
VALUES
reads all of its rows again from row 0. The downstream operators already 
counted these
rows before the failure, so every row is processed twice. The window lasts from 
the job
start until checkpoint N+1 completes, which is roughly one to two checkpoint 
intervals.

Steps to reproduce:

  INSERT INTO snk
  SELECT id, COUNT(*) FROM (
    SELECT id FROM (VALUES (1), (2), (3)) AS v(id)
    UNION ALL SELECT 1000 AS id FROM gen       -- unbounded datagen keeps the 
job alive
  ) GROUP BY id

  1. Start the job with checkpointing enabled and wait ts rows.
  2. Trigger a checkpoint while the VALUES vertex is still RUNNING (checkpoint 
N).
     The VALUES vertex becomes FINISHED after it comple
  3. Cancel the job and restore it from checkpoint N.

Expected: the sink holds (1, 1), (2, 1), (3, 1).
Actual:   the restored job reads the VALUES rows again,

Restoring from checkpoint N+1 does not reproduce it, bes VALUES
as finished.

Proposed fix:

Run VALUES with a source that checkpoints its position, so a restored job emits 
only the
rows it has not emitted yet. Make the change only for Vnd leave
all other InputFormatSourceFunction users untouched. Prefer the FLIP-27 Source 
interface
and reuse an existing source (for example DataGeneratorction,
as StreamExecutionEnvironment#fromData does) instead of adding a new source.



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

Reply via email to