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 <[email protected]> Authored: Thu Jul 28 10:44:06 2016 +0200 Committer: Ryan Blue <[email protected]> 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(); } }
