Class ReconcilingBinlogReader

java.lang.Object
io.debezium.connector.mysql.legacy.ReconcilingBinlogReader
All Implemented Interfaces:
Reader

public class ReconcilingBinlogReader extends Object implements Reader
A reader that unifies the binlog positions of two binlog readers. To do this, at start time we evaluate the (now completed) states of the two binlog readers we want to unify, and create a new BinlogReader duplicating the lagging reader, but with a halting predicate that will halt it once it has passed the final position of the leading reader.
  • Field Details

  • Constructor Details

    • ReconcilingBinlogReader

      public ReconcilingBinlogReader(BinlogReader binlogReaderA, BinlogReader binlogReaderB, BinlogReader unifiedReader, long serverId)
      Create a reconciling Binlog Reader.
      Parameters:
      binlogReaderA - the first binlog reader to unify.
      binlogReaderB - the second binlog reader to unify.
      unifiedReader - the final, unified binlog reader that will run once the reconciliation is complete.
  • Method Details

    • name

      public String name()
      Description copied from interface: Reader
      Get the name of this reader.
      Specified by:
      name in interface Reader
      Returns:
      the reader's name; never null
    • state

      public Reader.State state()
      Description copied from interface: Reader
      Get the current state of this reader.
      Specified by:
      state in interface Reader
      Returns:
      the state; never null
    • uponCompletion

      public void uponCompletion(Consumer<MySqlPartition> handler)
      Description copied from interface: Reader
      Set the function that should be called when this reader transitions from the Reader.State.STOPPING to Reader.State.STOPPED state, which is after all generated records have been consumed via the poll method.

      This method should only be called while the reader is in the Reader.State.STOPPED state.

      Specified by:
      uponCompletion in interface Reader
      Parameters:
      handler - the function; may not be null
    • start

      public void start(MySqlPartition partition)
      Description copied from interface: Reader
      Start the reader and return immediately. Once started, the SourceRecords generated by the reader can be obtained by periodically calling Reader.poll() until that method returns null.

      This method does nothing if it is already running.

      Specified by:
      start in interface Reader
    • stop

      public void stop()
      Description copied from interface: Reader
      Stop the reader from running and transition to the Reader.State.STOPPING state until all remaining records are consumed, at which point its state transitions to Reader.State.STOPPED.
      Specified by:
      stop in interface Reader
    • poll

      public List<org.apache.kafka.connect.source.SourceRecord> poll() throws InterruptedException
      Description copied from interface: Reader
      Poll for the next batch of source records. This method returns null only when all records generated by this reader have been processed, following the natural or explicit stopping of this reader. Note that this method may block if no additional records are available but the reader may produce more, thus callers should call this method continually until this method returns null.
      Specified by:
      poll in interface Reader
      Returns:
      the list of source records that may or may not be empty; or null when there will be no more records because the reader has completely Reader.State.STOPPED.
      Throws:
      InterruptedException - if this thread is interrupted while waiting for more records
    • completeSuccessfully

      private void completeSuccessfully()
    • setupUnifiedReader

      private void setupUnifiedReader()
    • determineLeadingReader

      private void determineLeadingReader()
    • getLeadingReader

      BinlogReader getLeadingReader()
    • getLaggingReader

      BinlogReader getLaggingReader()
    • checkLaggingLeadingInfo

      private void checkLaggingLeadingInfo()