Author: stack
Date: Sun Apr 18 05:50:31 2010
New Revision: 935301

URL: http://svn.apache.org/viewvc?rev=935301&view=rev
Log:
HBASE-2463 Various Bytes.* functions silently ignore invalid arguments

Modified:
    hadoop/hbase/trunk/CHANGES.txt
    
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/TableOperation.java
    
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/util/Bytes.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=935301&r1=935300&r2=935301&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Sun Apr 18 05:50:31 2010
@@ -277,6 +277,8 @@ Release 0.21.0 - Unreleased
    HBASE-2458  Client stuck in TreeMap,remove (Todd Lipcon via Stack)
    HBASE-2460  add_table.rb deletes any tables for which the target table name
                is a prefix (Todd Lipcon via Stack)
+   HBASE-2463  Various Bytes.* functions silently ignore invalid arguments
+               (Benoit Sigoure via Stack)
 
   IMPROVEMENTS
    HBASE-1760  Cleanup TODOs in HTable

Modified: 
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/TableOperation.java
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/TableOperation.java?rev=935301&r1=935300&r2=935301&view=diff
==============================================================================
--- 
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/TableOperation.java
 (original)
+++ 
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/master/TableOperation.java
 Sun Apr 18 05:50:31 2010
@@ -37,7 +37,7 @@ import java.util.Set;
 import java.util.TreeSet;
 
 /**
- * Abstract base class for operations that need to examine all HRegionInfo 
+ * Abstract base class for operations that need to examine all HRegionInfo
  * objects in a table. (For a table, operate on each of its rows
  * in .META.).
  */
@@ -64,7 +64,7 @@ abstract class TableOperation implements
       // assigned and scanned.
       if 
(master.getRegionManager().metaScannerThread.waitForMetaRegionsOrClose()) {
         // We're shutting down. Forget it.
-        throw new MasterNotRunningException(); 
+        throw new MasterNotRunningException();
       }
     }
     this.metaRegions = 
master.getRegionManager().getMetaRegionsForTable(tableName);
@@ -101,12 +101,12 @@ abstract class TableOperation implements
                       Bytes.toStringBinary(values.getRow()));
             continue;
           }
-          String serverAddress = 
+          final String serverAddress =
             Bytes.toString(values.getValue(CATALOG_FAMILY, SERVER_QUALIFIER));
-          long startCode = 
-            Bytes.toLong(values.getValue(CATALOG_FAMILY, 
STARTCODE_QUALIFIER)); 
           String serverName = null;
           if (serverAddress != null && serverAddress.length() > 0) {
+            long startCode =
+              Bytes.toLong(values.getValue(CATALOG_FAMILY, 
STARTCODE_QUALIFIER));
             serverName = HServerInfo.getServerName(serverAddress, startCode);
           }
           if (Bytes.compareTo(info.getTableDesc().getName(), tableName) > 0) {
@@ -158,7 +158,7 @@ abstract class TableOperation implements
       }
     }
   }
-  
+
   protected boolean isBeingServed(String serverName) {
     boolean result = false;
     if (serverName != null && serverName.length() > 0) {
@@ -177,4 +177,4 @@ abstract class TableOperation implements
 
   protected abstract void postProcessMeta(MetaRegion m,
     HRegionInterface server) throws IOException;
-}
\ No newline at end of file
+}

Modified: 
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
URL: 
http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/util/Bytes.java?rev=935301&r1=935300&r2=935301&view=diff
==============================================================================
--- 
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/util/Bytes.java 
(original)
+++ 
hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/util/Bytes.java 
Sun Apr 18 05:50:31 2010
@@ -21,6 +21,8 @@ package org.apache.hadoop.hbase.util;
 
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.io.RawComparator;
 import org.apache.hadoop.io.WritableComparator;
 import org.apache.hadoop.io.WritableUtils;
