[ https://issues.apache.org/jira/browse/CXF-4356?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13415992#comment-13415992 ]
Gonçalo Rodrigues commented on CXF-4356: ---------------------------------------- I just tried your patch and it seems to fix the problem. > Temp file deleted before returning the stream in CachedOutputStream > ------------------------------------------------------------------- > > Key: CXF-4356 > URL: https://issues.apache.org/jira/browse/CXF-4356 > Project: CXF > Issue Type: Bug > Affects Versions: 2.5, 2.6 > Reporter: Gonçalo Rodrigues > Assignee: Daniel Kulp > Attachments: cxf-4356-reproducer.zip > > > I’m implementing a web service to upload files (from 120 Kb to 1 Mb). Most of > the time everything works fine, but sometimes (randomly) the uploaded file is > empty (size == 0) in the target platform. > After some debugging I found that the problem comes from the temp file > created by the {{CachedOutputStream}} that is deleted during the process of > getting the cached stream. In fact, {{maybeDeleteTempFile}} is called before > {{getInputStream}} which returns an empty {{LoadingByteArrayOutputStream}}. > The {{finalize}} method of {{FileInputStream}} calls its {{close}} method > which is overridden in {{CachedOutputStream#getInputStream}} to delete the > temp file. > I tried to synchronize all the methods dealing with {{tempFile}} but it > didn’t resolve my problem. > The stack: > {code} > Daemon System Thread [Finalizer] (Suspended (breakpoint at line 490 in > CachedOutputStream)) > CachedOutputStream.maybeDeleteTempFile(Object) line: 490 > CachedOutputStream.access$000(CachedOutputStream, Object) line: 43 > CachedOutputStream$1.close() line: 469 > CachedOutputStream$1(FileInputStream).finalize() line: 381 > Finalizer.invokeFinalizeMethod(Object) line: not available [native > method] > Finalizer.runFinalizer() line: 83 > Finalizer.access$100(Finalizer) line: 14 > Finalizer$FinalizerThread.run() line: 160 > {code} > The {{getInputStream}} method: > {code:java} > public InputStream getInputStream() throws IOException { > flush(); > if (inmem) { > if (currentStream instanceof LoadingByteArrayOutputStream) { > return ((LoadingByteArrayOutputStream) > currentStream).createInputStream(); > } else if (currentStream instanceof ByteArrayOutputStream) { > return new > ByteArrayInputStream(((ByteArrayOutputStream) currentStream).toByteArray()); > } else if (currentStream instanceof PipedOutputStream) { > return new PipedInputStream((PipedOutputStream) > currentStream); > } else { > return null; > } > } else { > try { > FileInputStream fileInputStream = new > FileInputStream(tempFile) { > public void close() throws IOException { > super.close(); > maybeDeleteTempFile(this); > } > }; > streamList.add(fileInputStream); > return fileInputStream; > } catch (FileNotFoundException e) { > throw new IOException("Cached file was deleted, " + > e.toString()); > } > } > } > {code} > The {{maybeDeleteTempFile}} method: > {code:java} > private void maybeDeleteTempFile(Object stream) { > streamList.remove(stream); > if (!inmem && tempFile != null && streamList.isEmpty() && > allowDeleteOfFile) { > if (currentStream != null) { > try { > currentStream.close(); > postClose(); > } catch (Exception e) { > //ignore > } > } > tempFile.delete(); > tempFile = null; > currentStream = new LoadingByteArrayOutputStream(1024); > inmem = true; > } > } > {code} -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira