From 5d16573d704b7a93ec18c41184ed50adc0392b88 Mon Sep 17 00:00:00 2001 From: gphillips Date: Fri, 17 Jul 2015 08:45:37 -0400 Subject: [PATCH 1/3] 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/3] 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; } } @@ -41,12 +55,12 @@ private Wrapper(T wrapped) { @Test public void instanceCachesOnlyCreateOneInstance() throws AvroSerdeException { InstanceCache> ic = new InstanceCache>() { - @Override - protected Wrapper makeInstance(Foo hv, - Set seenSchemas) { - return new Wrapper(hv); - } - }; + @Override + protected Wrapper makeInstance(Foo hv, + Set seenSchemas) { + return new Wrapper(hv); + } + }; Foo f1 = new Foo(); Wrapper fc = ic.retrieve(f1, null); @@ -62,12 +76,12 @@ protected Wrapper makeInstance(Foo hv, @Test public void instanceCacheReturnsCorrectInstances() throws AvroSerdeException { InstanceCache> ic = new InstanceCache>() { - @Override - protected Wrapper makeInstance( - String hv, Set seenSchemas) { - return new Wrapper(hv); - } - }; + @Override + protected Wrapper makeInstance( + String hv, Set seenSchemas) { + return new Wrapper(hv); + } + }; Wrapper one = ic.retrieve("one", null); Wrapper two = ic.retrieve("two", null); -- 2.3.2 (Apple Git-55) From 73e032fb7cb7e1f5d5f7e2bd021ea8713d7e8074 Mon Sep 17 00:00:00 2001 From: gphillips Date: Mon, 27 Jul 2015 17:30:23 -0400 Subject: [PATCH 3/3] Changed HashMap to Map --- serde/src/java/org/apache/hadoop/hive/serde2/avro/InstanceCache.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 23f6f01..c7289cb 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 @@ -21,6 +21,7 @@ import org.apache.commons.logging.LogFactory; import java.util.HashMap; +import java.util.Map; import java.util.Set; /** @@ -33,7 +34,7 @@ */ public abstract class InstanceCache { private static final Log LOG = LogFactory.getLog(InstanceCache.class); - HashMap cache = new HashMap(); + Map cache = new HashMap(); public InstanceCache() {} -- 2.3.2 (Apple Git-55)