[
https://issues.apache.org/jira/browse/COMPRESS-160?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Stefan Bodewig resolved COMPRESS-160.
-------------------------------------
Resolution: Fixed
Fix Version/s: 1.3
fixed with svn revision 1187874
> TarArchiveOutputStream.getBytesWritten() returns invalid value
> --------------------------------------------------------------
>
> Key: COMPRESS-160
> URL: https://issues.apache.org/jira/browse/COMPRESS-160
> Project: Commons Compress
> Issue Type: Bug
> Components: Archivers
> Affects Versions: 1.2
> Environment: java.runtime.name=Java(TM) SE Runtime Environment
> java.runtime.version=1.6.0_27-b07
> os.arch=x86
> os.name=Windows 7
> os.version=6.1
> This issue may be unrelated to environment
> Reporter: Robert Simac
> Fix For: 1.3
>
>
> It appears the TarArchiveOutputStream.getBytesWritten()returns zero or
> invalid value when queried.
> In the code sample below, it returns zero, even after an sizeable file was
> processed.
> I've printed it twice, once before closing the output stream, and once after,
> just for the reference.
> It is also demonstrable on multiple processed files.
> Within the TarArchiveOutputStream.getBytesWritten() implementation, it
> appears the call for count(numToWrite) is made after the numToWrite is
> depleted in the process of actual byte writing. When call for
> count(numToWrite); is moved up, the returned values for
> TarArchiveOutputStream.getBytesWritten() are getting equal to the sum of the
> sizes of processed files. This is much closer to expected value ("Returns the
> current number of bytes written to this stream.") but still not correct, for
> that number should include the tar header sizes as well.
> At any rate, please find the proposed patch below, merely moving
> count(numToWrite); up a few lines. This makes
> TarArchiveOutputStream.getBytesWritten() closer to true value.
> Test code:
> {code}
> @Test
> public void tartest() throws Exception {
>
> FileOutputStream myOutputStream = new
> FileOutputStream("C:/temp/tartest.tar");
>
> ArchiveOutputStream sTarOut = new
> ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.TAR,
> myOutputStream);
>
> File sSource = new File("C:/share/od_l.txt");
> TarArchiveEntry sEntry = new TarArchiveEntry(sSource);
> sTarOut.putArchiveEntry(sEntry);
>
> FileInputStream sInput = new FileInputStream(sSource);
> byte[] cpRead = new byte[8192];
>
> int iRead = 0;
> while ((iRead = sInput.read(cpRead)) > 0) {
> sTarOut.write(cpRead, 0, iRead);
> }
>
> sLog.info("Processed: "+sTarOut.getBytesWritten()+" bytes. File
> Len: "+sSource.length());
>
> sInput.close();
> sTarOut.closeArchiveEntry();
> sTarOut.close();
> sLog.info("Processed: "+sTarOut.getBytesWritten()+" bytes. File
> Len: "+sSource.length());
>
> return;
>
> }
> {code}
> Test Output:
> {code}
> Oct 21, 2011 9:09:28 AM com.cronsult.jndmpd.test.Backup tartest
> INFO: Processed: 0 bytes. File Len: 186974208
> Oct 21, 2011 9:09:28 AM com.cronsult.jndmpd.test.Backup tartest
> INFO: Processed: 0 bytes. File Len: 186974208
> {code}
> Proposed Patch:
> {code}
> Index:
> src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
> ===================================================================
> ---
> src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
> (revision 1187150)
> +++
> src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStream.java
> (working copy)
> @@ -276,6 +276,8 @@
> // eliminate some of the buffer copying.
> //
> }
> +
> + count(numToWrite);
>
> if (assemLen > 0) {
> if ((assemLen + numToWrite) >= recordBuf.length) {
> @@ -325,7 +327,7 @@
> wOffset += num;
> }
>
> - count(numToWrite);
> +
> }
>
> /**
> {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