Hi Nattida,
I remembered something right after I sent the last email,
SLQTransientConnectionException is a subclass of SQLTransientException so I do 
not have to add an implicit check for SLQTransientConnectionException.

Here is the Jira Ticket and the proposed change in a Pull Request that I made 
for this issue.

Ticket
https://issues.apache.org/jira/browse/NIFI-13397

Pull Request
https://github.com/apache/nifi/pull/8964

Best Regards,
Jim

> On Jun 13, 2024, at 3:39 AM, Nattida Pankiriya 
> <[email protected]> wrote:
> 
> 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. 
> 
> 
> 
> 
> Best Regard 
> Nattida Pankiriya

Reply via email to