Search before asking
Version
What's Wrong?
CCR incremental replication applies upstream rowsets on the target cluster through IngestBinlog. For a UNIQUE KEY merge-on-write table, the Shared-Nothing ingest path submits commit-phase delete bitmap work and waits for its asynchronous token, but discards both returned statuses:
static_cast<void>(BaseTablet::commit_phase_update_delete_bitmap(...));
static_cast<void>(calc_delete_bitmap_token->wait());
If delete bitmap calculation fails—for example, because an allocation is rejected by the system-memory low-water-mark check—the worker logs the error, but IngestBinlog can continue to commit the rowset. The version can then be published without the required delete bitmap.
MOW reads rely on the persisted delete bitmap instead of performing read-time key merging. Consequently, historical rows for the same unique key can become visible, producing duplicate unique keys with different values or update timestamps.
This issue is specific to the Shared-Nothing CCR IngestBinlog path. Ordinary load paths use different transaction and publish-version error propagation.
There is also a related cleanup gap: the deferred failure handler captured download_success_files by value before downloads occurred, so files downloaded by a failed ingest were not included in cleanup.
What You Expected?
Any synchronous submission failure or asynchronous delete bitmap calculation failure must:
- Be propagated through the
IngestBinlog response.
- Abort the local tablet transaction before rowset commit/publish.
- Leave the failed version invisible.
- Remove files downloaded by the failed ingest.
- Allow CCR to retry the same binlog safely.
No rowset should become visible unless all required MOW delete bitmap calculations have completed successfully.
How to Reproduce?
No response
Anything Else?
No response
Are you willing to submit PR?
Code of Conduct
Search before asking
Version
What's Wrong?
CCR incremental replication applies upstream rowsets on the target cluster through
IngestBinlog. For a UNIQUE KEY merge-on-write table, the Shared-Nothing ingest path submits commit-phase delete bitmap work and waits for its asynchronous token, but discards both returned statuses:If delete bitmap calculation fails—for example, because an allocation is rejected by the system-memory low-water-mark check—the worker logs the error, but
IngestBinlogcan continue to commit the rowset. The version can then be published without the required delete bitmap.MOW reads rely on the persisted delete bitmap instead of performing read-time key merging. Consequently, historical rows for the same unique key can become visible, producing duplicate unique keys with different values or update timestamps.
This issue is specific to the Shared-Nothing CCR
IngestBinlogpath. Ordinary load paths use different transaction and publish-version error propagation.There is also a related cleanup gap: the deferred failure handler captured
download_success_filesby value before downloads occurred, so files downloaded by a failed ingest were not included in cleanup.What You Expected?
Any synchronous submission failure or asynchronous delete bitmap calculation failure must:
IngestBinlogresponse.No rowset should become visible unless all required MOW delete bitmap calculations have completed successfully.
How to Reproduce?
No response
Anything Else?
No response
Are you willing to submit PR?
Code of Conduct