From bb29a035d348709d679aee89a1c72f9aae10893b Mon Sep 17 00:00:00 2001 From: Elliott Clark Date: Thu, 17 Jan 2013 14:54:39 -0800 Subject: [PATCH] synchronize creation of compression algo. --- .../apache/hadoop/hbase/io/hfile/Compression.java | 80 ++++++++++++++------ 1 file changed, 55 insertions(+), 25 deletions(-) diff --git src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java index c0de5fc..bd76f64 100644 --- src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java +++ src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java @@ -96,35 +96,55 @@ public final class Compression { public static enum Algorithm { LZO("lzo") { // Use base type to avoid compile-time dependencies. - private transient CompressionCodec lzoCodec; + private volatile transient CompressionCodec lzoCodec; + private transient Object lock = new Object(); @Override CompressionCodec getCodec(Configuration conf) { if (lzoCodec == null) { - try { - Class externalCodec = - getClassLoaderForCodec().loadClass("com.hadoop.compression.lzo.LzoCodec"); - lzoCodec = (CompressionCodec) ReflectionUtils.newInstance(externalCodec, - new Configuration(conf)); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + synchronized (lock) { + if (lzoCodec == null) { + lzoCodec = buildCodec(conf); + } } } return lzoCodec; } + + private CompressionCodec buildCodec(Configuration conf) { + try { + Class externalCodec = + ClassLoader.getSystemClassLoader() + .loadClass("com.hadoop.compression.lzo.LzoCodec"); + return (CompressionCodec) ReflectionUtils.newInstance(externalCodec, + new Configuration(conf)); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } }, GZ("gz") { - private transient GzipCodec codec; + private volatile transient GzipCodec codec; + private transient Object lock = new Object(); @Override DefaultCodec getCodec(Configuration conf) { if (codec == null) { - codec = new GzipCodec(); - codec.setConf(new Configuration(conf)); + synchronized (lock) { + if (codec == null) { + codec = buildCodec(conf); + } + } } return codec; } + + private GzipCodec buildCodec(Configuration conf) { + GzipCodec gzcodec = new GzipCodec(); + gzcodec.setConf(new Configuration(conf)); + return gzcodec; + } }, NONE("none") { @@ -160,23 +180,33 @@ public final class Compression { } }, SNAPPY("snappy") { - // Use base type to avoid compile-time dependencies. - private transient CompressionCodec snappyCodec; - - @Override - CompressionCodec getCodec(Configuration conf) { - if (snappyCodec == null) { - try { - Class externalCodec = - getClassLoaderForCodec().loadClass("org.apache.hadoop.io.compress.SnappyCodec"); - snappyCodec = (CompressionCodec) ReflectionUtils.newInstance(externalCodec, - conf); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + // Use base type to avoid compile-time dependencies. + private volatile transient CompressionCodec snappyCodec; + private transient Object lock = new Object(); + + @Override + CompressionCodec getCodec(Configuration conf) { + if (snappyCodec == null) { + synchronized (lock) { + if (snappyCodec == null) { + snappyCodec = buildCodec(conf); } } - return snappyCodec; } + return snappyCodec; + } + + private CompressionCodec buildCodec(Configuration conf) { + try { + Class externalCodec = + ClassLoader.getSystemClassLoader() + .loadClass("org.apache.hadoop.io.compress.SnappyCodec"); + return (CompressionCodec) ReflectionUtils.newInstance(externalCodec, + conf); + } catch (ClassNotFoundException e) { + throw new RuntimeException(e); + } + } }; private final Configuration conf; -- 1.7.10.2 (Apple Git-33)