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();
   }
 }