You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2010/09/03 03:28:50 UTC
svn commit: r992168 - in /avro/branches/branch-1.4: ./ CHANGES.txt
lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
Author: cutting
Date: Fri Sep 3 01:28:50 2010
New Revision: 992168
URL: http://svn.apache.org/viewvc?rev=992168&view=rev
Log:
Merge r992167 from trunk to 1.4 branch. Fixes: AVRO-650.
Modified:
avro/branches/branch-1.4/ (props changed)
avro/branches/branch-1.4/CHANGES.txt
avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
Propchange: avro/branches/branch-1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Fri Sep 3 01:28:50 2010
@@ -1 +1 @@
-/avro/trunk:990852,990860,990867,990871,990878,991031,991423,992146,992149
+/avro/trunk:990852,990860,990867,990871,990878,991031,991423,992146,992149,992167
Modified: avro/branches/branch-1.4/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/CHANGES.txt?rev=992168&r1=992167&r2=992168&view=diff
==============================================================================
--- avro/branches/branch-1.4/CHANGES.txt (original)
+++ avro/branches/branch-1.4/CHANGES.txt Fri Sep 3 01:28:50 2010
@@ -220,6 +220,8 @@ Avro 1.4.0 (31 August 2010)
AVRO-653. Python: Fix so distribution contains correct files.
(Eric Evans via cutting)
+ AVRO-650. Java: Fix GenericDatumReader to be thread-safe. (cutting)
+
Avro 1.3.3 (7 June 2010)
IMPROVEMENTS
Modified: avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java
URL: http://svn.apache.org/viewvc/avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java?rev=992168&r1=992167&r2=992168&view=diff
==============================================================================
--- avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java (original)
+++ avro/branches/branch-1.4/lang/java/src/java/org/apache/avro/generic/GenericDatumReader.java Fri Sep 3 01:28:50 2010
@@ -36,7 +36,6 @@ import org.apache.avro.util.WeakIdentity
public class GenericDatumReader<D> implements DatumReader<D> {
private Schema actual;
private Schema expected;
- private ResolvingDecoder resolver;
public GenericDatumReader() {}
@@ -58,14 +57,18 @@ public class GenericDatumReader<D> imple
if (expected == null) {
expected = actual;
}
- resolver = null;
+ threadResolver.set(null);
}
/** Set the reader's schema. */
public void setExpected(Schema reader) throws IOException {
this.expected = reader;
+ threadResolver.set(null);
}
+ private final ThreadLocal<ResolvingDecoder> threadResolver =
+ new ThreadLocal<ResolvingDecoder>();
+
private static final ThreadLocal<Map<Schema,Map<Schema,ResolvingDecoder>>>
RESOLVER_CACHE =
new ThreadLocal<Map<Schema,Map<Schema,ResolvingDecoder>>>() {
@@ -74,26 +77,30 @@ public class GenericDatumReader<D> imple
}
};
- private static ResolvingDecoder getResolver(Schema actual, Schema expected)
+ private ResolvingDecoder getResolver(Schema actual, Schema expected)
throws IOException {
+ ResolvingDecoder resolver = threadResolver.get();
+ if (resolver != null)
+ return resolver;
+
Map<Schema,ResolvingDecoder> cache = RESOLVER_CACHE.get().get(actual);
if (cache == null) {
cache = new WeakIdentityHashMap<Schema,ResolvingDecoder>();
RESOLVER_CACHE.get().put(actual, cache);
}
- ResolvingDecoder resolver = cache.get(expected);
+ resolver = cache.get(expected);
if (resolver == null) {
resolver = new ResolvingDecoder(Schema.applyAliases(actual, expected),
expected, null);
cache.put(expected, resolver);
}
+ threadResolver.set(resolver);
return resolver;
}
@SuppressWarnings("unchecked")
public D read(D reuse, Decoder in) throws IOException {
- if (resolver == null)
- resolver = getResolver(actual, expected);
+ ResolvingDecoder resolver = getResolver(actual, expected);
resolver.init(in);
D result = (D) read(reuse, expected, resolver);
resolver.drain();