@@ -39,48 +41,50 @@ import java.util.Comparator;
  * HashSets, etc.
  */
 public class Bytes {
-  
+
+  private static final Log LOG = LogFactory.getLog(Bytes.class);
+
   /**
    * Size of boolean in bytes
    */
-  public static final int SIZEOF_BOOLEAN = Byte.SIZE/Byte.SIZE;
-  
+  public static final int SIZEOF_BOOLEAN = Byte.SIZE / Byte.SIZE;
+
   /**
    * Size of byte in bytes
    */
   public static final int SIZEOF_BYTE = SIZEOF_BOOLEAN;
-  
+
   /**
    * Size of char in bytes
    */
-  public static final int SIZEOF_CHAR = Character.SIZE/Byte.SIZE;
-  
+  public static final int SIZEOF_CHAR = Character.SIZE / Byte.SIZE;
+
   /**
    * Size of double in bytes
    */
-  public static final int SIZEOF_DOUBLE = Double.SIZE/Byte.SIZE;
-  
+  public static final int SIZEOF_DOUBLE = Double.SIZE / Byte.SIZE;
+
   /**
    * Size of float in bytes
    */
-  public static final int SIZEOF_FLOAT = Float.SIZE/Byte.SIZE;
-  
+  public static final int SIZEOF_FLOAT = Float.SIZE / Byte.SIZE;
+
   /**
    * Size of int in bytes
    */
-  public static final int SIZEOF_INT = Integer.SIZE/Byte.SIZE;
-  
+  public static final int SIZEOF_INT = Integer.SIZE / Byte.SIZE;
+
   /**
    * Size of long in bytes
    */
-  public static final int SIZEOF_LONG = Long.SIZE/Byte.SIZE;
+  public static final int SIZEOF_LONG = Long.SIZE / Byte.SIZE;
 
   /**
    * Size of short in bytes
    */
-  public static final int SIZEOF_SHORT = Short.SIZE/Byte.SIZE;
+  public static final int SIZEOF_SHORT = Short.SIZE / Byte.SIZE;
+
 
-  
   /**
    * Estimate of size cost to pay beyond payload in jvm for instance of byte 
[].
    * Estimate based on study of jhat and jprofiler numbers.
@@ -118,7 +122,7 @@ public class Bytes {
    */
   public static RawComparator<byte []> BYTES_RAWCOMPARATOR =
     new ByteArrayComparator();
-  
+
   /**
    * Read byte-array written with a WritableableUtils.vint prefix.
    * @param in Input to read from.
@@ -135,7 +139,7 @@ public class Bytes {
     in.readFully(result, 0, len);
     return result;
   }
-  
+
   /**
    * Read byte-array written with a WritableableUtils.vint prefix.
    * IOException is converted to a RuntimeException.
@@ -248,6 +252,12 @@ public class Bytes {
     return toString(b, 0, b.length);
   }
 
+  /**
+   * Joins two byte arrays together using a separator.
+   * @param b1 The first byte array.
+   * @param sep The separator to use.
+   * @param b2 The second byte array.
+   */
   public static String toString(final byte [] b1,
                                 String sep,
                                 final byte [] b2) {
@@ -265,19 +275,18 @@ public class Bytes {
    * @return String made from <code>b</code> or null
    */
   public static String toString(final byte [] b, int off, int len) {
-    if(b == null) {
+    if (b == null) {
       return null;
     }
-    if(len == 0) {
+    if (len == 0) {
       return "";
     }
-    String result = null;
     try {
-      result = new String(b, off, len, HConstants.UTF8_ENCODING);
+      return new String(b, off, len, HConstants.UTF8_ENCODING);
     } catch (UnsupportedEncodingException e) {
-      e.printStackTrace();
+      LOG.error("UTF-8 not supported?", e);
+      return null;
     }
-    return result;
   }
 
   /**
@@ -325,8 +334,8 @@ public class Bytes {
           result.append(String.format("\\x%02X", ch));
         }
       }
-    } catch ( UnsupportedEncodingException e) {
-      e.printStackTrace();
+    } catch (UnsupportedEncodingException e) {
+      LOG.error("ISO-8859-1 not supported?", e);
     }
     return result.toString();
   }
@@ -369,8 +378,8 @@ public class Bytes {
         char hd2 = in.charAt(i+3);
 
         // they need to be A-F0-9:
-        if ( ! isHexDigit(hd1) ||
-            ! isHexDigit(hd2) ) {
+        if (!isHexDigit(hd1) ||
+            !isHexDigit(hd2)) {
           // bogus escape code, ignore:
           continue;
         }
@@ -395,18 +404,14 @@ public class Bytes {
    * @return the byte array
    */
   public static byte[] toBytes(String s) {
-    if (s == null) {
-      throw new IllegalArgumentException("string cannot be null");
-    }
-    byte [] result = null;
     try {
-      result = s.getBytes(HConstants.UTF8_ENCODING);
+      return s.getBytes(HConstants.UTF8_ENCODING);
     } catch (UnsupportedEncodingException e) {
-      e.printStackTrace();
+      LOG.error("UTF-8 not supported?", e);
+      return null;
     }
-    return result;
   }
-  
+
   /**
    * Convert a boolean to a byte array. True becomes -1
    * and false becomes 0.
@@ -415,9 +420,7 @@ public class Bytes {
    * @return <code>b</code> encoded in a byte array.
    */
   public static byte [] toBytes(final boolean b) {
-    byte [] bb = new byte[1];
-    bb[0] = b? (byte)-1: (byte)0;
-    return bb;
+    return new byte[] { b ? (byte) -1 : (byte) 0 };
   }
 
   /**
@@ -426,10 +429,10 @@ public class Bytes {
    * @return True or false.
    */
   public static boolean toBoolean(final byte [] b) {
-    if (b == null || b.length > 1) {
-      throw new IllegalArgumentException("Array is wrong size");
+    if (b.length != 1) {
+      throw new IllegalArgumentException("Array has wrong size: " + b.length);
     }
-    return b[0] != (byte)0;
+    return b[0] != (byte) 0;
   }
 
   /**
@@ -440,11 +443,11 @@ public class Bytes {
    */
   public static byte[] toBytes(long val) {
     byte [] b = new byte[8];
-    for (int i=7; i>0; i--) {
-      b[i] = (byte)(val);
+    for (int i = 7; i > 0; i--) {
+      b[i] = (byte) val;
       val >>>= 8;
     }
-    b[0] = (byte)(val);
+    b[0] = (byte) val;
     return b;
   }
 
@@ -455,7 +458,7 @@ public class Bytes {
    * @return the long value
    */
   public static long toLong(byte[] bytes) {
-    return toLong(bytes, 0);
+    return toLong(bytes, 0, SIZEOF_LONG);
   }
 
   /**
@@ -477,36 +480,55 @@ public class Bytes {
    * @param offset offset into array
    * @param length length of data (must be {...@link #SIZEOF_LONG})
    * @return the long value
+   * @throws IllegalArgumentException if length is not {...@link #SIZEOF_LONG} 
or
+   * if there's not enough room in the array at the offset indicated.
    */
   public static long toLong(byte[] bytes, int offset, final int length) {
-    if (bytes == null || length != SIZEOF_LONG ||
-        (offset + length > bytes.length)) {
-      return -1L;
+    if (length != SIZEOF_LONG || offset + length > bytes.length) {
+      throw explainWrongLengthOrOffset(bytes, offset, length, SIZEOF_LONG);
     }
     long l = 0;
-    for(int i = offset; i < (offset + length); i++) {
+    for(int i = offset; i < offset + length; i++) {
       l <<= 8;
-      l ^= (long)bytes[i] & 0xFF;
+      l ^= bytes[i] & 0xFF;
     }
     return l;
   }
-  
+
+  private static IllegalArgumentException
+    explainWrongLengthOrOffset(final byte[] bytes,
+                               final int offset,
+                               final int length,
+                               final int expectedLength) {
+    String reason;
+    if (length != expectedLength) {
+      reason = "Wrong length: " + length + ", expected " + expectedLength;
+    } else {
+     reason = "offset (" + offset + ") + length (" + length + ") exceed the"
+        + " capacity of the array: " + bytes.length;
+    }
+    return new IllegalArgumentException(reason);
+  }
+
   /**
    * Put a long value out to the specified byte array position.
    * @param bytes the byte array
    * @param offset position in the array
    * @param val long to write out
    * @return incremented offset
+   * @throws IllegalArgumentException if the byte array given doesn't have
+   * enough room at the offset specified.
    */
   public static int putLong(byte[] bytes, int offset, long val) {
-    if (bytes == null || (bytes.length - offset < SIZEOF_LONG)) {
-      return offset;
+    if (bytes.length - offset < SIZEOF_LONG) {
+      throw new IllegalArgumentException("Not enough room to put a long at"
+          + " offset " + offset + " in a " + bytes.length + " byte array");
     }
-    for(int i=offset+7;i>offset;i--) {
-      bytes[i] = (byte)(val);
+    for(int i = offset + 7; i > offset; i--) {
+      bytes[i] = (byte) val;
       val >>>= 8;
     }
-    bytes[offset] = (byte)(val);
+    bytes[offset] = (byte) val;
     return offset + SIZEOF_LONG;
   }
 
@@ -526,19 +548,17 @@ public class Bytes {
    * @return Float made from passed byte array.
    */
   public static float toFloat(byte [] bytes, int offset) {
-    int i = toInt(bytes, offset);
-    return Float.intBitsToFloat(i);
+    return Float.intBitsToFloat(toInt(bytes, offset, SIZEOF_INT));
   }
 
   /**
    * @param bytes byte array
    * @param offset offset to write to
    * @param f float value
-   * @return New offset in <code>bytes</bytes>
+   * @return New offset in <code>bytes</code>
    */
   public static int putFloat(byte [] bytes, int offset, float f) {
-    int i = Float.floatToRawIntBits(f);
-    return putInt(bytes, offset, i);
+    return putInt(bytes, offset, Float.floatToRawIntBits(f));
   }
 
   /**
@@ -547,8 +567,7 @@ public class Bytes {
    */
   public static byte [] toBytes(final float f) {
     // Encode it as int
-    int i = Float.floatToRawIntBits(f);
-    return Bytes.toBytes(i);
+    return Bytes.toBytes(Float.floatToRawIntBits(f));
   }
 
   /**
@@ -565,8 +584,7 @@ public class Bytes {
    * @return Return double made from passed bytes.
    */
   public static double toDouble(final byte [] bytes, final int offset) {
-    long l = toLong(bytes, offset);
-    return Double.longBitsToDouble(l);
+    return Double.longBitsToDouble(toLong(bytes, offset, SIZEOF_LONG));
   }
 
   /**
@@ -576,8 +594,7 @@ public class Bytes {
    * @return New offset into array <code>bytes</code>
    */
   public static int putDouble(byte [] bytes, int offset, double d) {
-    long l = Double.doubleToLongBits(d);
-    return putLong(bytes, offset, l);
+    return putLong(bytes, offset, Double.doubleToLongBits(d));
   }
 
   /**
@@ -589,8 +606,7 @@ public class Bytes {
    */
   public static byte [] toBytes(final double d) {
     // Encode it as a long
-    long l = Double.doubleToRawLongBits(d);
-    return Bytes.toBytes(l);
+    return Bytes.toBytes(Double.doubleToRawLongBits(d));
   }
 
   /**
@@ -601,20 +617,20 @@ public class Bytes {
   public static byte[] toBytes(int val) {
     byte [] b = new byte[4];
     for(int i = 3; i > 0; i--) {
-      b[i] = (byte)(val);
+      b[i] = (byte) val;
       val >>>= 8;
     }
-    b[0] = (byte)(val);
+    b[0] = (byte) val;
     return b;
   }
-  
+
   /**
    * Converts a byte array to an int value
    * @param bytes byte array
    * @return the int value
    */
   public static int toInt(byte[] bytes) {
-    return toInt(bytes, 0);
+    return toInt(bytes, 0, SIZEOF_INT);
   }
 
   /**
@@ -633,11 +649,12 @@ public class Bytes {
    * @param offset offset into array
    * @param length length of int (has to be {...@link #SIZEOF_INT})
    * @return the int value
+   * @throws IllegalArgumentException if length is not {...@link #SIZEOF_INT} 
or
+   * if there's not enough room in the array at the offset indicated.
    */
   public static int toInt(byte[] bytes, int offset, final int length) {
-    if (bytes == null || length != SIZEOF_INT ||
-        (offset + length > bytes.length)) {
-      return -1;
+    if (length != SIZEOF_INT || offset + length > bytes.length) {
+      throw explainWrongLengthOrOffset(bytes, offset, length, SIZEOF_INT);
     }
     int n = 0;
     for(int i = offset; i < (offset + length); i++) {
@@ -646,26 +663,29 @@ public class Bytes {
     }
     return n;
   }
-  
+
   /**
    * Put an int value out to the specified byte array position.
    * @param bytes the byte array
    * @param offset position in the array
    * @param val int to write out
    * @return incremented offset
+   * @throws IllegalArgumentException if the byte array given doesn't have
+   * enough room at the offset specified.
    */
   public static int putInt(byte[] bytes, int offset, int val) {
-    if (bytes == null || (bytes.length - offset < SIZEOF_INT)) {
-      return offset;
+    if (bytes.length - offset < SIZEOF_INT) {
+      throw new IllegalArgumentException("Not enough room to put an int at"
+          + " offset " + offset + " in a " + bytes.length + " byte array");
     }
-    for(int i= offset+3; i > offset; i--) {
-      bytes[i] = (byte)(val);
+    for(int i= offset + 3; i > offset; i--) {
+      bytes[i] = (byte) val;
       val >>>= 8;
     }
-    bytes[offset] = (byte)(val);
+    bytes[offset] = (byte) val;
     return offset + SIZEOF_INT;
   }
-  
+
   /**
    * Convert a short value to a byte array of {...@link #SIZEOF_SHORT} bytes 
long.
    * @param val value
@@ -673,9 +693,9 @@ public class Bytes {
    */
   public static byte[] toBytes(short val) {
     byte[] b = new byte[SIZEOF_SHORT];
-    b[1] = (byte)(val);
+    b[1] = (byte) val;
     val >>= 8;
-    b[0] = (byte)(val);
+    b[0] = (byte) val;
     return b;
   }
 
@@ -685,7 +705,7 @@ public class Bytes {
    * @return the short value
    */
   public static short toShort(byte[] bytes) {
-    return toShort(bytes, 0);
+    return toShort(bytes, 0, SIZEOF_SHORT);
   }
 
   /**
@@ -704,11 +724,12 @@ public class Bytes {
    * @param offset offset into array
    * @param length length, has to be {...@link #SIZEOF_SHORT}
    * @return the short value
+   * @throws IllegalArgumentException if length is not {...@link #SIZEOF_SHORT}
+   * or if there's not enough room in the array at the offset indicated.
    */
   public static short toShort(byte[] bytes, int offset, final int length) {
-    if (bytes == null || length != SIZEOF_SHORT ||
-        (offset + length > bytes.length)) {
-      return -1;
+    if (length != SIZEOF_SHORT || offset + length > bytes.length) {
+      throw explainWrongLengthOrOffset(bytes, offset, length, SIZEOF_SHORT);
     }
     short n = 0;
     n ^= bytes[offset] & 0xFF;
@@ -716,24 +737,27 @@ public class Bytes {
     n ^= bytes[offset+1] & 0xFF;
     return n;
   }
-  
+
   /**
    * Put a short value out to the specified byte array position.
    * @param bytes the byte array
    * @param offset position in the array
    * @param val short to write out
    * @return incremented offset
+   * @throws IllegalArgumentException if the byte array given doesn't have
+   * enough room at the offset specified.
    */
   public static int putShort(byte[] bytes, int offset, short val) {
-    if (bytes == null || (bytes.length - offset < SIZEOF_SHORT)) {
-      return offset;
+    if (bytes.length - offset < SIZEOF_SHORT) {
+      throw new IllegalArgumentException("Not enough room to put a short at"
+          + " offset " + offset + " in a " + bytes.length + " byte array");
     }
-    bytes[offset+1] = (byte)(val);
+    bytes[offset+1] = (byte) val;
     val >>= 8;
-    bytes[offset] = (byte)(val);
+    bytes[offset] = (byte) val;
     return offset + SIZEOF_SHORT;
   }
-  
+
   /**
    * @param vint Integer to make a vint of.
    * @return Vint as bytes array.
@@ -744,7 +768,7 @@ public class Bytes {
     byte [] result = new byte[size];
     int offset = 0;
     if (i >= -112 && i <= 127) {
-      result[offset] = ((byte)i);
+      result[offset] = (byte) i;
       return result;
     }
 
@@ -757,10 +781,10 @@ public class Bytes {
     long tmp = i;
     while (tmp != 0) {
       tmp = tmp >> 8;
-    len--;
+      len--;
     }
 
-    result[offset++] = (byte)len;
+    result[offset++] = (byte) len;
 
     len = (len < -120) ? -(len + 120) : -(len + 112);
 
@@ -789,7 +813,7 @@ public class Bytes {
       i = i << 8;
       i = i | (b & 0xFF);
     }
-    return (WritableUtils.isNegativeVInt(firstByte) ? (~i) : i);
+    return (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);
   }
 
   /**
@@ -812,7 +836,7 @@ public class Bytes {
       i = i << 8;
       i = i | (b & 0xFF);
     }
-    return (WritableUtils.isNegativeVInt(firstByte) ? (~i) : i);
+    return (WritableUtils.isNegativeVInt(firstByte) ? ~i : i);
   }
 
   /**
@@ -858,11 +882,13 @@ public class Bytes {
   public static boolean equals(final byte [] left, final byte [] right) {
     // Could use Arrays.equals?
     //noinspection SimplifiableConditionalExpression
-    return left == null && right == null? true:
-      (left == null || right == null || (left.length != right.length))? false:
-        compareTo(left, right) == 0;
+    if (left == null && right == null) {
+      return true;
+    }
+    return (left == null || right == null || (left.length != right.length)
+            ? false : compareTo(left, right) == 0);
   }
-  
+
   /**
    * @param b bytes to hash
    * @return Runs {...@link WritableComparator#hashBytes(byte[], int)} on the
@@ -925,14 +951,16 @@ public class Bytes {
     System.arraycopy(c, 0, result, a.length + b.length, c.length);
     return result;
   }
-  
+
   /**
    * @param a array
    * @param length amount of bytes to grab
    * @return First <code>length</code> bytes from <code>a</code>
    */
   public static byte [] head(final byte [] a, final int length) {
-    if(a.length < length) return null;
+    if (a.length < length) {
+      return null;
+    }
     byte [] result = new byte[length];
     System.arraycopy(a, 0, result, 0, length);
     return result;
@@ -944,7 +972,9 @@ public class Bytes {
    * @return Last <code>length</code> bytes from <code>a</code>
    */
   public static byte [] tail(final byte [] a, final int length) {
-    if(a.length < length) return null;
+    if (a.length < length) {
+      return null;
+    }
     byte [] result = new byte[length];
     System.arraycopy(a, a.length - length, result, 0, length);
     return result;
@@ -957,10 +987,12 @@ public class Bytes {
    */
   public static byte [] padHead(final byte [] a, final int length) {
     byte [] padding = new byte[length];
-    for(int i=0;i<length;i++) padding[i] = 0;
+    for (int i = 0; i < length; i++) {
+      padding[i] = 0;
+    }
     return add(padding,a);
   }
-  
+
   /**
    * @param a array
    * @param length new array size
@@ -968,10 +1000,12 @@ public class Bytes {
    */
   public static byte [] padTail(final byte [] a, final int length) {
     byte [] padding = new byte[length];
-    for(int i=0;i<length;i++) padding[i] = 0;
+    for (int i = 0; i < length; i++) {
+      padding[i] = 0;
+    }
     return add(a,padding);
   }
-  
+
   /**
    * Split passed range.  Expensive operation relatively.  Uses BigInteger 
math.
    * Useful splitting ranges for MapReduce jobs.
@@ -985,29 +1019,34 @@ public class Bytes {
     byte [] aPadded;
     byte [] bPadded;
     if (a.length < b.length) {
-      aPadded = padTail(a,b.length-a.length);
+      aPadded = padTail(a, b.length - a.length);
       bPadded = b;
     } else if (b.length < a.length) {
       aPadded = a;
-      bPadded = padTail(b,a.length-b.length);
+      bPadded = padTail(b, a.length - b.length);
     } else {
       aPadded = a;
       bPadded = b;
     }
-    if (compareTo(aPadded,bPadded) > 1) {
+    if (compareTo(aPadded, bPadded) > 1) {
       throw new IllegalArgumentException("b > a");
     }
-    if (num <= 0) throw new IllegalArgumentException("num cannot be < 0");
+    if (num <= 0) {
+      throw new IllegalArgumentException("num cannot be < 0");
+    }
     byte [] prependHeader = {1, 0};
     BigInteger startBI = new BigInteger(add(prependHeader, aPadded));
     BigInteger stopBI = new BigInteger(add(prependHeader, bPadded));
     BigInteger diffBI = stopBI.subtract(startBI);
     BigInteger splitsBI = BigInteger.valueOf(num + 1);
-    if(diffBI.compareTo(splitsBI) <= 0) return null;
+    if(diffBI.compareTo(splitsBI) <= 0) {
+      return null;
+    }
     BigInteger intervalBI;
     try {
       intervalBI = diffBI.divide(splitsBI);
     } catch(Exception e) {
+      LOG.error("Exception caught during division", e);
       return null;
     }
 
@@ -1018,15 +1057,15 @@ public class Bytes {
       BigInteger curBI = 
startBI.add(intervalBI.multiply(BigInteger.valueOf(i)));
       byte [] padded = curBI.toByteArray();
       if (padded[1] == 0)
-        padded = tail(padded,padded.length-2);
+        padded = tail(padded, padded.length - 2);
       else
-        padded = tail(padded,padded.length-1);
+        padded = tail(padded, padded.length - 1);
       result[i] = padded;
     }
     result[num+1] = b;
     return result;
   }
-  
+
   /**
    * @param t operands
    * @return Array of byte arrays made from passed array of Text
@@ -1047,7 +1086,7 @@ public class Bytes {
   public static byte [][] toByteArrays(final String column) {
     return toByteArrays(toBytes(column));
   }
-  
+
   /**
    * @param column operand
    * @return A byte array of a byte array where first and only entry is
@@ -1058,7 +1097,7 @@ public class Bytes {
     result[0] = column;
     return result;
   }
-  
+
   /**
    * Binary search for keys in indexes.
    * @param arr array of byte arrays to search for
@@ -1072,7 +1111,7 @@ public class Bytes {
       int length, RawComparator<byte []> comparator) {
     int low = 0;
     int high = arr.length - 1;
-    
+
     while (low <= high) {
       int mid = (low+high) >>> 1;
       // we have to compare in this order, because the comparator order
@@ -1086,7 +1125,7 @@ public class Bytes {
       else if (cmp < 0)
         high = mid - 1;
       // BAM. how often does this really happen?
-      else 
+      else
         return mid;
     }
     return - (low+1);
@@ -1095,13 +1134,13 @@ public class Bytes {
   /**
    * Bytewise binary increment/deincrement of long contained in byte array
    * on given amount.
-   * 
+   *
    * @param value - array of bytes containing long (length <= SIZEOF_LONG)
    * @param amount value will be incremented on (deincremented if negative)
    * @return array of bytes containing incremented long (length == SIZEOF_LONG)
    * @throws IOException - if value.length > SIZEOF_LONG
    */
-  public static byte [] incrementBytes(byte[] value, long amount) 
+  public static byte [] incrementBytes(byte[] value, long amount)
   throws IOException {
     byte[] val = value;
     if (val.length < SIZEOF_LONG) {
@@ -1133,7 +1172,7 @@ public class Bytes {
     if (amount < 0) {
       amo = -amount;
       sign = -1;
-    } 
+    }
     for(int i=0;i<value.length;i++) {
       int cur = ((int)amo % 256) * sign;
       amo = (amo >> 8);
@@ -1175,5 +1214,5 @@ public class Bytes {
     }
     return value;
   }
-  
+
 }


Reply via email to