I have been running into a real problem with OutOfMemory errors on
Cocoon 2.1.9. The trouble seems to be that occasionally users request
settings for some reports that end up killing the server with an
OutOfMemory error. This also leaves us open to denial of service attacks.
My question is whether there is a way to throw an exception or otherwise
limit the processing of these large payloads from within the pipeline?
Given the volume of data available for legitimate reporting in my
application it is not possible to limit the request parameters in the
application in any sensible way, and the JVMs are already running with
Gigs of heap. Pagination is not an option for many of the reports. I
could limit the number of objects returned if I could find all the
reports that could potentially cause this problem, but it would be much
simpler to just stop Cocoon from processing data that is too large.
Here are some specifics, in case they are relevant. One heap analysis
showed 1.5 Gigabytes of memory being held by the object at the end of
this tree (package names suppressed to keep this readable):
- ScriptableObject
- FOM_Cocoon
- FOM_Cocoon$CallContext
- ConcreteTreeProcessor
- InvokeContext
- CachingProcessorPipeline
- ArrayList
- Object
- ComponentsSelector
- ComponentsSelector
- Collections$SynchronizedMap
- HashMap
- Array of HashMap$Entry
- HashMap$Entry (size including children =
1.5Gig)
That HashMap$Entry object had the following child tree, each one a bit
smaller than its parent. Only the largest child shown at each level:
- HashMap$Entry (a different one)
- TraxTransformer
- TransformerHandlerImpl
- SAXResult
- JxTemplateTransformer
- JxTemplateGenerator$TranformerAdapter$TemplateConsumer
After this there are two JxTemplateGenerators that split the size. The
bigger one goes to FormsTemplateTransformer, CIncludeTransformer, and on
and on into a long loop of JxTemplateGenerator$StartElement and
JxTemplateGenerator$EndElement.
It seems to me that it should be possible to put a limiter on the
transformers that says that if more than a certain volume of data is put
through, an exception is thrown. I know that part of the page may have
been rendered before the error page shows up, but I am fine with that.
I'd be happy to limit each part of the pipeline to outputting no more
than 10Meg.
Can anyone make any suggestions as to how to make this work in Cocoon?
Do I need to hack on JxTransformer? Configure Xalan to limit data size?
Make a configuration change to Cocoon? Any help is appreciated.
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]