You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2011/10/21 05:15:29 UTC

svn commit: r1187175 - in /hbase/trunk: ./ src/main/java/org/apache/hadoop/hbase/filter/

Author: larsh
Date: Fri Oct 21 03:15:28 2011
New Revision: 1187175

URL: http://svn.apache.org/viewvc?rev=1187175&view=rev
Log:
HBASE-4626  Filters unnecessarily copy byte arrays

Modified:
    hbase/trunk/CHANGES.txt
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java
    hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java

Modified: hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hbase/trunk/CHANGES.txt?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/CHANGES.txt (original)
+++ hbase/trunk/CHANGES.txt Fri Oct 21 03:15:28 2011
@@ -21,6 +21,7 @@ Release 0.93.0 - Unreleased
    HBASE-4469  Avoid top row seek by looking up bloomfilter (liyin via jgray)
    HBASE-4418  Show all the hbase configuration in the web ui
    HBASE-4489  Better key splitting in RegionSplitter
+   HBASE-4626  Filters unnecessarily copy byte arrays (Lars H)
 
   BUG FIXES
    HBASE-4488  Store could miss rows during flush (Lars H via jgray)

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryComparator.java Fri Oct 21 03:15:28 2011
@@ -20,6 +20,8 @@
 
 package org.apache.hadoop.hbase.filter;
 
+import org.apache.hadoop.hbase.util.Bytes;
+
 /**
  * A binary comparator which lexicographically compares against the specified
  * byte array using {@link org.apache.hadoop.hbase.util.Bytes#compareTo(byte[], byte[])}.
@@ -37,4 +39,8 @@ public class BinaryComparator extends Wr
     super(value);
   }
 
+  @Override
+  public int compareTo(byte [] value, int offset, int length) {
+    return Bytes.compareTo(this.value, 0, this.value.length, value, offset, length);
+  }
 }

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BinaryPrefixComparator.java Fri Oct 21 03:15:28 2011
@@ -41,13 +41,8 @@ public class BinaryPrefixComparator exte
   }
 
   @Override
-  public int compareTo(byte [] value) {
-    if (this.value.length <= value.length) {
-      return Bytes.compareTo(this.value, 0, this.value.length, value, 0,
-          this.value.length);
-    } else {
-      return Bytes.compareTo(this.value, value);
-    }
+  public int compareTo(byte [] value, int offset, int length) {
+    return Bytes.compareTo(this.value, 0, this.value.length, value, offset,
+        this.value.length <= length ? this.value.length : length);
   }
-
 }

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/BitComparator.java Fri Oct 21 03:15:28 2011
@@ -74,8 +74,8 @@ public class BitComparator extends Writa
   }
 
   @Override
-  public int compareTo(byte[] value) {
-    if (value.length != this.value.length) {
+  public int compareTo(byte[] value, int offset, int length) {
+    if (length != this.value.length) {
       return 1;
     }
     int b = 0;
@@ -83,13 +83,13 @@ public class BitComparator extends Writa
     for (int i = value.length - 1; i >= 0 && b == 0; i--) {
       switch (bitOperator) {
         case AND:
-          b = (this.value[i] & value[i]) & 0xff;
+          b = (this.value[i] & value[i+offset]) & 0xff;
           break;
         case OR:
-          b = (this.value[i] | value[i]) & 0xff;
+          b = (this.value[i] | value[i+offset]) & 0xff;
           break;
         case XOR:
-          b = (this.value[i] ^ value[i]) & 0xff;
+          b = (this.value[i] ^ value[i+offset]) & 0xff;
           break;
       }
     }

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/CompareFilter.java Fri Oct 21 03:15:28 2011
@@ -20,13 +20,11 @@
 
 package org.apache.hadoop.hbase.filter;
 
-import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.io.HbaseObjectWritable;
 
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
-import java.util.Arrays;
 import java.util.ArrayList;
 
 import com.google.common.base.Preconditions;
@@ -102,12 +100,10 @@ public abstract class CompareFilter exte
   protected boolean doCompare(final CompareOp compareOp,
       final WritableByteArrayComparable comparator, final byte [] data,
       final int offset, final int length) {
-      if (compareOp == CompareOp.NO_OP) {
-	  return true;
-      }
-    int compareResult =
-      comparator.compareTo(Arrays.copyOfRange(data, offset,
-        offset + length));
+    if (compareOp == CompareOp.NO_OP) {
+      return true;
+    }
+    int compareResult = comparator.compareTo(data, offset, length);
     switch (compareOp) {
       case LESS:
         return compareResult <= 0;

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java Fri Oct 21 03:15:28 2011
@@ -36,4 +36,8 @@ public class NullComparator extends Writ
     return value != null ? 1 : 0;
   }
 
+  @Override
+  public int compareTo(byte[] value, int offset, int length) {
+    throw new UnsupportedOperationException();
+  }
 }

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/RegexStringComparator.java Fri Oct 21 03:15:28 2011
@@ -90,10 +90,11 @@ public class RegexStringComparator exten
   }
 
   @Override
-  public int compareTo(byte[] value) {
+  public int compareTo(byte[] value, int offset, int length) {
     // Use find() for subsequence match instead of matches() (full sequence
     // match) to adhere to the principle of least surprise.
-    return pattern.matcher(new String(value, charset)).find() ? 0 : 1;
+    return pattern.matcher(new String(value, offset, length, charset)).find() ? 0
+        : 1;
   }
 
   @Override

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SingleColumnValueFilter.java Fri Oct 21 03:15:28 2011
@@ -174,10 +174,7 @@ public class SingleColumnValueFilter ext
 
   private boolean filterColumnValue(final byte [] data, final int offset,
       final int length) {
-    // TODO: Can this filter take a rawcomparator so don't have to make this
-    // byte array copy?
-    int compareResult =
-      this.comparator.compareTo(Arrays.copyOfRange(data, offset, offset + length));
+    int compareResult = this.comparator.compareTo(data, offset, length);
     switch (this.compareOp) {
     case LESS:
       return compareResult <= 0;

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/SubstringComparator.java Fri Oct 21 03:15:28 2011
@@ -64,8 +64,9 @@ public class SubstringComparator extends
   }
 
   @Override
-  public int compareTo(byte[] value) {
-    return Bytes.toString(value).toLowerCase().contains(substr) ? 0 : 1;
+  public int compareTo(byte[] value, int offset, int length) {
+    return Bytes.toString(value, offset, length).toLowerCase().contains(substr) ? 0
+        : 1;
   }
 
   @Override

Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java?rev=1187175&r1=1187174&r2=1187175&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/filter/WritableByteArrayComparable.java Fri Oct 21 03:15:28 2011
@@ -60,7 +60,17 @@ public abstract class WritableByteArrayC
 
   @Override
   public int compareTo(byte [] value) {
-    return Bytes.compareTo(this.value, value);
+    return compareTo(value, 0, value.length);
   }
 
+  /**
+   * Special compareTo method for subclasses, to avoid
+   * copying byte[] unnecessarily.
+   * @param value byte[] to compare
+   * @param offset offset into value
+   * @param length number of bytes to compare
+   * @return a negative integer, zero, or a positive integer as this object
+   *         is less than, equal to, or greater than the specified object.
+   */
+  public abstract int compareTo(byte [] value, int offset, int length);
 }