-
Suggestion
-
Resolution: Fixed
-
standalone, Apache Tomcat/5.5.26, JDK 1.6.0_10, Linux 2.6.9-55.ELsmp
NOTE: This suggestion is for JIRA Server. Using JIRA Cloud? See the corresponding suggestion.
One of our projects now has over 32000 issues that each have attachments.
When a user went to give the 32,001 issue an attachment, the file system refused it because it has a maximum of 32000 file handles per directory.
The problem is that each issue gets its own sub-directory underneath the project key in the attachment path.
There needs to be some sort of arbitrary middle directory between the project key and the issue directory, similar to how photos are stored on SIM cards. Maybe group issues in groups by the fourth power of ten?
For example, instead of
/usr/local/jira/attachments/JRA/JRA-123456
have
/usr/local/jira/attachments/JRA/120000/JRA-123456
For now we've moved the 1,000 oldest attachments to another directory, effectively deleting them from the Jira web site.
So we have a couple weeks to come up with some patch for this or we keep effectively archiving or deleting old attachments.
I understand from our OS folks that it would be possible to recompile the kernel to have a higher maximum file handle setting. However, my management wants to pursue an application solution rather than risk the OS recompilation solution.
Here is the error reported in the logs:
2009-11-23 10:15:37,371 TP-Processor94 ERROR [jira.issue.fields.AttachmentSystemField] Error occurred while creating attachment. com.atlassian.jira.web.util.AttachmentException: Cannot write to attachment directory. Check that the application server and JIRA have permissions to write to: /usr/local/jira/attachments/NOV/NOV-83753 at com.atlassian.jira.util.AttachmentUtils.checkValidAttachmentDirectory(AttachmentUtils.java:109) at com.atlassian.jira.issue.managers.DefaultAttachmentManager.createAttachment(DefaultAttachmentManager.java:277) at com.atlassian.jira.issue.managers.DefaultAttachmentManager.createAttachment(DefaultAttachmentManager.java:294) at com.atlassian.jira.issue.fields.AttachmentSystemField.addAttachment(AttachmentSystemField.java:162) at com.atlassian.jira.issue.fields.AttachmentSystemField.createValue(AttachmentSystemField.java:141) at com.atlassian.jira.workflow.function.issue.IssueCreateFunction.execute(IssueCreateFunction.java:85) at com.opensymphony.workflow.AbstractWorkflow.executeFunction(AbstractWorkflow.java:869) at com.opensymphony.workflow.AbstractWorkflow.transitionWorkflow(AbstractWorkflow.java:1265) at com.opensymphony.workflow.AbstractWorkflow.initialize(AbstractWorkflow.java:618) at com.atlassian.jira.workflow.SimpleWorkflowManager.createIssue(SimpleWorkflowManager.java:217) at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:378) at com.atlassian.jira.issue.managers.DefaultIssueManager.createIssue(DefaultIssueManager.java:326) at sun.reflect.GeneratedMethodAccessor999.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.atlassian.util.profiling.object.ObjectProfiler.profiledInvoke(ObjectProfiler.java:71) at com.atlassian.jira.config.component.SwitchingInvocationHandler.invoke(SwitchingInvocationHandler.java:28) at $Proxy3.createIssue(Unknown Source) at com.atlassian.jira.web.action.issue.CreateIssueDetails.createIssue(CreateIssueDetails.java:141) at com.atlassian.jira.web.action.issue.CreateIssueDetails.doExecute(CreateIssueDetails.java:110) at webwork.action.ActionSupport.execute(ActionSupport.java:153) at com.atlassian.jira.action.JiraActionSupport.execute(JiraActionSupport.java:54) at webwork.dispatcher.GenericDispatcher.executeAction(GenericDispatcher.java:132) at com.atlassian.jira.web.dispatcher.JiraServletDispatcher.service(JiraServletDispatcher.java:178) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.atlassian.jira.web.filters.AccessLogFilter.doFilter(AccessLogFilter.java:73) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.opensymphony.module.sitemesh.filter.PageFilter.parsePage(PageFilter.java:119) at com.opensymphony.module.sitemesh.filter.PageFilter.doFilter(PageFilter.java:55) at com.atlassian.jira.web.filters.SitemeshExcludePathFilter.doFilter(SitemeshExcludePathFilter.java:38) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.atlassian.seraph.filter.SecurityFilter.doFilter(SecurityFilter.java:192) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.atlassian.seraph.filter.TrustedApplicationsFilter.doFilter(TrustedApplicationsFilter.java:120) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.atlassian.seraph.filter.BaseLoginFilter.doFilter(BaseLoginFilter.java:125) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) at com.atlassian.util.profiling.filters.ProfilingFilter.doFilter(ProfilingFilter.java:132)
- is duplicated by
-
JRASERVER-23758 Attachment Storage vs Linux Filesystems
- Closed
- is related to
-
JRASERVER-806 Ability to save attachments into the database
- Closed
- relates to
-
JRASERVER-16223 Bulk move attachments remain in previous project folder
-
- Closed
-
-
JRASERVER-23311 Attachment encoding protection still insufficient
-
- Closed
-
-
JRASERVER-21374 Single and Bulk issue moves do not move attachment thumbnails properly
-
- Gathering Impact
-
-
JRACLOUD-19873 attachment directory structure has exceeded maximum file handles
- Closed
-
JRASERVER-29380 Option to store attachments in the database
- Closed
fmotglongorder We added a new subdirectory to the attachments directory that allows more subdirectories to be created in the file system. In 7.x, attachments are stored in $JIRA_Home/data/jira/data/attachments/PROJECT_KEY/x0000/ISSUE_KEY/ID, where x0000 is a subdirectory that is created and named for each 10,000 issues. For example, attachments for issues 1-10,000 are stored in /PROJECT_KEY/10000/ISSUE_KEY/ID; issues 10001-20,000 are stored in 20000, etc.
someone views a migrated issue and clicks an attachment thumbnail. JIRA then copies the attachment to the 7.x directory structure.
This blog explains in more detail.