-
Task
-
Resolution: Done
-
Major
-
None
-
None
-
False
-
-
False
-
-
In some scenarios, a table may still be busy when an exception is thrown while Oracle finishes performing DML operations, and this can cause the TestHelper#dropTable method to throw the following error:
java.sql.SQLException: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired at io.debezium.connector.oracle.util.TestHelper.dropTable(TestHelper.java:458) at io.debezium.connector.oracle.OracleXmlDataTypesIT.shouldStreamTableWithXmlTypeColumnAndOtherNonLobColumns(OracleXmlDataTypesIT.java:494)
This leaves an unexpected table defined that can lead to unexpected results in other tests, as was the cause in the test execution here:
06:40:07,235 [ERROR] SchemaHistoryTopicIT.snapshotSchemaChanges:121 Expected size: 5 but was: 4 in: [SourceRecord{sourcePartition={server=server1}, sourceOffset={commit_scn=null, snapshot_scn=18540152, snapshot=INITIAL, snapshot_completed=false, scn=18540152}} ConnectRecord{topic='server1.DEBEZIUM.TABLEB', kafkaPartition=null, key=Struct{ID=10}, keySchema=Schema{server1.DEBEZIUM.TABLEB.Key:STRUCT}, value=Struct{after=Struct{ID=10,COLB=b},source=Struct{version=3.4.0-SNAPSHOT,connector=oracle,name=server1,ts_ms=1759558564000,snapshot=first_in_data_collection,db=ORCLPDB1,ts_us=1759558564000000,ts_ns=1759558564000000000,schema=DEBEZIUM,table=TABLEB,scn=18540152,ssn=0},op=r,ts_ms=1759558567952,ts_us=1759558567952932,ts_ns=1759558567952932097}, valueSchema=Schema{server1.DEBEZIUM.TABLEB.Envelope:STRUCT}, timestamp=null, headers=ConnectHeaders(headers=[ConnectHeader(key=__debezium.context.connectorLogicalName, value=server1, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.taskId, value=0, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.connectorName, value=oracle, schema=Schema{STRING})])}, SourceRecord{sourcePartition={server=server1}, sourceOffset={commit_scn=null, snapshot_scn=18540152, snapshot=INITIAL, snapshot_completed=false, scn=18540152}} ConnectRecord{topic='server1.DEBEZIUM.TABLEB', kafkaPartition=null, key=Struct{ID=11}, keySchema=Schema{server1.DEBEZIUM.TABLEB.Key:STRUCT}, value=Struct{after=Struct{ID=11,COLB=b},source=Struct{version=3.4.0-SNAPSHOT,connector=oracle,name=server1,ts_ms=1759558564000,snapshot=true,db=ORCLPDB1,ts_us=1759558564000000,ts_ns=1759558564000000000,schema=DEBEZIUM,table=TABLEB,scn=18540152,ssn=0},op=r,ts_ms=1759558567952,ts_us=1759558567952979,ts_ns=1759558567952979070}, valueSchema=Schema{server1.DEBEZIUM.TABLEB.Envelope:STRUCT}, timestamp=null, headers=ConnectHeaders(headers=[ConnectHeader(key=__debezium.context.connectorLogicalName, value=server1, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.taskId, value=0, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.connectorName, value=oracle, schema=Schema{STRING})])}, SourceRecord{sourcePartition={server=server1}, sourceOffset={commit_scn=null, snapshot_scn=18540152, snapshot=INITIAL, snapshot_completed=false, scn=18540152}} ConnectRecord{topic='server1.DEBEZIUM.TABLEB', kafkaPartition=null, key=Struct{ID=12}, keySchema=Schema{server1.DEBEZIUM.TABLEB.Key:STRUCT}, value=Struct{after=Struct{ID=12,COLB=b},source=Struct{version=3.4.0-SNAPSHOT,connector=oracle,name=server1,ts_ms=1759558564000,snapshot=true,db=ORCLPDB1,ts_us=1759558564000000,ts_ns=1759558564000000000,schema=DEBEZIUM,table=TABLEB,scn=18540152,ssn=0},op=r,ts_ms=1759558567952,ts_us=1759558567952987,ts_ns=1759558567952987631}, valueSchema=Schema{server1.DEBEZIUM.TABLEB.Envelope:STRUCT}, timestamp=null, headers=ConnectHeaders(headers=[ConnectHeader(key=__debezium.context.connectorLogicalName, value=server1, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.taskId, value=0, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.connectorName, value=oracle, schema=Schema{STRING})])}, SourceRecord{sourcePartition={server=server1}, sourceOffset={commit_scn=null, snapshot_scn=18540152, snapshot=INITIAL, snapshot_completed=false, scn=18540152}} ConnectRecord{topic='server1.DEBEZIUM.TABLEB', kafkaPartition=null, key=Struct{ID=13}, keySchema=Schema{server1.DEBEZIUM.TABLEB.Key:STRUCT}, value=Struct{after=Struct{ID=13,COLB=b},source=Struct{version=3.4.0-SNAPSHOT,connector=oracle,name=server1,ts_ms=1759558564000,snapshot=true,db=ORCLPDB1,ts_us=1759558564000000,ts_ns=1759558564000000000,schema=DEBEZIUM,table=TABLEB,scn=18540152,ssn=0},op=r,ts_ms=1759558567952,ts_us=1759558567952992,ts_ns=1759558567952992631}, valueSchema=Schema{server1.DEBEZIUM.TABLEB.Envelope:STRUCT}, timestamp=null, headers=ConnectHeaders(headers=[ConnectHeader(key=__debezium.context.connectorLogicalName, value=server1, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.taskId, value=0, schema=Schema{STRING}), ConnectHeader(key=__debezium.context.connectorName, value=oracle, schema=Schema{STRING})])}] 06:40:07,235 [ERROR] Errors: 06:40:07,235 [ERROR] OracleXmlDataTypesIT.shouldStreamTableWithXmlTypeColumnAndOtherNonLobColumns:494 ยป Runtime java.sql.SQLException: ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired
To help combat this use case, the dropTable method should have a retry mechanism that uses exponential backoff, .e.g:
2025-10-04 08:06:54,332 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (1 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:06:55,332 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (2 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:06:57,333 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (3 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:07:01,333 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (4 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:07:09,333 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (5 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:07:25,333 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (6 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:07:55,333 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (7 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:08:25,334 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (8 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:08:55,334 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (9 / 10). [io.debezium.connector.oracle.util.TestHelper] 2025-10-04 08:09:25,334 WARN OracleXmlDataTypesIT||test ORA-00054 table 'dbz3605' is busy, drop table will be retried (10 / 10). [io.debezium.connector.oracle.util.TestHelper] (then fails)