From 33c763e42afed0fcf2973d0eecdb4c2148ec8e64 Mon Sep 17 00:00:00 2001 From: Christophe Le Saec Date: Fri, 28 Jul 2023 09:56:47 +0200 Subject: [PATCH] AVRO-2731: initialize hashmap with good capacity --- .../avro/compiler/specific/templates/java/classic/record.vm | 2 +- .../java/org/apache/avro/specific/TestGeneratedCode.java | 5 ++++- lang/java/compiler/src/test/resources/full_record_v2.avsc | 3 ++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm b/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm index 971cfa67758..231efa8f20e 100755 --- a/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm +++ b/lang/java/compiler/src/main/velocity/org/apache/avro/compiler/specific/templates/java/classic/record.vm @@ -837,7 +837,7 @@ $I } $I long size${nv} = in.readMapStart(); $I $t m${nv} = ${var}; // Need fresh name due to limitation of macro system $I if (m${nv} == null) { -$I m${nv} = new java.util.HashMap<${kt},${vt}>((int)size${nv}); +$I m${nv} = new java.util.HashMap<${kt},${vt}>((int)(size${nv} * 4)/3 + 1); $I $var = m${nv}; $I } else m${nv}.clear(); $I for ( ; 0 < size${nv}; size${nv} = in.mapNext()) { diff --git a/lang/java/compiler/src/test/java/org/apache/avro/specific/TestGeneratedCode.java b/lang/java/compiler/src/test/java/org/apache/avro/specific/TestGeneratedCode.java index e541a244b7a..0e61aa7cc15 100644 --- a/lang/java/compiler/src/test/java/org/apache/avro/specific/TestGeneratedCode.java +++ b/lang/java/compiler/src/test/java/org/apache/avro/specific/TestGeneratedCode.java @@ -20,6 +20,8 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.nio.ByteBuffer; +import java.util.HashMap; +import java.util.Map; import org.apache.avro.Schema; import org.apache.avro.io.Encoder; @@ -71,8 +73,9 @@ void withoutSchemaMigration() throws IOException { @Test void withSchemaMigration() throws IOException { + Map map = new HashMap<>(); FullRecordV2 src = new FullRecordV2(true, 731, 87231, 38L, 54.2832F, "Hi there", - ByteBuffer.wrap(Utf8.getBytesFor("Hello, world!"))); + ByteBuffer.wrap(Utf8.getBytesFor("Hello, world!")), map); assertTrue(((SpecificRecordBase) src).hasCustomCoders(), "Test schema must allow for custom coders."); ByteArrayOutputStream out = new ByteArrayOutputStream(1024); diff --git a/lang/java/compiler/src/test/resources/full_record_v2.avsc b/lang/java/compiler/src/test/resources/full_record_v2.avsc index b80b9b4ae9d..0a033cf55be 100644 --- a/lang/java/compiler/src/test/resources/full_record_v2.avsc +++ b/lang/java/compiler/src/test/resources/full_record_v2.avsc @@ -24,6 +24,7 @@ }, { "name" : "h", "type" : "bytes" - } ] + }, + { "name" : "myMap", "type" : { "type" : "map", "values" : "string" } }] }