You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by bl...@apache.org on 2016/09/04 00:19:15 UTC
avro git commit: AVRO-607: Java: Make SpecificData schema cache
thread-safe.
Repository: avro
Updated Branches:
refs/heads/master 749934f3c -> fa0059c55
AVRO-607: Java: Make SpecificData schema cache thread-safe.
Changed SpecificData.getSchema to use a thread-safe Cache class from
Google Guava.
Project: http://git-wip-us.apache.org/repos/asf/avro/repo
Commit: http://git-wip-us.apache.org/repos/asf/avro/commit/fa0059c5
Tree: http://git-wip-us.apache.org/repos/asf/avro/tree/fa0059c5
Diff: http://git-wip-us.apache.org/repos/asf/avro/diff/fa0059c5
Branch: refs/heads/master
Commit: fa0059c55a31813634188eb85e53b68e33644489
Parents: 749934f
Author: Andrius Druzinis-Vitkus <an...@gmail.com>
Authored: Thu Jul 28 10:44:06 2016 +0200
Committer: Ryan Blue <bl...@apache.org>
Committed: Sat Sep 3 17:18:35 2016 -0700
----------------------------------------------------------------------
CHANGES.txt | 3 +++
.../org/apache/avro/specific/SpecificData.java | 25 +++++++++++++-------
.../main/java/org/apache/avro/GuavaClasses.java | 6 +++++
3 files changed, 26 insertions(+), 8 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/avro/blob/fa0059c5/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index e38fe9a..ce72273 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -27,6 +27,9 @@ Trunk (not yet released)
AVRO-1869: Java: Fix Decimal conversion from ByteBuffer. (blue)
+ AVRO-607: Java: Make SpecificData schema cache thread-safe.
+ (Andrius Druzinis-Vitkus via blue)
+
Avro 1.8.1 (14 May 2016)
INCOMPATIBLE CHANGES
http://git-wip-us.apache.org/repos/asf/avro/blob/fa0059c5/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
----------------------------------------------------------------------
diff --git a/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java b/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
index ec2e33f..be6bde8 100644
--- a/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
+++ b/lang/java/avro/src/main/java/org/apache/avro/specific/SpecificData.java
@@ -23,7 +23,6 @@ import java.util.Map;
import java.util.Collection;
import java.util.List;
import java.util.Set;
-import java.util.WeakHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.LinkedHashMap;
import java.nio.ByteBuffer;
@@ -32,6 +31,9 @@ import java.lang.reflect.ParameterizedType;
import java.io.ObjectInput;
import java.io.ObjectOutput;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
import org.apache.avro.Schema;
import org.apache.avro.Protocol;
import org.apache.avro.AvroRuntimeException;
@@ -207,17 +209,24 @@ public class SpecificData extends GenericData {
return namespace + dot + name;
}
- private final WeakHashMap<java.lang.reflect.Type,Schema> schemaCache =
- new WeakHashMap<java.lang.reflect.Type,Schema>();
+ private final LoadingCache<java.lang.reflect.Type,Schema> schemaCache =
+ CacheBuilder.newBuilder()
+ .weakKeys()
+ .build(new CacheLoader<java.lang.reflect.Type,Schema>() {
+ public Schema load(java.lang.reflect.Type type)
+ throws AvroRuntimeException {
+ return createSchema(type, new LinkedHashMap<String,Schema>());
+ }
+ });
/** Find the schema for a Java type. */
public Schema getSchema(java.lang.reflect.Type type) {
- Schema schema = schemaCache.get(type);
- if (schema == null) {
- schema = createSchema(type, new LinkedHashMap<String,Schema>());
- schemaCache.put(type, schema);
+ try {
+ return schemaCache.get(type);
+ } catch (Exception e) {
+ throw (e instanceof AvroRuntimeException) ?
+ (AvroRuntimeException)e.getCause() : new AvroRuntimeException(e);
}
- return schema;
}
/** Create the schema for a Java type. */
http://git-wip-us.apache.org/repos/asf/avro/blob/fa0059c5/lang/java/guava/src/main/java/org/apache/avro/GuavaClasses.java
----------------------------------------------------------------------
diff --git a/lang/java/guava/src/main/java/org/apache/avro/GuavaClasses.java b/lang/java/guava/src/main/java/org/apache/avro/GuavaClasses.java
index 25d918f..6052217 100644
--- a/lang/java/guava/src/main/java/org/apache/avro/GuavaClasses.java
+++ b/lang/java/guava/src/main/java/org/apache/avro/GuavaClasses.java
@@ -18,6 +18,9 @@
package org.apache.avro;
+import com.google.common.cache.CacheBuilder;
+import com.google.common.cache.CacheLoader;
+import com.google.common.cache.LoadingCache;
import com.google.common.collect.MapMaker;
import com.google.common.primitives.Bytes;
@@ -29,5 +32,8 @@ class GuavaClasses {
static {
MapMaker.class.getName();
Bytes.class.getName();
+ LoadingCache.class.getName();
+ CacheBuilder.class.getName();
+ CacheLoader.class.getName();
}
}