How to setup temp directory for org.jvnet.mimepull?

55 Views Asked by At

I am using org.jvnet.mimepull to allow my Java app to serve the download of files. It all works perfectly until I try to download large files >4GB. Then, I got the error of java.io.IOException: No space left on device. Checked the server and I could see that the /tmp filesystem(4GB size) is completely full with files MIME*.tmp . As far as I understand, org.jvnet.mimepull is using temp dir as a staging during download.

The question is: how to configure org.jvnet.mimepull to use a custom temp directory instead of /tmp?

The full error stack is:

Error handling a request: efd18e645be47f96
java.io.IOException: No space left on device
    at java.base/java.io.RandomAccessFile.writeBytes(Native Method)
    at java.base/java.io.RandomAccessFile.write(RandomAccessFile.java:559)
    at org.jvnet.mimepull.WeakDataFile.writeTo(WeakDataFile.java:122)
    at org.jvnet.mimepull.DataFile.writeTo(DataFile.java:95)
    at org.jvnet.mimepull.FileData.<init>(FileData.java:57)
    at org.jvnet.mimepull.FileData.createNext(FileData.java:91)
    at org.jvnet.mimepull.Chunk.createNext(Chunk.java:64)
    at org.jvnet.mimepull.DataHead.addBody(DataHead.java:87)
    at org.jvnet.mimepull.MIMEPart.addBody(MIMEPart.java:243)
    at org.jvnet.mimepull.MIMEMessage.makeProgress(MIMEMessage.java:270)
    at org.jvnet.mimepull.MIMEMessage.parseAll(MIMEMessage.java:189)
    at org.jvnet.mimepull.MIMEMessage.getAttachments(MIMEMessage.java:115)
    at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.getMimeParts(MultiPartReaderClientSide.java:272)
    at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readMultiPart(MultiPartReaderClientSide.java:231)
    at org.glassfish.jersey.media.multipart.internal.MultiPartReaderServerSide.readMultiPart(MultiPartReaderServerSide.java:91)
    at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:183)
    at org.glassfish.jersey.media.multipart.internal.MultiPartReaderClientSide.readFrom(MultiPartReaderClientSide.java:93)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
    at org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundReadFrom(MappableExceptionWrapperInterceptor.java:74)
    at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
    at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
    at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
    at org.glassfish.jersey.server.ContainerRequest.readEntity(ContainerRequest.java:234)
    at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$ValueFactory.getEntity(FormDataParamValueFactoryProvider.java:126)
    at org.glassfish.jersey.media.multipart.internal.FormDataParamValueFactoryProvider$FormDataParamValueFactory.provide(FormDataParamValueFactoryProvider.java:280)
    at org.glassfish.jersey.server.spi.internal.ParamValueFactoryWithSource.provide(ParamValueFactoryWithSource.java:71)
    at org.glassfish.jersey.server.spi.internal.ParameterValueHelper.getParameterValues(ParameterValueHelper.java:90)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$AbstractMethodParamInvoker.getParamValues(JavaResourceMethodDispatcherProvider.java:127)
    at org.glassfish.jersey.server.model.internal.JavaResourceMethodDispatcherProvider$ResponseOutInvoker.doDispatch(JavaResourceMethodDispatcherProvider.java:160)
    at org.glassfish.jersey.server.model.internal.AbstractJavaResourceMethodDispatcher.dispatch(AbstractJavaResourceMethodDispatcher.java:99)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:389)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:347)
    at org.glassfish.jersey.server.model.ResourceMethodInvoker.apply(ResourceMethodInvoker.java:102)
    at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:326)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
    at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
    at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:317)
1

There are 1 best solutions below

0
Michael On

Found it. The location of temp directory is controlled by java.io.tmpdir system property. So, just add to JVM parameters:

-Djava.io.tmpdir=/path/to/tmpdir