This is an automated email from the ASF dual-hosted git repository.

vinoth pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-hudi.git


The following commit(s) were added to refs/heads/master by this push:
     new a33a55f  Caching Avro Binary encoder/decoder to avoid creating new one 
for every record
a33a55f is described below

commit a33a55fcb59c9de341bc3169defda94df2910e65
Author: Nishith Agarwal <[email protected]>
AuthorDate: Sun May 5 21:26:16 2019 -0700

    Caching Avro Binary encoder/decoder to avoid creating new one for every 
record
---
 .../hoodie/common/table/log/block/HoodieAvroDataBlock.java   | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git 
a/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java
 
b/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java
index b882252..f926d32 100644
--- 
a/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java
+++ 
b/hoodie-common/src/main/java/com/uber/hoodie/common/table/log/block/HoodieAvroDataBlock.java
@@ -37,6 +37,8 @@ import org.apache.avro.Schema;
 import org.apache.avro.generic.GenericDatumReader;
 import org.apache.avro.generic.GenericDatumWriter;
 import org.apache.avro.generic.IndexedRecord;
+import org.apache.avro.io.BinaryDecoder;
+import org.apache.avro.io.BinaryEncoder;
 import org.apache.avro.io.Decoder;
 import org.apache.avro.io.DecoderFactory;
 import org.apache.avro.io.Encoder;
@@ -52,6 +54,8 @@ public class HoodieAvroDataBlock extends HoodieLogBlock {
 
   private List<IndexedRecord> records;
   private Schema schema;
+  private ThreadLocal<BinaryEncoder> encoderCache = new ThreadLocal<>();
+  private ThreadLocal<BinaryDecoder> decoderCache = new ThreadLocal<>();
 
   public HoodieAvroDataBlock(@Nonnull List<IndexedRecord> records,
       @Nonnull Map<HeaderMetadataType, String> header,
@@ -118,7 +122,8 @@ public class HoodieAvroDataBlock extends HoodieLogBlock {
     while (itr.hasNext()) {
       IndexedRecord s = itr.next();
       ByteArrayOutputStream temp = new ByteArrayOutputStream();
-      Encoder encoder = EncoderFactory.get().binaryEncoder(temp, null);
+      BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(temp, 
encoderCache.get());
+      encoderCache.set(encoder);
       try {
         // Encode the record into bytes
         writer.write(s, encoder);
@@ -201,8 +206,9 @@ public class HoodieAvroDataBlock extends HoodieLogBlock {
     // 3. Read the content
     for (int i = 0; i < totalRecords; i++) {
       int recordLength = dis.readInt();
-      Decoder decoder = DecoderFactory.get()
-          .binaryDecoder(getContent().get(), dis.getNumberOfBytesRead(), 
recordLength, null);
+      BinaryDecoder decoder = DecoderFactory.get()
+          .binaryDecoder(getContent().get(), dis.getNumberOfBytesRead(), 
recordLength, decoderCache.get());
+      decoderCache.set(decoder);
       IndexedRecord record = reader.read(null, decoder);
       records.add(record);
       dis.skipBytes(recordLength);

Reply via email to