瀏覽代碼

commit eb3e692be4a5e07dcb97d6a069a4a5eec1054604
Author: Chris Douglas <cdouglas@apache.org>
Date: Wed Jul 14 20:08:00 2010 -0700

HADOOP:6669 from https://issues.apache.org/jira/secure/attachment/12449530/6669-0y20.patch

+++ b/YAHOO-CHANGES.txt
+ HADOOP-6669. Respect compression configuration when creating DefaultCodec
+ compressors. (Koji Noguchi via cdouglas)
+


git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/branch-0.20-security-patches@1077545 13f79535-47bb-0310-9956-ffa450edef68

Owen O'Malley 14 年之前
父節點
當前提交
0032ec1886

+ 16 - 0
src/core/org/apache/hadoop/io/compress/zlib/BuiltInZlibDeflater.java

@@ -36,6 +36,22 @@ public class BuiltInZlibDeflater extends Deflater implements Compressor {
     super(level, nowrap);
     super(level, nowrap);
   }
   }
 
 
+  BuiltInZlibDeflater(Configuration conf) {
+    this(null == conf
+        ? DEFAULT_COMPRESSION
+        : ZlibFactory.getCompressionLevel(conf).compressionLevel());
+    if (conf != null) {
+      final ZlibCompressor.CompressionStrategy strategy =
+        ZlibFactory.getCompressionStrategy(conf);
+      try {
+        setStrategy(strategy.compressionStrategy());
+      } catch (IllegalArgumentException ill) {
+        Log.warn(strategy + " not supported by BuiltInZlibDeflater.");
+        setStrategy(DEFAULT_STRATEGY);
+      }
+    }
+  }
+
   public BuiltInZlibDeflater(int level) {
   public BuiltInZlibDeflater(int level) {
     super(level);
     super(level);
   }
   }

+ 2 - 1
src/core/org/apache/hadoop/io/compress/zlib/ZlibFactory.java

@@ -83,7 +83,8 @@ public class ZlibFactory {
    */
    */
   public static Compressor getZlibCompressor(Configuration conf) {
   public static Compressor getZlibCompressor(Configuration conf) {
     return (isNativeZlibLoaded(conf)) ? 
     return (isNativeZlibLoaded(conf)) ? 
-      new ZlibCompressor() : new BuiltInZlibDeflater(); 
+      new ZlibCompressor(conf) :
+      new BuiltInZlibDeflater(conf);
   }
   }
 
 
   /**
   /**

+ 56 - 0
src/test/org/apache/hadoop/io/compress/TestCodec.java

@@ -144,6 +144,8 @@ public class TestCodec extends TestCase {
       RandomDatum v2 = new RandomDatum();
       RandomDatum v2 = new RandomDatum();
       k2.readFields(inflateIn);
       k2.readFields(inflateIn);
       v2.readFields(inflateIn);
       v2.readFields(inflateIn);
+      assertTrue("original and compressed-then-decompressed-output not equal",
+                 k1.equals(k2) && v1.equals(v2));
     }
     }
     LOG.info("SUCCESS! Completed checking " + count + " records");
     LOG.info("SUCCESS! Completed checking " + count + " records");
   }
   }
@@ -197,6 +199,60 @@ public class TestCodec extends TestCase {
                outbytes.length >= b.length);
                outbytes.length >= b.length);
   }
   }
 
 
+  private static void codecTestWithNOCompression (Configuration conf,
+                      String codecClass) throws IOException {
+    // Create a compressor with NO_COMPRESSION and make sure that
+    // output is not compressed by comparing the size with the
+    // original input
+
+    CompressionCodec codec = null;
+    ZlibFactory.setCompressionLevel(conf, CompressionLevel.NO_COMPRESSION);
+    try {
+      codec = (CompressionCodec)
+        ReflectionUtils.newInstance(conf.getClassByName(codecClass), conf);
+    } catch (ClassNotFoundException cnfe) {
+      throw new IOException("Illegal codec!");
+    }
+    Compressor c = codec.createCompressor();
+    // ensure same compressor placed earlier
+    ByteArrayOutputStream bos = new ByteArrayOutputStream();
+    CompressionOutputStream cos = null;
+    // write trivially compressable data
+    byte[] b = new byte[1 << 15];
+    Arrays.fill(b, (byte) 43);
+    try {
+      cos = codec.createOutputStream(bos, c);
+      cos.write(b);
+    } finally {
+      if (cos != null) {
+        cos.close();
+      }
+    }
+    byte[] outbytes = bos.toByteArray();
+    // verify data were not compressed
+    assertTrue("Compressed bytes contrary to configuration(NO_COMPRESSION)",
+               outbytes.length >= b.length);
+  }
+
+  public void testCodecInitWithCompressionLevel() throws Exception {
+    Configuration conf = new Configuration();
+    conf.setBoolean("io.native.lib.available", true);
+    if (ZlibFactory.isNativeZlibLoaded(conf)) {
+      LOG.info("testCodecInitWithCompressionLevel with native");
+      codecTestWithNOCompression(conf,
+                            "org.apache.hadoop.io.compress.GzipCodec");
+      codecTestWithNOCompression(conf,
+                         "org.apache.hadoop.io.compress.DefaultCodec");
+    } else {
+      LOG.warn("testCodecInitWithCompressionLevel for native skipped"
+               + ": native libs not loaded");
+    }
+    conf = new Configuration();
+    conf.setBoolean("io.native.lib.available", false);
+    codecTestWithNOCompression( conf,
+                         "org.apache.hadoop.io.compress.DefaultCodec");
+  }
+
   public void testCodecPoolCompressorReinit() throws Exception {
   public void testCodecPoolCompressorReinit() throws Exception {
     Configuration conf = new Configuration();
     Configuration conf = new Configuration();
     conf.setBoolean("hadoop.native.lib", true);
     conf.setBoolean("hadoop.native.lib", true);