Uploaded image for project: 'Crucible'
  1. Crucible
  2. CRUC-7341

Review page OutOfMemoryError caused by large commit messages

    XMLWordPrintable

Details

    • Bug
    • Resolution: Answered
    • Low
    • N/A
    • 3.0.0, 3.8.0
    • None

    Description

      Commit messages are copied by Crucible to CrucibleRevision entity and each file in commit contains copy of commit message. In case of large commit messages (several KB or MB) it may exhaust available memory and lead to OutOfMemoryError as follows

      qtp1962329560-515
        at java.lang.OutOfMemoryError.<init>()V (Unknown Source)
        at java.util.Arrays.copyOf([CI)[C (Unknown Source)
        at java.lang.AbstractStringBuilder.expandCapacity(I)V (Unknown Source)
        at java.lang.AbstractStringBuilder.ensureCapacityInternal(I)V (Unknown Source)
        at java.lang.AbstractStringBuilder.append([CII)Ljava/lang/AbstractStringBuilder; (Unknown Source)
        at java.lang.StringBuilder.append([CII)Ljava/lang/StringBuilder; (Unknown Source)
        at com.cenqua.crucible.hibernate.StringClobType.nullSafeGet(Ljava/sql/ResultSet;[Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/Object; (StringClobType.java:59)
        at org.hibernate.type.CustomType.nullSafeGet(Ljava/sql/ResultSet;[Ljava/lang/String;Lorg/hibernate/engine/SessionImplementor;Ljava/lang/Object;)Ljava/lang/Object; (CustomType.java:132)
        at org.hibernate.persister.collection.AbstractCollectionPersister.readElement(Ljava/sql/ResultSet;Ljava/lang/Object;[Ljava/lang/String;Lorg/hibernate/engine/SessionImplementor;)Ljava/lang/Object; (AbstractCollectionPersister.java:764)
        at org.hibernate.collection.PersistentMap.readFrom(Ljava/sql/ResultSet;Lorg/hibernate/persister/collection/CollectionPersister;Lorg/hibernate/loader/CollectionAliases;Ljava/lang/Object;)Ljava/lang/Object; (PersistentMap.java:280)
        at org.hibernate.loader.Loader.readCollectionElement(Ljava/lang/Object;Ljava/io/Serializable;Lorg/hibernate/persister/collection/CollectionPersister;Lorg/hibernate/loader/CollectionAliases;Ljava/sql/ResultSet;Lorg/hibernate/engine/SessionImplementor;)V (Loader.java:1072)
        at org.hibernate.loader.Loader.readCollectionElements([Ljava/lang/Object;Ljava/sql/ResultSet;Lorg/hibernate/engine/SessionImplementor;)V (Loader.java:690)
        at org.hibernate.loader.Loader.getRowFromResultSet(Ljava/sql/ResultSet;Lorg/hibernate/engine/SessionImplementor;Lorg/hibernate/engine/QueryParameters;[Lorg/hibernate/LockMode;Lorg/hibernate/engine/EntityKey;Ljava/util/List;[Lorg/hibernate/engine/EntityKey;Z)Ljava/lang/Object; (Loader.java:630)
        at org.hibernate.loader.Loader.doQuery(Lorg/hibernate/engine/SessionImplementor;Lorg/hibernate/engine/QueryParameters;Z)Ljava/util/List; (Loader.java:745)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Lorg/hibernate/engine/SessionImplementor;Lorg/hibernate/engine/QueryParameters;Z)Ljava/util/List; (Loader.java:270)
        at org.hibernate.loader.Loader.loadCollection(Lorg/hibernate/engine/SessionImplementor;Ljava/io/Serializable;Lorg/hibernate/type/Type;)V (Loader.java:2082)
        at org.hibernate.loader.collection.CollectionLoader.initialize(Ljava/io/Serializable;Lorg/hibernate/engine/SessionImplementor;)V (CollectionLoader.java:62)
        at org.hibernate.persister.collection.AbstractCollectionPersister.initialize(Ljava/io/Serializable;Lorg/hibernate/engine/SessionImplementor;)V (AbstractCollectionPersister.java:628)
        at org.hibernate.event.def.DefaultInitializeCollectionEventListener.onInitializeCollection(Lorg/hibernate/event/InitializeCollectionEvent;)V (DefaultInitializeCollectionEventListener.java:83)
        at org.hibernate.impl.SessionImpl.initializeCollection(Lorg/hibernate/collection/PersistentCollection;Z)V (SessionImpl.java:1853)
        at org.hibernate.collection.AbstractPersistentCollection.initialize(Z)V (AbstractPersistentCollection.java:369)
        at org.hibernate.collection.AbstractPersistentCollection.read()V (AbstractPersistentCollection.java:111)
        at org.hibernate.collection.AbstractPersistentCollection.readElementByIndex(Ljava/lang/Object;)Ljava/lang/Object; (AbstractPersistentCollection.java:186)
        at org.hibernate.collection.PersistentMap.get(Ljava/lang/Object;)Ljava/lang/Object; (PersistentMap.java:169)
        at com.cenqua.crucible.model.CrucibleRevision$DetailsMap.get(Ljava/lang/Object;)Ljava/lang/String; (CrucibleRevision.java:679)
        at com.cenqua.crucible.model.CrucibleRevision$DetailsMap.get(Ljava/lang/Object;)Ljava/lang/Object; (CrucibleRevision.java:607)
        at com.cenqua.crucible.model.CrucibleRevision.getDetail(Ljava/lang/String;)Ljava/lang/String; (CrucibleRevision.java:428)
        at com.cenqua.crucible.model.FRXRevision.getLinesChanged()I (FRXRevision.java:196)
        at com.cenqua.crucible.model.ReviewParticipant.getPercentageComplete()Ljava/lang/Integer; (ReviewParticipant.java:263)
        at sun.reflect.GeneratedMethodAccessor799.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (Unknown Source)
        at java.lang.reflect.Method.invoke(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object; (Unknown Source)
        at javax.el.BeanELResolver.getValue(Ljavax/el/ELContext;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; (BeanELResolver.java:305)
        at javax.el.CompositeELResolver.getValue(Ljavax/el/ELContext;Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; (CompositeELResolver.java:188)
        at com.sun.el.parser.AstValue.getValue(Ljava/lang/Object;Lcom/sun/el/parser/Node;Lcom/sun/el/lang/EvaluationContext;)Ljava/lang/Object; (AstValue.java:120)
        at com.sun.el.parser.AstValue.getValue(Lcom/sun/el/lang/EvaluationContext;)Ljava/lang/Object; (AstValue.java:167)
        at com.sun.el.ValueExpressionImpl.getValue(Ljavax/el/ELContext;)Ljava/lang/Object; (ValueExpressionImpl.java:224)
        at org.apache.jasper.runtime.PageContextImpl.evaluateExpression(Ljava/lang/String;Ljava/lang/Class;Ljavax/servlet/jsp/PageContext;Lorg/apache/jasper/runtime/ProtectedFunctionMapper;)Ljava/lang/Object; (PageContextImpl.java:1009)
        at org.apache.jsp.tag.web.review.reviewPage_tag._jspx_meth_c_if_5(Ljavax/servlet/jsp/tagext/JspTag;Ljavax/servlet/jsp/PageContext;[I)Z (reviewPage_tag.java:1568)
        at org.apache.jsp.tag.web.review.reviewPage_tag._jspx_meth_c_forEach_5(Ljavax/servlet/jsp/tagext/JspTag;Ljavax/servlet/jsp/PageContext;)Z (reviewPage_tag.java:1520)
        at org.apache.jsp.tag.web.review.reviewPage_tag.doTag()V (reviewPage_tag.java:778)
        at org.apache.jsp.WEB_002dINF.jsp.crucible.review.monolithic.review_jsp._jspx_meth_rev_reviewPage_0(Ljavax/servlet/jsp/PageContext;)Z (review_jsp.java:181)
        at org.apache.jsp.WEB_002dINF.jsp.crucible.review.monolithic.review_jsp._jspService(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V (review_jsp.java:156)
        at org.apache.jasper.runtime.HttpJspBase.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;)V (HttpJspBase.java:111)
        at javax.servlet.http.HttpServlet.service(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (HttpServlet.java:848)
        at org.eclipse.jetty.servlet.ServletHolder.handle(Lorg/eclipse/jetty/server/Request;Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (ServletHolder.java:669)
        at org.eclipse.jetty.servlet.ServletHandler$Chain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (ServletHandler.java:1526)
        at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (IteratingFilterChain.java:46)
        at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (DelegatingPluginFilter.java:70)
        at com.atlassian.applinks.core.rest.context.ContextFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (ContextFilter.java:25)
        at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (DelegatingPluginFilter.java:78)
        at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (IteratingFilterChain.java:42)
        at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (DelegatingPluginFilter.java:70)
        at com.atlassian.prettyurls.filter.PrettyUrlsCommonFilter.preventDoubleInvocation(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)Ljavax/servlet/http/HttpServletRequest; (PrettyUrlsCommonFilter.java:38)
        at com.atlassian.prettyurls.filter.PrettyUrlsSiteMeshFixupFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (PrettyUrlsSiteMeshFixupFilter.java:24)
        at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (DelegatingPluginFilter.java:78)
        at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (IteratingFilterChain.java:42)
        at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter$1.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (DelegatingPluginFilter.java:70)
        at com.atlassian.prettyurls.filter.PrettyUrlsDispatcherFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (PrettyUrlsDispatcherFilter.java:60)
        at com.atlassian.plugin.servlet.filter.DelegatingPluginFilter.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;Ljavax/servlet/FilterChain;)V (DelegatingPluginFilter.java:78)
        at com.atlassian.plugin.servlet.filter.IteratingFilterChain.doFilter(Ljavax/servlet/ServletRequest;Ljavax/servlet/ServletResponse;)V (IteratingFilterChain.java:42)
      

      Workaround

      To mitigate the issue we may truncate large commit messages in the database by running following SQL query:

      UPDATE cru_fr_detail
      SET cru_value = SUBSTRING(cru_value, 0, 2000)
      WHERE cru_name = 'comment' AND length(cru_value) > 2000
      

      Attachments

        Activity

          People

            Unassigned Unassigned
            czawadka@atlassian.com Cezary Zawadka
            Votes:
            1 Vote for this issue
            Watchers:
            8 Start watching this issue

            Dates

              Created:
              Updated:
              Resolved: