Skip to main content

When a Set Course Quota is Exceeded Setting Banner Results in a False Positive Message

When a set Course quota is exceeded, trying to set a Banner results in a false positive message.

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

  1. Log into System as an Administrator

  2. Create a new Course > upload a few files to the Course home folder (once created)

  3. Search for the CourseID via System Admin > select the dropdown chevron > choose Quotas

  4. 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

  5. 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

  6. 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

Did this answer your question?