Skip to content

OutOfMemoryError while serving attachment from filesystem attachment provider #7531

@avernet

Description

@avernet

The following exception happens on 2024.1.2.

java.lang.OutOfMemoryError: Java heap space
    at java.base/java.util.Arrays.copyOf(Arrays.java:3537)
    at java.base/java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.java:100)
    at java.base/java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:132)
    at org.orbeon.io.IOUtils$.$anonfun$copyStreamAndClose$6(IOUtils.scala:37)
    at org.orbeon.io.IOUtils$$Lambda/0x000000000f81a7e0.apply$mcVI$sp(Unknown Source)
    at scala.runtime.java8.JFunction1$mcVI$sp.apply(JFunction1$mcVI$sp.scala:18)
    at scala.collection.IterableOnceOps.foreach(IterableOnce.scala:619)
    at scala.collection.IterableOnceOps.foreach$(IterableOnce.scala:617)
    at scala.collection.AbstractIterator.foreach(Iterator.scala:1306)
    at org.orbeon.io.IOUtils$.$anonfun$copyStreamAndClose$2(IOUtils.scala:35)
    at org.orbeon.io.IOUtils$.$anonfun$copyStreamAndClose$2$adapted(IOUtils.scala:33)
    at org.orbeon.io.IOUtils$$Lambda/0x000000000f81ebf8.apply(Unknown Source)
    at org.orbeon.io.IOUtils$.useAndClose(IOUtils.scala:63)
    at org.orbeon.io.IOUtils$.$anonfun$copyStreamAndClose$1(IOUtils.scala:33)
    at org.orbeon.io.IOUtils$.$anonfun$copyStreamAndClose$1$adapted(IOUtils.scala:32)
    at org.orbeon.io.IOUtils$$Lambda/0x000000000f81e820.apply(Unknown Source)
    at org.orbeon.io.IOUtils$.useAndClose(IOUtils.scala:63)
    at org.orbeon.io.IOUtils$.copyStreamAndClose(IOUtils.scala:32)
    at org.orbeon.oxf.fr.persistence.attachments.FilesystemCRUD.$anonfun$get$1(FilesystemCRUD.scala:56)
    at org.orbeon.oxf.fr.persistence.attachments.FilesystemCRUD.$anonfun$get$1$adapted(FilesystemCRUD.scala:53)
    at org.orbeon.oxf.fr.persistence.attachments.FilesystemCRUD$Lambda/0x000000000fb227c0.apply(Unknown Source)
    at org.orbeon.oxf.fr.persistence.attachments.FilesystemCRUD.withFile(FilesystemCRUD.scala:103)
    at org.orbeon.oxf.fr.persistence.attachments.FilesystemCRUD.get(FilesystemCRUD.scala:53)
    at org.orbeon.oxf.fr.persistence.attachments.FilesystemCRUD.get$(FilesystemCRUD.scala:48)
    at org.orbeon.oxf.fr.persistence.attachments.Provider$Filesystem$.get(Provider.scala:24)
    at org.orbeon.oxf.fr.persistence.attachments.CRUDRoute$.process(CRUDRoute.scala:55)
    at org.orbeon.oxf.controller.PageFlowControllerProcessor$PageOrServiceRoute.process(PageFlowControllerProcessor.scala:656)
    at org.orbeon.oxf.controller.PageFlowControllerProcessor.start(PageFlowControllerProcessor.scala:245)
    at org.orbeon.oxf.pipeline.InitUtils$.runProcessor(InitUtils.scala:84)
    at org.orbeon.oxf.webapp.ProcessorService.$anonfun$service$1(ProcessorService.scala:47)
    at org.orbeon.oxf.webapp.ProcessorService$Lambda/0x000000000f4a7ac8.apply$mcV$sp(Unknown Source)
    at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.scala:18)
  • IOUtils.scala.copyStreamAndClose is using a 8K buffer, which is fine. We see from the exception that the problem happens because we write in a ByteArrayOutputStream.
  • This ByteArrayOutputStream is returned by LocalResponse.getOutputStream. It is a LocalByteArrayOutputStream extends ByteArrayOutputStream.
  • We have a LocalResponse because the request comes from an InternalHttpClient, which creates a LocalResponse and passes it to LocalExternalContext.

+1 from customer

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status

To do

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions