You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ec...@apache.org on 2013/01/18 20:35:39 UTC
svn commit: r1435318 -
/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java
Author: eclark
Date: Fri Jan 18 19:35:39 2013
New Revision: 1435318
URL: http://svn.apache.org/viewvc?rev=1435318&view=rev
Log:
HBASE-5458 Thread safety issues with Compression.Algorithm.GZ and CompressionTest
Modified:
hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java
Modified: hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java?rev=1435318&r1=1435317&r2=1435318&view=diff
==============================================================================
--- hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java (original)
+++ hbase/branches/0.92/src/main/java/org/apache/hadoop/hbase/io/hfile/Compression.java Fri Jan 18 19:35:39 2013
@@ -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;
+ // 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) {
- try {
- Class<?> externalCodec =
- getClassLoaderForCodec().loadClass("org.apache.hadoop.io.compress.SnappyCodec");
- snappyCodec = (CompressionCodec) ReflectionUtils.newInstance(externalCodec,
- conf);
- } catch (ClassNotFoundException e) {
- throw new RuntimeException(e);
+ @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;