Hi, I have tested the PutDatabaseRecord processor in case the database connection fails on Nifi version 1.26.0, and I propose to handle an error with retry policy.
After I disconnected the database connection, I got an error message below *ERROR* [Timer-Driven Process Thread-8] o.a.n.p.standard.PutDatabaseRecord PutDatabaseRecord[id=bcec93b5-306b-3fec-6eac-dfd3916a5dab] Failed to put Records to database for StandardFlowFileRecord[uuid=ba18e9a8-2cc8-4f7e-adcd-1da757b483b1,claim=StandardContentClaim [resourceClaim=StandardResourceClaim[id=1716964021086-21, container=default, section=21], offset=0, length=8450],offset=0,name=3bbaf37a-f692-4389-8cfa-59ce265ceaee,size=8450]. *Routing to failure.* *org.apache.nifi.processor.exception.ProcessException: Connection retrieval failed* at org.apache.nifi.dbcp.HikariCPConnectionPool.getConnection(HikariCPConnectionPool.java:363) at org.apache.nifi.dbcp.DBCPService.getConnection(DBCPService.java:55) at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:103) at java.base/java.lang.reflect.Method.invoke(Method.java:580) at org.apache.nifi.controller.service.StandardControllerServiceInvocationHandler.invoke(StandardControllerServiceInvocationHandler.java:254) at org.apache.nifi.controller.service.StandardControllerServiceInvocationHandler.invoke(StandardControllerServiceInvocationHandler.java:105) at jdk.proxy15/jdk.proxy15.$Proxy93.getConnection(Unknown Source) at org.apache.nifi.processors.standard.PutDatabaseRecord.onTrigger(PutDatabaseRecord.java:486) at org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27) at org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1361) at org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:247) at org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:102) at org.apache.nifi.engine.FlowEngine$2.run(FlowEngine.java:110) at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:572) at java.base/java.util.concurrent.FutureTask.runAndReset(FutureTask.java:358) at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:305) 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: java.sql.SQLTransientConnectionException: *HikariCPConnectionPool[id=c25182df-725f-3c25-649b-9481538a3ec2] - Connection is not available, request timed out after 5004ms. at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(HikariPool.java:696) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:197) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:162) at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:128) at org.apache.nifi.dbcp.HikariCPConnectionPool.getConnection(HikariCPConnectionPool.java:354) ... 18 common frames omitted *Caused by: java.sql.SQLRecoverableException:* IO Error: Invalid Operation, NOT Connected at oracle.jdbc.driver.T4CConnection.doSetNetworkTimeout(T4CConnection.java:9395) at oracle.jdbc.driver.PhysicalConnection.setNetworkTimeout(PhysicalConnection.java:10000) at com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:566) at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:173) at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:186) ... 21 common frames omitted *Caused by: oracle.net.ns.NetException:* Invalid Operation, NOT Connected at oracle.net.nt.TcpNTAdapter.setOption(TcpNTAdapter.java:757) at oracle.net.ns.NSProtocol.setOption(NSProtocol.java:730) at oracle.net.ns.NSProtocol.setSocketReadTimeout(NSProtocol.java:1045) at oracle.jdbc.driver.T4CConnection.doSetNetworkTimeout(T4CConnection.java:9392) ... 25 common frames omitted Then I checked on the source code of the PutDatabaseRecord processor and found code that handles Throwable with If clause. I see that it only has "if(toAnalyze instanceof SQLTransientException)" but not the ProcessException, thus, fails to catch this exception to handle as retry relationship. So I would like to clarify why this error routes to failure or if this is a bug. [image: image.png] Best Regard Nattida Pankiriya