From 5d16573d704b7a93ec18c41184ed50adc0392b88 Mon Sep 17 00:00:00 2001 From: gphillips Date: Fri, 17 Jul 2015 08:45:37 -0400 Subject: [PATCH 1/2] Fixed InstanceCache hash collision bug --- .../java/org/apache/hadoop/hive/serde2/avro/InstanceCache.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/serde/src/java/org/apache/hadoop/hive/serde2/avro/InstanceCache.java b/serde/src/java/org/apache/hadoop/hive/serde2/avro/InstanceCache.java index 0b10d99..23f6f01 100644 --- a/serde/src/java/org/apache/hadoop/hive/serde2/avro/InstanceCache.java +++ b/serde/src/java/org/apache/hadoop/hive/serde2/avro/InstanceCache.java @@ -33,7 +33,7 @@ */ public abstract class InstanceCache { private static final Log LOG = LogFactory.getLog(InstanceCache.class); - HashMap cache = new HashMap(); + HashMap cache = new HashMap(); public InstanceCache() {} @@ -53,15 +53,15 @@ public Instance retrieve(SeedObject hv, Set seenSchemas) throws AvroSerdeException { if(LOG.isDebugEnabled()) LOG.debug("Checking for hv: " + hv.toString()); - if(cache.containsKey(hv.hashCode())) { + if(cache.containsKey(hv)) { if(LOG.isDebugEnabled()) LOG.debug("Returning cache result."); - return cache.get(hv.hashCode()); + return cache.get(hv); } if(LOG.isDebugEnabled()) LOG.debug("Creating new instance and storing in cache"); Instance instance = makeInstance(hv, seenSchemas); - cache.put(hv.hashCode(), instance); + cache.put(hv, instance); return instance; } -- 2.3.2 (Apple Git-55) From 53e6548a8c762aca7753892dd966076917dbb2e9 Mon Sep 17 00:00:00 2001 From: gphillips Date: Fri, 17 Jul 2015 15:29:34 -0400 Subject: [PATCH 2/2] Implemented sane InstanceCache equals method --- .../hadoop/hive/serde2/avro/TestInstanceCache.java | 40 +++++++++++++++------- 1 file changed, 27 insertions(+), 13 deletions(-) diff --git a/serde/src/test/org/apache/hadoop/hive/serde2/avro/TestInstanceCache.java b/serde/src/test/org/apache/hadoop/hive/serde2/avro/TestInstanceCache.java index 814e8e4..cb7c6ed 100644 --- a/serde/src/test/org/apache/hadoop/hive/serde2/avro/TestInstanceCache.java +++ b/serde/src/test/org/apache/hadoop/hive/serde2/avro/TestInstanceCache.java @@ -24,9 +24,23 @@ public class TestInstanceCache { private static class Foo { + + private int value = 42; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + + Foo foo = (Foo) o; + + return value == foo.value; + + } + @Override public int hashCode() { - return 42; + return value; } } -- 2.3.2 (Apple Git-55)