Author: nextgens
Date: 2008-10-23 09:43:15 +0000 (Thu, 23 Oct 2008)
New Revision: 23044

Modified:
   trunk/freenet/src/freenet/client/async/SingleFileInserter.java
Log:
Interrupt compression if the output is already bigger than with a previous 
algorithm

Modified: trunk/freenet/src/freenet/client/async/SingleFileInserter.java
===================================================================
--- trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-10-23 09:42:45 UTC (rev 23043)
+++ trunk/freenet/src/freenet/client/async/SingleFileInserter.java      
2008-10-23 09:43:15 UTC (rev 23044)
@@ -162,6 +162,7 @@

                COMPRESSOR_TYPE bestCodec = null;
                Bucket bestCompressedData = null;
+               long bestCompressedDataSize = origSize;

                boolean tryCompress = (origSize > blockSize) && 
(!ctx.dontCompress) && (!dontCompress);
                if(tryCompress) {
@@ -177,20 +178,23 @@
                                        if(parent == cb)
                                                
ctx.eventProducer.produceEvent(new StartedCompressionEvent(comp));
                                        Bucket result;
-                                       result = comp.compress(origData, new 
BucketChainBucketFactory(ctx.persistentBucketFactory, CHKBlock.DATA_LENGTH), 
origData.size());
-                                       if(result.size() < 
oneBlockCompressedSize) {
+                                       result = comp.compress(origData, new 
BucketChainBucketFactory(ctx.persistentBucketFactory, CHKBlock.DATA_LENGTH), 
bestCompressedDataSize);
+                                       long resultSize = result.size();
+                                       if(resultSize < oneBlockCompressedSize) 
{
                                                bestCodec = comp;
                                                if(bestCompressedData != null)
                                                        
bestCompressedData.free();
                                                bestCompressedData = result;
                                                continue;
                                        }
-                                       if((bestCompressedData != null) && 
(result.size() < bestCompressedData.size())) {
+                                       if((bestCompressedData != null) && 
(resultSize < bestCompressedDataSize)) {
                                                bestCompressedData.free();
                                                bestCompressedData = result;
+                                               bestCompressedDataSize = 
resultSize;
                                                bestCodec = comp;
-                                       } else if((bestCompressedData == null) 
&& (result.size() < data.size())) {
+                                       } else if((bestCompressedData == null) 
&& (resultSize < origSize)) {
                                                bestCompressedData = result;
+                                               bestCompressedDataSize = 
resultSize;
                                                bestCodec = comp;
                                        } else
                                                result.free();
@@ -205,8 +209,7 @@
                }
                boolean shouldFreeData = false;
                if(bestCompressedData != null) {
-                       long compressedSize = bestCompressedData.size();
-                       if(logMINOR) Logger.minor(this, "The best compression 
algorithm is "+bestCodec+ " we have gained "+ 
(100-(compressedSize*100/origSize)) +"% ! ("+origSize+'/'+compressedSize+')');
+                       if(logMINOR) Logger.minor(this, "The best compression 
algorithm is "+bestCodec+ " we have gained "+ 
(100-(bestCompressedDataSize*100/origSize)) +"% ! 
("+origSize+'/'+bestCompressedDataSize+')');
                        data = bestCompressedData;
                        shouldFreeData = true;
                        compressorUsed = bestCodec;


Reply via email to