[MGNLIMG-190] Suppressing RuntimeException in ImagingServlet Created: 31/Aug/16  Updated: 28/May/18  Resolved: 31/Aug/16

Status: Closed
Project: Imaging
Component/s: None
Affects Version/s: None
Fix Version/s: None

Type: Bug Priority: Neutral
Reporter: Richard Unger Assignee: Unassigned
Resolution: Not an issue Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified
Environment:

LFRZ


Issue Links:
Relates
relates to MGNLIMG-129 Images that don't exist cause a 500 i... Closed
relation
Template:
Acceptance criteria:
Empty
Task DoD:
[ ]* Doc/release notes changes? Comment present?
[ ]* Downstream builds green?
[ ]* Solution information and context easily available?
[ ]* Tests
[ ]* FixVersion filled and not yet released
[ ]  Architecture Decision Record (ADR)
Bug DoR:
[ ]* Steps to reproduce, expected, and actual results filled
[ ]* Affected version filled
Date of First Response:

 Description   

Currently ImagingServlet causes a RuntimeException in Tomcat via an IllegalArgumentException when the given ImageGenerator cannot be found.

While this is certainly an error that should be logged to magnolia-error, it should not cause an uncaught runtimeexception.

Due to the frequent occurrence of these errors, catalina.out is being spammed to the point of uselessness, and filling disk space far too quickly.

Aug 30, 2016 8:08:01 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [default] in context with path [] threw exception
java.lang.RuntimeException: Failed to process request with: No ImageGenerator with name stk
        at info.magnolia.module.cache.executor.Store.processCacheRequest(Store.java:119)
        at info.magnolia.module.cache.executor.CompositeExecutor.processCacheRequest(CompositeExecutor.java:67)
        at info.magnolia.module.cache.filter.CacheFilter.doFilter(CacheFilter.java:174)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.i18n.I18nContentSupportFilter.doFilter(I18nContentSupportFilter.java:74)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.RangeSupportFilter.doFilter(RangeSupportFilter.java:84)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.security.BaseSecurityFilter.doFilter(BaseSecurityFilter.java:57)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.multisite.filters.CrossSiteSecurityFilter.doFilter(CrossSiteSecurityFilter.java:104)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.security.SecurityCallbackFilter.doFilter(SecurityCallbackFilter.java:79)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.security.LogoutFilter.doFilter(LogoutFilter.java:94)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.module.site.filters.SiteMergeFilter.doFilter(SiteMergeFilter.java:119)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at at.lfrz.magnolia.atk.errorpages.ATKMultiSiteFilter.doFilter(ATKMultiSiteFilter.java:138)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MultiChannelFilter.doFilter(MultiChannelFilter.java:83)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at at.lfrz.magnolia.saml.login.SAMLAssertionRestoreFilter.doFilter(SAMLAssertionRestoreFilter.java:41)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at at.lfrz.magnolia.atk.filter.ImprovedLoggingFilter.doFilter(ImprovedLoggingFilter.java:77)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.security.auth.login.LoginFilter.doFilter(LoginFilter.java:127)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.enterprise.registration.RegistrationFilter.doFilter(RegistrationFilter.java:64)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.CosMultipartRequestFilter.doFilter(CosMultipartRequestFilter.java:87)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.module.devicedetection.filter.DeviceDetectionFilter.doFilter(DeviceDetectionFilter.java:71)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.personalization.preview.filter.PreviewFilter.doFilter(PreviewFilter.java:92)
        at info.magnolia.cms.filters.OncePerRequestAbstractMgnlFilter.doFilter(OncePerRequestAbstractMgnlFilter.java:59)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.ContentTypeFilter.doFilter(ContentTypeFilter.java:148)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:74)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at at.lfrz.magnolia.atk.filter.ImprovedLoggingFilter.doFilter(ImprovedLoggingFilter.java:77)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.ContextFilter.doFilter(ContextFilter.java:128)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.SafeDestroyMgnlFilterWrapper.doFilter(SafeDestroyMgnlFilterWrapper.java:107)
        at info.magnolia.cms.filters.MgnlFilterDispatcher.doDispatch(MgnlFilterDispatcher.java:67)
        at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:108)
        at info.magnolia.cms.filters.MgnlMainFilter.doFilter(MgnlMainFilter.java:94)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:203)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
        at at.lfrz.net.tomcat.valve.LFRZAccessLogValve.invoke(LFRZAccessLogValve.java:460)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436)
        at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:190)
        at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
        at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: No ImageGenerator with name stk
        at info.magnolia.imaging.ImagingServlet.doGet(ImagingServlet.java:89)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
        at info.magnolia.cms.filters.ServletDispatchingFilter.doFilter(ServletDispatchingFilter.java:148)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:81)
        at info.magnolia.cms.filters.CompositeFilter.doFilter(CompositeFilter.java:65)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.cms.filters.VirtualUriFilter.doFilter(VirtualUriFilter.java:69)
        at info.magnolia.cms.filters.AbstractMgnlFilter.doFilter(AbstractMgnlFilter.java:85)
        at info.magnolia.cms.filters.MgnlFilterChain.doFilter(MgnlFilterChain.java:79)
        at info.magnolia.module.cache.executor.Store.processCacheRequest(Store.java:100)


 Comments   
