You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@avro.apache.org by cu...@apache.org on 2012/11/28 23:56:06 UTC

svn commit: r1414980 - in /avro/trunk: CHANGES.txt lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java

Author: cutting
Date: Wed Nov 28 22:56:05 2012
New Revision: 1414980

URL: http://svn.apache.org/viewvc?rev=1414980&view=rev
Log:
AVRO-1175. Java: Clear thread local reference in BinaryData#compare().

Modified:
    avro/trunk/CHANGES.txt
    avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java
    avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java

Modified: avro/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/avro/trunk/CHANGES.txt?rev=1414980&r1=1414979&r2=1414980&view=diff
==============================================================================
--- avro/trunk/CHANGES.txt (original)
+++ avro/trunk/CHANGES.txt Wed Nov 28 22:56:05 2012
@@ -69,6 +69,9 @@ Trunk (not yet released)
     AVRO-1177. Ruby: Fix RPC to only send handshake for first request
     over a connection.  (Georg Franz via cutting)
 
+    AVRO-1175. Java: Clear thread local reference in BinaryData#compare().
+    (cutting)
+
 Avro 1.7.2 (20 October 2012)
 
   NEW FEATURES

Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java?rev=1414980&r1=1414979&r2=1414980&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryData.java Wed Nov 28 22:56:05 2012
@@ -23,7 +23,6 @@ import org.apache.avro.Schema;
 import org.apache.avro.Schema.Field;
 import org.apache.avro.AvroRuntimeException;
 import org.apache.avro.generic.GenericDatumReader;
-import org.apache.avro.io.BinaryDecoder.BufferAccessor;
 
 /** Utilities for binary-encoded data. */
 public class BinaryData {
@@ -31,19 +30,20 @@ public class BinaryData {
   private BinaryData() {}                      // no public ctor
 
   private static class Decoders {
-     private final BufferAccessor b1, b2;
-     private final BinaryDecoder d1, d2;
+    private final BinaryDecoder d1, d2;
     public Decoders() {
        this.d1 = new BinaryDecoder(new byte[0], 0, 0);
        this.d2 = new BinaryDecoder(new byte[0], 0, 0);
-       this.b1 = d1.getBufferAccessor();
-       this.b2 = d2.getBufferAccessor();
     }
-     public void set(byte[] data1, int off1, int len1, 
-         byte[] data2, int off2, int len2) {
-       this.d1.configure(data1, off1, len1);
-       this.d2.configure(data2, off2, len2);
-  }
+    public void set(byte[] data1, int off1, int len1, 
+                    byte[] data2, int off2, int len2) {
+      d1.setBuf(data1, off1, len1);
+      d2.setBuf(data2, off2, len2);
+    }
+    public void clear() {
+      d1.clearBuf();
+      d2.clearBuf();
+    }
   }                     // no public ctor
 
   private static final ThreadLocal<Decoders> DECODERS
@@ -72,6 +72,8 @@ public class BinaryData {
       return compare(decoders, schema);
     } catch (IOException e) {
       throw new AvroRuntimeException(e);
+    } finally {
+      decoders.clear();
     }
   }
 
@@ -141,8 +143,8 @@ public class BinaryData {
     }
     case FIXED: {
       int size = schema.getFixedSize();
-      int c = compareBytes(d.b1.getBuf(), d.b1.getPos(), size,
-                           d.b2.getBuf(), d.b2.getPos(), size);
+      int c = compareBytes(d.d1.getBuf(), d.d1.getPos(), size,
+                           d.d2.getBuf(), d.d2.getPos(), size);
       d.d1.skipFixed(size);
       d.d2.skipFixed(size);
       return c;
@@ -150,8 +152,8 @@ public class BinaryData {
     case STRING: case BYTES: {
       int l1 = d1.readInt();
       int l2 = d2.readInt();
-      int c = compareBytes(d.b1.getBuf(), d.b1.getPos(), l1,
-                           d.b2.getBuf(), d.b2.getPos(), l2);
+      int c = compareBytes(d.d1.getBuf(), d.d1.getPos(), l1,
+                           d.d2.getBuf(), d.d2.getPos(), l2);
       d.d1.skipFixed(l1);
       d.d2.skipFixed(l2);
       return c;
@@ -194,14 +196,12 @@ public class BinaryData {
   }
 
   private static class HashData {
-    private final BufferAccessor bytes;
     private final BinaryDecoder decoder;
     public HashData() {
       this.decoder = new BinaryDecoder(new byte[0], 0, 0);
-      this.bytes = decoder.getBufferAccessor();
     }
     public void set(byte[] bytes, int start, int len) {
-      this.decoder.configure(bytes, start, len);
+      this.decoder.setBuf(bytes, start, len);
     }
   }
 
@@ -280,8 +280,8 @@ public class BinaryData {
   private static int hashBytes(int init, HashData data, int len, boolean rev)
     throws IOException {
     int hashCode = init;
-    byte[] bytes = data.bytes.getBuf();
-    int start = data.bytes.getPos();
+    byte[] bytes = data.decoder.getBuf();
+    int start = data.decoder.getPos();
     int end = start+len;
     if (rev) 
       for (int i = end-1; i >= start; i--)

Modified: avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java
URL: http://svn.apache.org/viewvc/avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java?rev=1414980&r1=1414979&r2=1414980&view=diff
==============================================================================
--- avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java (original)
+++ avro/trunk/lang/java/avro/src/main/java/org/apache/avro/io/BinaryDecoder.java Wed Nov 28 22:56:05 2012
@@ -50,10 +50,17 @@ public class BinaryDecoder extends Decod
   private int pos = 0;
   private int limit = 0;
 
-  BufferAccessor getBufferAccessor() {
-    return new BufferAccessor(this);
+  byte[] getBuf() { return buf; }
+  int getPos() { return pos; }
+  int getLimit() { return limit; }
+
+  void setBuf(byte[] buf, int pos, int len) {
+    this.buf = buf;
+    this.pos = pos;
+    this.limit = pos+len;
   }
-  
+  void clearBuf() { this.buf = null; }
+
   /** protected constructor for child classes */
   protected BinaryDecoder() {
   }