-
Bug
-
Resolution: Done
-
Major
-
3.2.1.Final, 3.3.0.Alpha2
-
None
-
False
-
-
False
-
-
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.
- links to
-
RHEA-2025:154266 Red Hat build of Debezium 3.2.4 release