Comment by Jan Haderka [ 31/Aug/16 ]

Behavior is as expected.

ImagingServlet throws IllegalArgumentException because it is called with invalid argument - with link/url requesting use of ImageGenerator named stk. Since such is not configured in your system, error is thrown.

All that cache's Store executor does rethrowing as RuntimeException after cleanup of all resources allocated for creating cache entry for this request.

Hiding error might save some disk space, but will do nothing for useless allocation of resources on every request to such link. Preventing error will get rid of the message in logs have much bigger impact on performance of your server.

To avoid this message, either configure image generator called stk in your configuration or remove use of the variation(s) requesting this generator from your templates.

Comment by Richard Unger [ 15/Sep/16 ]

This isn't very satisfactory. Even if you can justify it, it doesn't help us solve our problem.

And I think one can quite easily take a different view on it:

ImagingServlet, as a Servlet, should catch expected errors, and return a 5xx or 4xx response. Creating uncaught RuntimeExceptions for error situations that are predictable isn't exactly good practice.

Also, to solve our problem you don't need to hide the error, that's not what I'm asking for. Firstly you could downgrade it to a warning, which should be sufficient for this situation, and secondly you could catch and log it within magnolia's codebase (don't care where). Then you'd still get the log messages, but not in catalina.out.

Having the messages in catalina.out is an operational problem, and really they have nothing to do there. This is a topic for magnolia_error.log or similar.

Comment by Jan Haderka [ 16/Sep/16 ]

help us solve our problem.

To avoid this message, either configure image generator called stk in your configuration or remove use of the variation(s) requesting this generator from your templates.

should catch expected errors, and return a 5xx or 4xx response

the 500 response is the one you get. What different 5xx or 4xx response would you expect?

Don't get me wrong, I understand your pain. There were times when any error messages from imaging were hidden, but that led over time to people starting to think that all is good with their templates and complain about performance because of all effort going into trying to resolve non existent images again and again. Since image that doesn't exist will not be shown in page, and since most modern css designs make it so that such missing image is completely abstracted from the page, thus editors will not notice, showing error in the logs is the only way Magnolia has to notify someone.

Plus in cases like this, there's even nothing editor can do even if he/she saw missing image. It is configuration or templating error and has to be fixed by devops or developers, hence they are shown the error in the logs.

Comment by Richard Unger [ 27/Sep/16 ]

I feel quite misunderstood here.

No one is saying you should get rid of the error message alerting developers. All I am saying (and this is definately best practice) that you should not have the error message in catalina.out due to an uncaught RuntimeException.

It should be handled and logged in ImagingServlet (or somewhere internal to magnolia), and output in magnolia-debug and magnolia-error, where it can be properly handled with log rotation, etc... Because it isn't a tomcat runtime issue in the end, is it?

Anyway, we're now implementing the solution via the Null-Image-Generator as suggested by your support.

Regards from Vienna,

Richard

Generated at Mon Feb 12 02:13:10 CET 2024 using Jira 9.4.2#940002-sha1:46d1a51de284217efdcb32434eab47a99af2938b.