Uploaded image for project: 'FishEye'
  1. FishEye
  2. FE-5479

CommiterMappingManager.getAllCommittersForUser tries to acquire() all repositories, which might lead to memory starvation

    XMLWordPrintable

Details

    Description

      All repositories are acquired() to get commiter stats, but never released until the request-level Disposer frees them.

      Consider getting the data from elsewhere, without traversing all the caches (Lucene commiter index?)

      Caused by: java.lang.OutOfMemoryError: OutOfMemoryError during opening of InfinityDB file .../var/cache/.../revcache/data.bin
              at com.cenqua.obfuscate.idbn40xhg._n40xhgIDB.open(InfinityDB_3.0.21:811)
              at com.cenqua.obfuscate.idbn40xhg._n40xhgIDB.open(InfinityDB_3.0.21:741)
              at com.cenqua.obfuscate.idbn40xhg._n40xhgIDB.open(InfinityDB_3.0.21:650)
              at com.cenqua.fisheye.infinitydb.InfinityDbHandle.open(InfinityDbHandle.java:72)
              at com.cenqua.fisheye.infinitydb.InfinityDbHandle.get(InfinityDbHandle.java:54)
              at com.cenqua.fisheye.rep.impl.CommonChangeSetDAO.createAllAuthorsSet(CommonChangeSetDAO.java:699)
              at com.cenqua.fisheye.rep.impl.CommonChangeSetDAO.access$000(CommonChangeSetDAO.java:59)
              at com.cenqua.fisheye.rep.impl.CommonChangeSetDAO$1.create(CommonChangeSetDAO.java:71)
              at com.cenqua.fisheye.rep.impl.CommonChangeSetDAO$1.create(CommonChangeSetDAO.java:67)
              at com.atlassian.util.concurrent.LazyReference$Sync.run(LazyReference.java:321)
              at com.atlassian.util.concurrent.LazyReference.getInterruptibly(LazyReference.java:143)
              at com.atlassian.util.concurrent.LazyReference.get(LazyReference.java:112)
              at com.cenqua.fisheye.rep.impl.CommonChangeSetDAO.getAllAuthors(CommonChangeSetDAO.java:689)
              at com.cenqua.fisheye.cache.BaseRevisionCache.getAllAuthors(BaseRevisionCache.java:920)
              at com.cenqua.fisheye.model.manager.CommitterUserMappingManagerImpl.getImplicitCommittersForUserInRep(CommitterUserMappingManagerImpl.java:342)
              at sun.reflect.GeneratedMethodAccessor585.invoke(Unknown Source)
              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.lang.reflect.Method.invoke(Method.java:601)
              at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
              at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
              at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
              at com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.invokeCacheable(EhCacheInterceptor.java:133)
              at com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.invoke(EhCacheInterceptor.java:79)
              at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
              at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
              at $Proxy40.getImplicitCommittersForUserInRep(Unknown Source)
              at com.cenqua.fisheye.model.manager.CommitterUserMappingManagerImpl.getAllCommittersForUser(CommitterUserMappingManagerImpl.java:294)
              at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
              at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
              at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
              at java.lang.reflect.Method.invoke(Method.java:601)
              at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
              at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
              at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
              at com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.invokeCacheable(EhCacheInterceptor.java:133)
              at com.googlecode.ehcache.annotations.interceptor.EhCacheInterceptor.invoke(EhCacheInterceptor.java:79)
              at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
              at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
              at $Proxy40.getAllCommittersForUser(Unknown Source)
              at com.cenqua.fisheye.model.manager.CommitterUserMappingManagerImpl.getAllCommittersForUser(CommitterUserMappingManagerImpl.java:281)
      

      Workaround #1

      Increase the heap size

      Workaround #2

      Disable implicit committers.

      JVM property fisheye.enable.implicit.committers

      Whether user-committer mapping should query repository cache to find implicit committers. Enabled by default.

      • In case of case of large repositories with many commit authors fetching this data may take more time,
      • prolonging sql queries and thus consuming all database connections available - as this search is executed
      • inside an sql query which collects both explicit committers (from database) and implicit ones (from infinitydb).

      Note: this is an undocumented property, not listed on https://confluence.atlassian.com/fisheye/jvm-system-properties-960155689.html

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              lpater Lukasz Pater
              Votes:
              3 Vote for this issue
              Watchers:
              9 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved: