-
Suggestion
-
Resolution: Unresolved
-
None
-
8
-
2
-
Current Feature behavior:
Space Analytics Content tab data export job considers all pages regardless if they have events or not. This leads to the below performance issues when the export job is executed.
This is reproducible on Data Center: Yes
Proposed Feature Request:
Space Analytics Content tab data export job should only take into consideration pages with events which can help in avoiding the performance issue.
Steps to Reproduce performance issue when Space Analytics Content tab data export job contains all pages of space(pages with event and without events).
- Create a Confluence site with any version.
- Create a space having more than 100k content. Create large page counts in Confluence using REST Client for Testing. can be used to populate the space with content.
- Rebuild the index.
- Go to Space -> Demonstration Space -> Analytics -> Content tab.
- Choose a date range of one Day and choose Export to Excel from the drop-down menu.
Or
For an existing Confluence site having a Space that has more than 100k content perform the below steps: - Go to Space -> Demonstration Space -> Analytics -> Content tab.
- Choose a date range of one Day and choose Export to Excel from the drop-down menu.
- The CSV file never gets downloaded and creates a stuck thread that never clears causing high CPU usage for Confluence Java process.
- Stuck thread detail:
16-Jul-2023 12:56:55.684 WARNING [Catalina-utility-2] org.apache.catalina.valves.StuckThreadDetectionValve.notifyStuckThreadDetected Thread [http-nio-6840-exec-2 url: /rest/confanalytics/1.0/space/contentViews.xlsx; user: xxxx] (id=[222]) has been active for [1,987,765] milliseconds (since [7/16/23, 12:23 PM]) to serve the same request for [http://<confluence-base-url>/rest/confanalytics/1.0/space/contentViews.xlsx?spaceKey=ds&includeMyActivity=undefined&fromDate=2023-07-11T22%3A00 %3A00.000Z&toDate=2023-07-12T22%3A00%3A00.000Z&type=total&period=day&timezone=GMT%2B02%3A00&content=page%2Cblog] and may be stuck (configured threshold for this StuckThreadDetectionValve is [60] seconds). There is/are [2] thread(s) in total that are monitored by this Valve and may be stuck. java.lang.Throwable at java.base@17.0.7/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.7/java.lang.reflect.Method.invoke(Method.java:568) at org.hibernate.property.access.spi.GetterMethodImpl.get(GetterMethodImpl.java:42) at org.hibernate.tuple.entity.AbstractEntityTuplizer.getIdentifier(AbstractEntityTuplizer.java:230) at org.hibernate.persister.entity.AbstractEntityPersister.getIdentifier(AbstractEntityPersister.java:5280) at org.hibernate.event.internal.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:74) at org.hibernate.event.internal.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:203) at org.hibernate.event.internal.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:162) at org.hibernate.event.internal.AbstractFlushingEventListener$$Lambda$2061/0x0000000801c6e098.accept(Unknown Source) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:229) at org.hibernate.event.internal.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:93) at org.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:39) at org.hibernate.internal.SessionImpl$$Lambda$2064/0x0000000801c6ee08.accept(Unknown Source) at org.hibernate.event.service.internal.EventListenerGroupImpl.fireEventOnEachListener(EventListenerGroupImpl.java:107) at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1407) at org.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:489) at org.hibernate.internal.SessionImpl.flushBeforeTransactionCompletion(SessionImpl.java:3290) at org.hibernate.internal.SessionImpl.beforeTransactionCompletion(SessionImpl.java:2425) at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.beforeTransactionCompletion(JdbcCoordinatorImpl.java:449) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.beforeCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:183) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$300(JdbcResourceLocalTransactionCoordinatorImpl.java:40) at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.commit(JdbcResourceLocalTransactionCoordinatorImpl.java:281) at org.hibernate.engine.transaction.internal.TransactionImpl.commit(TransactionImpl.java:101) at org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:643) at com.atlassian.confluence.impl.hibernate.ConfluenceHibernateTransactionManager.doCommit(ConfluenceHibernateTransactionManager.java:59) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:743) at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) at jdk.internal.reflect.GeneratedMethodAccessor204.invoke(Unknown Source) at java.base@17.0.7/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base@17.0.7/java.lang.reflect.Method.invoke(Method.java:568) at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) at jdk.proxy4/jdk.proxy4.$Proxy106.commit(Unknown Source) at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:654) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:407) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:220) at jdk.proxy4/jdk.proxy4.$Proxy176.getUserByKey(Unknown Source) ........ at com.addonengine.addons.analytics.service.confluence.server.SpaceServiceServerImpl.getCurrentUser(SpaceServiceServerImpl.kt:189) at com.addonengine.addons.analytics.service.confluence.server.SpaceServiceServerImpl.getByKeysInternal(SpaceServiceServerImpl.kt:158) at com.addonengine.addons.analytics.service.confluence.server.SpaceServiceServerImpl.getByKey(SpaceServiceServerImpl.kt:45) at com.addonengine.addons.analytics.service.confluence.server.ContentServiceServerImpl.toAnalyticsObject(ContentServiceServerImpl.kt:51) at com.addonengine.addons.analytics.service.confluence.server.ContentServiceServerImpl.getByIdOrNull(ContentServiceServerImpl.kt:35) ... at com.addonengine.addons.analytics.service.SpacePaginatedAnalyticsServiceImpl.getActivityByContent(SpacePaginatedAnalyticsServiceImpl.kt:92)