Description
When trying to set a Banner in a Course which exceeds the set Course quota a success message is displayed but the Banner is not set. Banner controls remain as if there is a set Banner there but there is not and the file may also be getting stuck on disk in xythos in STORAGE_STATE = 10. It only throws an error on the backend to indicate a problem which does not help the end User at all.
Steps to Replicate
Log into System as an Administrator
Create a new Course > upload a few files to the Course home folder (once created)
Search for the CourseID via System Admin > select the dropdown chevron > choose Quotas
Observe that it will show the Current Course usage for that Course and in the Limit this course to field set the quota to be only a little higher than the existing used quota and choose Submit. For example if your course is showing 2.83MG used set the quota to 3MG limit
Enter the Course again now that the limit is set and go to Control Panel > Customization > Teaching Style and scroll down to the Select Banner area
Attempt to use the Browse My Computer button and choose an image file from your machine which will cause it to exceed the set quota
Expected Behavior:
The Banner is not set and a meaningful message is returned to the User that the quota is exceeded which is why it cannot be set.
Observed Bahavior:
The end User gets a false 'Success' message and the controls get stuck as if the Banner was actually set even though it is not.
Cause
Error thrown at the backend:
2015-08-17 14:20:18 -0400 - Error saving the course banner file - blackboard.platform.filesystem.DiskQuotaException: Action not complete: Adding the selected content to the specified folder causes the folder to exceed its quota.
at blackboard.cms.platform.contentsystem.manager.impl.DocumentManagerImpl.writeToContentSystem(DocumentManagerImpl.java:1050)
at blackboard.cms.platform.contentsystem.manager.impl.DocumentManagerImpl.writeToContentSystemWithAutomaticRename(DocumentManagerImpl.java:1610)
at blackboard.cms.platform.contentsystem.manager.impl.DocumentManagerImpl.writeToContentSystem(DocumentManagerImpl.java:1585)
at blackboard.data.course.CourseUtil.setBannerOnCourse(CourseUtil.java:83)
at blackboard.webapps.blackboard.cp.struts.CourseDesignAction.handleCourseBannerImgUrlFormData(CourseDesignAction.java:263)
at blackboard.webapps.blackboard.cp.struts.CourseDesignAction.save(CourseDesignAction.java:368)
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:606)
at org.apache.struts.actions.DispatchAction.dispatchMethod(DispatchAction.java:266)
at blackboard.struts.SecureDispatchAction.dispatchMethod(SecureDispatchAction.java:49)
at org.apache.struts.actions.DispatchAction.execute(DispatchAction.java:167)
at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:413)
at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:225)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1858)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:459)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:646)
at blackboard.struts.BbActionServlet.service(BbActionServlet.java:103)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
at sun.reflect.GeneratedMethodAccessor576.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:277)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:169)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:297)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:191)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:187)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:186)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at sun.reflect.GeneratedMethodAccessor583.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:277)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:249)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:191)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:187)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:186)
at blackboard.platform.servlet.RequestSessionFilter.doFilter(RequestSessionFilter.java:155)
at sun.reflect.GeneratedMethodAccessor863.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:277)
at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:274)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:536)
at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:309)
at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:249)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
at org.apache.catalina.core.ApplicationFilterChain.access$000(ApplicationFilterChain.java:55)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:191)
at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:187)
at java.security.AccessController.doPrivileged(Native Method)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:186)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at blackboard.webapps.blackboard.plugin.web.PluginsRequestRedirectValve.invoke(PluginsRequestRedirectValve.java:62)
at blackboard.webapps.blackboard.blog.web.BlogRequestRedirectValve.invoke(BlogRequestRedirectValve.java:63)
at blackboard.plugin.assignment.util.RequestRedirectValve.invoke(RequestRedirectValve.java:65)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.valves.StuckThreadDetectionValve.invoke(StuckThreadDetectionValve.java:221)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:683)
at blackboard.tomcat.valves.LoggingRemoteIpValve.invoke(LoggingRemoteIpValve.java:44)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1736)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1695)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Caused by: com.xythos.storageServer.api.QuotaExceededException
at com.xythos.fileSystem.File.internalCreateBlob(File.java:1781)
at com.xythos.fileSystem.File.create(File.java:666)
at com.xythos.storageServer.api.FileSystem.createFileWithNorm(FileSystem.java:529)
at com.xythos.storageServer.api.FileSystem.createFile(FileSystem.java:499)
at blackboard.cms.filesystem.CSContext$1.run(CSContext.java:302)
at blackboard.cms.filesystem.CSContext$1.run(CSContext.java:298)
at java.security.AccessController.doPrivileged(Native Method)
at blackboard.cms.filesystem.CSContext.createFile(CSContext.java:297)
at blackboard.cms.util.export.CSFileExporter.export(CSFileExporter.java:147)
at blackboard.cms.platform.contentsystem.manager.impl.DocumentManagerImpl.writeToContentSystem(DocumentManagerImpl.java:1025)
... 215 more
Resolution / Workaround
Increase or remove the set quota.
Affected Versions
Learn 9.1 Q4 2015 (9.1.201510.1171621)
Learn October 2014 (9.1.201410.160373)
Learn April 2014 (9.1.201404.160205)
Target Release
Will Not Fix
