Uploaded image for project: 'Debezium'
  1. Debezium
  2. DBZ-9413

LCR flushing can cause low watermark to be invalidated

XMLWordPrintable

      When the XStream connector is stopped, it will perform an LCR position flush; however, this can lead to a situation where if the XStream process is aggressively honoring the flush request, the connector can fail upon restart with:

      2025-08-29 09:28:53,134 ERROR  BlockingSnapshotIT||engine  org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped.   [io.debezium.connector.oracle.BlockingSnapshotIT]
      org.apache.kafka.connect.errors.ConnectException: An exception occurred in the change event producer. This connector will be stopped.
      	at io.debezium.pipeline.ErrorHandler.setProducerThrowable(ErrorHandler.java:67)
      	at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:142)
      	at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:46)
      	at io.debezium.pipeline.ChangeEventSourceCoordinator.streamEvents(ChangeEventSourceCoordinator.java:326)
      	at io.debezium.pipeline.ChangeEventSourceCoordinator.executeChangeEventSources(ChangeEventSourceCoordinator.java:207)
      	at io.debezium.pipeline.ChangeEventSourceCoordinator.lambda$start$0(ChangeEventSourceCoordinator.java:147)
      	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572)
      	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:317)
      	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1144)
      	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:642)
      	at java.base/java.lang.Thread.run(Thread.java:1583)
      Caused by: oracle.streams.StreamsException: ORA-21560: argument last_position is null, invalid, or out of range
      
      	at oracle.streams.XStreamOut.XStreamOutAttachNative(Native Method)
      	at oracle.streams.XStreamOut.attachInternal(Unknown Source)
      	at oracle.streams.XStreamOut.attach(Unknown Source)
      	at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.connectAndAttachWithRetries(XstreamStreamingChangeEventSource.java:177)
      	at io.debezium.connector.oracle.xstream.XstreamStreamingChangeEventSource.execute(XstreamStreamingChangeEventSource.java:111)
      	... 9 common frames omitted
      

      This can be a bit problematic with Oracle XStream because we use LCR positions, which is a byte array that represents not only the SCN but other position-related values allowing XStream to uniquely identify which row within a block of changes with the same SCN it should resume from.

      So ideally, the offset position should lag behind by 1 LcrPosition so that on restart we do not hit a situation where we are trying to resume from an already confirmed & flushed position on the outbound server queue.

              ccranfor@redhat.com Chris Cranford
              ccranfor@redhat.com Chris Cranford
              Votes:
              0 Vote for this issue
              Watchers:
              3 Start watching this issue

                Created:
                Updated:
                Resolved: