[ 
https://issues.apache.org/jira/browse/FLINK-39398?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Piotr Nowojski reassigned FLINK-39398:
--------------------------------------

    Assignee: Aleksandr Savonin

> Handle duplicate key errors in MongoWriter bulk write retry loop
> ----------------------------------------------------------------
>
>                 Key: FLINK-39398
>                 URL: https://issues.apache.org/jira/browse/FLINK-39398
>             Project: Flink
>          Issue Type: Improvement
>          Components: Connectors / MongoDB
>            Reporter: Aleksandr Savonin
>            Assignee: Aleksandr Savonin
>            Priority: Major
>
> MongoWriter.doBulkWrite() catches MongoException broadly without inspecting 
> MongoBulkWriteException.getWriteErrors(). This causes two problems when bulk 
> writes encounter duplicate key errors (E11000):
> *Problem 1: Infinite restart loop*
> When using InsertOneModel with a unique index and AT_LEAST_ONCE delivery 
> guarantee, an unplanned failure (TaskManager kill, OOM, crash) causes Flink 
> to replay records from the last checkpoint. Some of these records may already 
> exist in MongoDB because they were written before the crash but the source 
> offset was not yet committed. The retry loop retries the identical batch 
> unchanged, all retries fail with the same E11000 errors, and after exhausting 
> maxRetries throws IOException. Flink restarts from checkpoint, replays the 
> same records, and the cycle repeats indefinitely.
> *Problem 2: Un-attempted operations dropped with ordered=true*
> With ordered=true (the default), MongoDB stops at the first error. Operations 
> after the error index are never attempted by the server. The current code 
> retries the entire batch unchanged without re-queuing un-attempted 
> operations, which can lead to data loss.
>  
> *Solution*
> Add a configurable sink.duplicate-key-handling option with two strategies:
> - fail (default): *Preserves* existing retry behavior. Improves the error 
> message to suggest skip-duplicates or upsert mode when E11000 is detected.
> - skip-duplicates: Inspects MongoBulkWriteException.getWriteErrors() 
> per-operation. Skips duplicate key errors. For ordered=true, re-queues 
> un-attempted operations after the error index. For ordered=false, considers 
> non-duplicate operations as already succeeded (no re-queuing).



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to