You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ofbiz.apache.org by "Aditya Sharma (Jira)" <ji...@apache.org> on 2022/05/12 10:29:00 UTC

[jira] [Commented] (OFBIZ-12613) StackOverflowError and database blocking when exporting "performFind" via rest-api

    [ https://issues.apache.org/jira/browse/OFBIZ-12613?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17536028#comment-17536028 ] 

Aditya Sharma commented on OFBIZ-12613:
---------------------------------------

Hello [~sixtyone] 
I think you should use the performFindList service which closes the EntityListIterator.
https://github.com/apache/ofbiz-framework/blob/trunk/framework/common/src/main/java/org/apache/ofbiz/common/FindServices.java#L466

> StackOverflowError and database blocking when exporting "performFind" via rest-api
> ----------------------------------------------------------------------------------
>
>                 Key: OFBIZ-12613
>                 URL: https://issues.apache.org/jira/browse/OFBIZ-12613
>             Project: OFBiz
>          Issue Type: Improvement
>            Reporter: Sixty One
>            Priority: Minor
>         Attachments: image-2022-05-11-15-18-56-803.png, image-2022-05-11-15-23-54-422.png, image-2022-05-11-15-29-11-425.png, rest-expose-performFind-no-iterator.patch, rest-expose-performFind.patch
>
>
> I am running on latest trunk but cannot select trunk within "Affects Version/s" here.
>  
> I experimented with OFBiz findServices (performFind, performFindList, performFindItem) via rest-api. I observed two things that I'd like to understand as I do not know if those are really bugs and such things are of interest for the OFBiz community in general.
> h1. performFind leads to StackOverflowError
> I exposed the performFindService within "rest-expose-performFind.patch". Requesting a search via rest-api:
> {code:java}
> POST /rest/services/performFind HTTP/1.1
> Host: localhost:8443
> Authorization: Bearer ...
> Content-Type: application/json
> {
>     "entityName": "Facility",
>     "inputFields": {
>         "facilityName": "a",
>         "facilityName_ic": "Y",
>         "facilityName_op": "contains"
>     }
> } {code}
> Leads to an infinite loop that "finishes" with an StackOverFlowError:
> !image-2022-05-11-15-18-56-803.png!
> I reckon that this is due to the fact that the performFind-service retunrs an Iterator instead of a List.
> h1. performFind without ListIterator leaves database connections open
> What I tried next is to get rid of that ListIterator within rest-expose-performFind-no-iterator.patch
> !image-2022-05-11-15-23-54-422.png!
> It "works" (at least I can work with the response) but somehow the performFind-service leaves the database connections open until they finally block after ~250 requests. Afterwards there's no chance to send new requests or login to OFBiz without a restart.
> {code:java}
> 2022-05-11 15:24:47,140 |jsse-nio-8443-exec-7 |ServiceDispatcher             |T| Sync service [rest-api/prepareFind] finished in [1] milliseconds
> 2022-05-11 15:24:47,141 |jsse-nio-8443-exec-7 |ServiceDispatcher             |T| Sync service [rest-api/executeFind] finished in [1] milliseconds
> 2022-05-11 15:24:47,141 |jsse-nio-8443-exec-7 |ServiceDispatcher             |T| Sync service [rest-api/performFind] finished in [2] milliseconds
> 2022-05-11 15:24:48,038 |jsse-nio-8443-exec-1 |ServiceRequestFilter          |I| Service request is going to get validated!
> 2022-05-11 15:24:48,040 |jsse-nio-8443-exec-1 |ServiceDispatcher             |T| Sync service [rest-api/executeFind] finished in [1] milliseconds
> 2022-05-11 15:24:48,040 |jsse-nio-8443-exec-1 |ServiceDispatcher             |T| Sync service [rest-api/performFind] finished in [1] milliseconds
> 2022-05-11 15:26:48,826 |sse-nio-8443-exec-10 |GenericDelegator              |E| Failure in findByCondition operation for entity [UserLogin]: org.apache.ofbiz.entity.GenericDataSourceException: Unable to establish a connection with the database. (Unable to acquire a new connection from the pool). Rolling back transaction. 
> org.apache.ofbiz.entity.GenericDataSourceException: Unable to establish a connection with the database. (Unable to acquire a new connection from the pool)
>         at org.apache.ofbiz.entity.jdbc.SQLProcessor.getConnection(SQLProcessor.java:287) ~[main/:?]
>         at org.apache.ofbiz.entity.jdbc.SQLProcessor.prepareStatement(SQLProcessor.java:372) ~[main/:?]
>         at org.apache.ofbiz.entity.datasource.GenericDAO.selectListIteratorByCondition(GenericDAO.java:806) ~[main/:?]
>         at org.apache.ofbiz.entity.datasource.GenericHelperDAO.findListIteratorByCondition(GenericHelperDAO.java:157) ~[main/:?]
>         at org.apache.ofbiz.entity.GenericDelegator.find(GenericDelegator.java:1600) ~[main/:?]
>         at org.apache.ofbiz.entity.GenericDelegator.findList(GenericDelegator.java:1648) ~[main/:?]
>         at org.apache.ofbiz.entity.util.EntityQuery.query(EntityQuery.java:468) ~[main/:?]
>         at org.apache.ofbiz.entity.util.EntityQuery.queryList(EntityQuery.java:397) ~[main/:?]
>         at org.apache.ofbiz.entity.util.EntityQuery.queryOne(EntityQuery.java:441) ~[main/:?]
>         at org.apache.ofbiz.ws.rs.security.auth.APIAuthFilter.extractUserLoginFromJwtClaim(APIAuthFilter.java:143) ~[main/:?]
>         at org.apache.ofbiz.ws.rs.security.auth.APIAuthFilter.filter(APIAuthFilter.java:105) ~[main/:?]
>         at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:108) ~[jersey-server-2.31.jar:?]
>         at org.glassfish.jersey.server.ContainerFilteringStage.apply(ContainerFilteringStage.java:44) ~[jersey-server-2.31.jar:?]
>         at org.glassfish.jersey.process.internal.Stages.process(Stages.java:173) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.server.ServerRuntime$1.run(ServerRuntime.java:245) ~[jersey-server-2.31.jar:?]
>         at org.glassfish.jersey.internal.Errors$1.call(Errors.java:248) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.internal.Errors$1.call(Errors.java:244) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.internal.Errors.process(Errors.java:292) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.internal.Errors.process(Errors.java:274) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.internal.Errors.process(Errors.java:244) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:265) ~[jersey-common-2.31.jar:?]
>         at org.glassfish.jersey.server.ServerRuntime.process(ServerRuntime.java:232) ~[jersey-server-2.31.jar:?]
>         at org.glassfish.jersey.server.ApplicationHandler.handle(ApplicationHandler.java:680) ~[jersey-server-2.31.jar:?]
>         at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:394) ~[jersey-container-servlet-core-2.31.jar:?]
>         at org.glassfish.jersey.servlet.ServletContainer.serviceImpl(ServletContainer.java:386) ~[jersey-container-servlet-core-2.31.jar:?]
>         at org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:561) ~[jersey-container-servlet-core-2.31.jar:?]
>         at org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:502) ~[jersey-container-servlet-core-2.31.jar:?]
>         at org.glassfish.jersey.servlet.ServletContainer.doFilter(ServletContainer.java:439) ~[jersey-container-servlet-core-2.31.jar:?]
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.logging.log4j.web.Log4jServletFilter.doFilter(Log4jServletFilter.java:71) ~[log4j-web-2.17.2.jar:2.17.2]
>         at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:541) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:687) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:360) ~[tomcat-catalina-9.0.60.jar:9.0.60]
>         at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:399) ~[tomcat-coyote-9.0.60.jar:9.0.60]
>         at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) ~[tomcat-coyote-9.0.60.jar:9.0.60]
>         at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:889) ~[tomcat-coyote-9.0.60.jar:9.0.60]
>         at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1743) ~[tomcat-coyote-9.0.60.jar:9.0.60]
>         at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) ~[tomcat-coyote-9.0.60.jar:9.0.60]
>         at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-util-9.0.60.jar:9.0.60]
>         at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-util-9.0.60.jar:9.0.60]
>         at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-util-9.0.60.jar:9.0.60]
>         at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_322]
> Caused by: java.sql.SQLException: Unable to acquire a new connection from the pool
>         at org.apache.commons.dbcp2.managed.ManagedConnection.updateTransactionStatus(ManagedConnection.java:305) ~[commons-dbcp2-2.9.0.jar:2.9.0]
>         at org.apache.commons.dbcp2.managed.ManagedConnection.<init>(ManagedConnection.java:89) ~[commons-dbcp2-2.9.0.jar:2.9.0]
>         at org.apache.commons.dbcp2.managed.ManagedDataSource.getConnection(ManagedDataSource.java:64) ~[commons-dbcp2-2.9.0.jar:2.9.0]
>         at org.apache.ofbiz.entity.connection.DebugManagedDataSource.getConnection(DebugManagedDataSource.java:57) ~[main/:?]
>         at org.apache.ofbiz.entity.connection.DBCPConnectionFactory.getConnection(DBCPConnectionFactory.java:68) ~[main/:?]
>         at org.apache.ofbiz.entity.transaction.GeronimoTransactionFactory.getConnection(GeronimoTransactionFactory.java:77) ~[main/:?]
>         at org.apache.ofbiz.entity.jdbc.SQLProcessor.getConnection(SQLProcessor.java:282) ~[main/:?]
>         ... 49 more
> Caused by: java.util.NoSuchElementException: Timeout waiting for idle object
>         at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:321) ~[commons-pool2-2.10.0.jar:2.10.0]
>         at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:428) ~[commons-pool2-2.10.0.jar:2.10.0]
>         at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:232) ~[commons-pool2-2.10.0.jar:2.10.0]
>         at org.apache.commons.dbcp2.managed.ManagedConnection.updateTransactionStatus(ManagedConnection.java:302) ~[commons-dbcp2-2.9.0.jar:2.9.0]
>         at org.apache.commons.dbcp2.managed.ManagedConnection.<init>(ManagedConnection.java:89) ~[commons-dbcp2-2.9.0.jar:2.9.0]
>         at org.apache.commons.dbcp2.managed.ManagedDataSource.getConnection(ManagedDataSource.java:64) ~[commons-dbcp2-2.9.0.jar:2.9.0]
>         at org.apache.ofbiz.entity.connection.DebugManagedDataSource.getConnection(DebugManagedDataSource.java:57) ~[main/:?]
>         at org.apache.ofbiz.entity.connection.DBCPConnectionFactory.getConnection(DBCPConnectionFactory.java:68) ~[main/:?]
>         at org.apache.ofbiz.entity.transaction.GeronimoTransactionFactory.getConnection(GeronimoTransactionFactory.java:77) ~[main/:?]
>         at org.apache.ofbiz.entity.jdbc.SQLProcessor.getConnection(SQLProcessor.java:282) ~[main/:?]
>         ... 49 more {code}
> !image-2022-05-11-15-29-11-425.png!
> The services performFindList and performFindItem which in fact also use performFind do not show that behavior after 250 requests. Somehow performFind leaves connections open where performFindList and performFindItem seem to close them!?



--
This message was sent by Atlassian Jira
(v8.20.7#820007)