From 25e984cb5788d15218831ef551ec2e46c3812ed1 Mon Sep 17 00:00:00 2001 From: Elliott Clark Date: Wed, 16 Jan 2013 15:41:27 -0800 Subject: [PATCH] synchronize creattion of compression algo. This should fix races we are seeing when creating a compression algorithm. --- .../apache/hadoop/hbase/io/hfile/Compression.java | 66 ++++++++++++++------ 1 file changed, 47 insertions(+), 19 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 f76110e..55186de 100644 --- src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java +++ src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java @@ -78,35 +78,54 @@ 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 = - ClassLoader.getSystemClassLoader().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") { @@ -143,22 +162,31 @@ public final class Compression { }, SNAPPY("snappy") { // Use base type to avoid compile-time dependencies. - private transient CompressionCodec snappyCodec; + private volatile transient CompressionCodec snappyCodec; + private transient Object lock = new Object(); @Override CompressionCodec getCodec(Configuration conf) { if (snappyCodec == null) { - try { - Class externalCodec = - ClassLoader.getSystemClassLoader().loadClass("org.apache.hadoop.io.compress.SnappyCodec"); - snappyCodec = (CompressionCodec) ReflectionUtils.newInstance(externalCodec, - conf); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); + synchronized (lock) { + if (snappyCodec == null) { + snappyCodec = buildCodec(conf); + } } } 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)