Details
-
Bug
-
Resolution: Answered
-
Low
-
3.0.0, 3.8.0
-
None
-
Severity 3 - Minor
-
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