Skip to content

PS-11080: Spoiled logical clock information in rewritten binlog#122

Open
kamil-holubicki wants to merge 1 commit into
Percona-Lab:0.2from
kamil-holubicki:PS-11080
Open

PS-11080: Spoiled logical clock information in rewritten binlog#122
kamil-holubicki wants to merge 1 commit into
Percona-Lab:0.2from
kamil-holubicki:PS-11080

Conversation

@kamil-holubicki
Copy link
Copy Markdown

https://perconadev.atlassian.net/browse/PS-11080

Rewrite mode strips source binlog framing events and merges transactions into local binlog files of configurable size. MySQL's logical clock (sequence_number, last_committed) is defined per physical binlog file on the source. Once those boundaries are removed on the consumer, the raw values from the source are no longer valid: sequence numbers can repeat after each source rotation, and last_committed=0 at a source file boundary no longer implies the same ordering guarantee when everything lives in one local file.
Introduce a rewrite-mode GTID renumberer that assigns a monotonic local sequence_number and translates last_committed so dependencies stay within the current local file and cross-source-file ordering is preserved. Support both classic GTID events and GTID_TAGGED_LOG_EVENT, including re-encoding tagged bodies when logical-clock fields change encoded size.
Persist enough renumberer state in per-binlog JSON metadata so that after a process restart or a new binsrv invocation the stream can continue appending to the same local file without colliding with sequence numbers already written. Track committed vs in-flight renumberer state so that after a mid-transaction disconnect the discarded partial transaction does not leave recovery metadata pointing past the last completed transaction on disk.
Add MTR coverage for coalesced source rotations, local rotation by file size, resume across invocations, and resume after a partial transaction with a deterministic source-side stall.

https://perconadev.atlassian.net/browse/PS-11080

Rewrite mode strips source binlog framing events and merges transactions
into local binlog files of configurable size. MySQL's logical clock
(sequence_number, last_committed) is defined per physical binlog file on
the source. Once those boundaries are removed on the consumer, the raw
values from the source are no longer valid: sequence numbers can repeat
after each source rotation, and last_committed=0 at a source file
boundary no longer implies the same ordering guarantee when everything
lives in one local file.
Introduce a rewrite-mode GTID renumberer that assigns a monotonic local
sequence_number and translates last_committed so dependencies stay
within the current local file and cross-source-file ordering is
preserved. Support both classic GTID events and GTID_TAGGED_LOG_EVENT,
including re-encoding tagged bodies when logical-clock fields change
encoded size.
Persist enough renumberer state in per-binlog JSON metadata so that after
a process restart or a new binsrv invocation the stream can continue
appending to the same local file without colliding with sequence numbers
already written. Track committed vs in-flight renumberer state so that
after a mid-transaction disconnect the discarded partial transaction does
not leave recovery metadata pointing past the last completed transaction
on disk.
Add MTR coverage for coalesced source rotations, local rotation by file
size, resume across invocations, and resume after a partial transaction
with a deterministic source-side stall.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant