You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2014/09/15 20:08:31 UTC

git commit: HBASE-11862 Get rid of Writables in HTableDescriptor, HColumnDescriptor (Andrey Stepachev)

Repository: hbase
Updated Branches:
  refs/heads/master 3cc5d1903 -> 555469287


HBASE-11862 Get rid of Writables in HTableDescriptor, HColumnDescriptor (Andrey Stepachev)


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/55546928
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/55546928
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/55546928

Branch: refs/heads/master
Commit: 5554692871986b0e46c1b97ac3a8eb0945e3705b
Parents: 3cc5d19
Author: stack <st...@apache.org>
Authored: Mon Sep 15 11:08:21 2014 -0700
Committer: stack <st...@apache.org>
Committed: Mon Sep 15 11:08:21 2014 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hbase/HColumnDescriptor.java  | 152 ++-----------
 .../org/apache/hadoop/hbase/HRegionInfo.java    | 130 +----------
 .../apache/hadoop/hbase/HTableDescriptor.java   | 223 ++++++-------------
 .../hadoop/hbase/CompoundConfiguration.java     |  18 +-
 .../org/apache/hadoop/hbase/util/Bytes.java     | 201 ++++++++++++++++-
 .../hadoop/hbase/TestCompoundConfiguration.java |  21 +-
 .../hadoop/hbase/constraint/Constraints.java    |   9 +-
 .../hadoop/hbase/regionserver/HRegion.java      |   2 +-
 .../hadoop/hbase/regionserver/HStore.java       |   2 +-
 .../regionserver/RegionCoprocessorHost.java     |  12 +-
 .../hbase/rest/model/TableSchemaModel.java      |   7 +-
 .../hbase/snapshot/RestoreSnapshotHelper.java   |   4 +-
 .../apache/hadoop/hbase/TestSerialization.java  |   5 +-
 .../hadoop/hbase/thrift/ThriftServerRunner.java |   5 +-
 14 files changed, 324 insertions(+), 467 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java
index a9586b0..0d3ead0 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HColumnDescriptor.java
@@ -18,19 +18,17 @@
  */
 package org.apache.hadoop.hbase;
 
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 
+import com.google.common.base.Preconditions;
+import com.google.protobuf.InvalidProtocolBufferException;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.io.compress.Compression;
 import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;
 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
@@ -38,15 +36,10 @@ import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.BytesBytesPair;
 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.ColumnFamilySchema;
 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.NameStringPair;
 import org.apache.hadoop.hbase.regionserver.BloomType;
+import org.apache.hadoop.hbase.util.ByteStringer;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.PrettyPrinter;
 import org.apache.hadoop.hbase.util.PrettyPrinter.Unit;
-import org.apache.hadoop.io.Text;
-import org.apache.hadoop.io.WritableComparable;
-
-import com.google.common.base.Preconditions;
-import org.apache.hadoop.hbase.util.ByteStringer;
-import com.google.protobuf.InvalidProtocolBufferException;
 
 /**
  * An HColumnDescriptor contains information about a column family such as the
@@ -56,7 +49,7 @@ import com.google.protobuf.InvalidProtocolBufferException;
  */
 @InterfaceAudience.Public
 @InterfaceStability.Evolving
-public class HColumnDescriptor implements WritableComparable<HColumnDescriptor> {
+public class HColumnDescriptor implements Comparable<HColumnDescriptor> {
   // For future backward compatibility
 
   // Version  3 was when column names become byte arrays and when we picked up
@@ -235,8 +228,9 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
 
   private final static Map<String, String> DEFAULT_VALUES
     = new HashMap<String, String>();
-  private final static Set<ImmutableBytesWritable> RESERVED_KEYWORDS
-    = new HashSet<ImmutableBytesWritable>();
+  private final static Set<Bytes> RESERVED_KEYWORDS
+      = new HashSet<Bytes>();
+
   static {
       DEFAULT_VALUES.put(BLOOMFILTER, DEFAULT_BLOOMFILTER);
       DEFAULT_VALUES.put(REPLICATION_SCOPE, String.valueOf(DEFAULT_REPLICATION_SCOPE));
@@ -256,10 +250,10 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
       DEFAULT_VALUES.put(EVICT_BLOCKS_ON_CLOSE, String.valueOf(DEFAULT_EVICT_BLOCKS_ON_CLOSE));
       DEFAULT_VALUES.put(PREFETCH_BLOCKS_ON_OPEN, String.valueOf(DEFAULT_PREFETCH_BLOCKS_ON_OPEN));
       for (String s : DEFAULT_VALUES.keySet()) {
-        RESERVED_KEYWORDS.add(new ImmutableBytesWritable(Bytes.toBytes(s)));
+        RESERVED_KEYWORDS.add(new Bytes(Bytes.toBytes(s)));
       }
-      RESERVED_KEYWORDS.add(new ImmutableBytesWritable(Bytes.toBytes(ENCRYPTION)));
-      RESERVED_KEYWORDS.add(new ImmutableBytesWritable(Bytes.toBytes(ENCRYPTION_KEY)));
+    RESERVED_KEYWORDS.add(new Bytes(Bytes.toBytes(ENCRYPTION)));
+    RESERVED_KEYWORDS.add(new Bytes(Bytes.toBytes(ENCRYPTION_KEY)));
   }
 
   private static final int UNINITIALIZED = -1;
@@ -268,8 +262,8 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
   private byte [] name;
 
   // Column metadata
-  private final Map<ImmutableBytesWritable, ImmutableBytesWritable> values =
-    new HashMap<ImmutableBytesWritable,ImmutableBytesWritable>();
+  private final Map<Bytes, Bytes> values =
+      new HashMap<Bytes, Bytes>();
 
   /**
    * A map which holds the configuration specific to the column family.
@@ -328,7 +322,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
   public HColumnDescriptor(HColumnDescriptor desc) {
     super();
     this.name = desc.name.clone();
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e :
         desc.values.entrySet()) {
       this.values.put(e.getKey(), e.getValue());
     }
@@ -522,7 +516,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
    * @return The value.
    */
   public byte[] getValue(byte[] key) {
-    ImmutableBytesWritable ibw = values.get(new ImmutableBytesWritable(key));
+    Bytes ibw = values.get(new Bytes(key));
     if (ibw == null)
       return null;
     return ibw.get();
@@ -542,7 +536,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
   /**
    * @return All values.
    */
-  public Map<ImmutableBytesWritable,ImmutableBytesWritable> getValues() {
+  public Map<Bytes, Bytes> getValues() {
     // shallow pointer copy
     return Collections.unmodifiableMap(values);
   }
@@ -553,8 +547,8 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
    * @return this (for chained invocation)
    */
   public HColumnDescriptor setValue(byte[] key, byte[] value) {
-    values.put(new ImmutableBytesWritable(key),
-      new ImmutableBytesWritable(value));
+    values.put(new Bytes(key),
+        new Bytes(value));
     return this;
   }
 
@@ -562,7 +556,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
    * @param key Key whose key and value we're to remove from HCD parameters.
    */
   public void remove(final byte [] key) {
-    values.remove(new ImmutableBytesWritable(key));
+    values.remove(new Bytes(key));
   }
 
   /**
@@ -1022,7 +1016,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
     boolean hasConfigKeys = false;
 
     // print all reserved keys first
-    for (ImmutableBytesWritable k : values.keySet()) {
+    for (Bytes k : values.keySet()) {
       if (!RESERVED_KEYWORDS.contains(k)) {
         hasConfigKeys = true;
         continue;
@@ -1045,7 +1039,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
       s.append(HConstants.METADATA).append(" => ");
       s.append('{');
       boolean printComma = false;
-      for (ImmutableBytesWritable k : values.keySet()) {
+      for (Bytes k : values.keySet()) {
         if (RESERVED_KEYWORDS.contains(k)) {
           continue;
         }
@@ -1123,111 +1117,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
     return result;
   }
 
-  /**
-   * @deprecated Writables are going away.  Use pb {@link #parseFrom(byte[])} instead.
-   */
-  @Deprecated
-  public void readFields(DataInput in) throws IOException {
-    int version = in.readByte();
-    if (version < 6) {
-      if (version <= 2) {
-        Text t = new Text();
-        t.readFields(in);
-        this.name = t.getBytes();
-//        if(KeyValue.getFamilyDelimiterIndex(this.name, 0, this.name.length)
-//            > 0) {
-//          this.name = stripColon(this.name);
-//        }
-      } else {
-        this.name = Bytes.readByteArray(in);
-      }
-      this.values.clear();
-      setMaxVersions(in.readInt());
-      int ordinal = in.readInt();
-      setCompressionType(Compression.Algorithm.values()[ordinal]);
-      setInMemory(in.readBoolean());
-      setBloomFilterType(in.readBoolean() ? BloomType.ROW : BloomType.NONE);
-      if (getBloomFilterType() != BloomType.NONE && version < 5) {
-        // If a bloomFilter is enabled and the column descriptor is less than
-        // version 5, we need to skip over it to read the rest of the column
-        // descriptor. There are no BloomFilterDescriptors written to disk for
-        // column descriptors with a version number >= 5
-        throw new UnsupportedClassVersionError(this.getClass().getName() +
-            " does not support backward compatibility with versions older " +
-            "than version 5");
-      }
-      if (version > 1) {
-        setBlockCacheEnabled(in.readBoolean());
-      }
-      if (version > 2) {
-       setTimeToLive(in.readInt());
-      }
-    } else {
-      // version 6+
-      this.name = Bytes.readByteArray(in);
-      this.values.clear();
-      int numValues = in.readInt();
-      for (int i = 0; i < numValues; i++) {
-        ImmutableBytesWritable key = new ImmutableBytesWritable();
-        ImmutableBytesWritable value = new ImmutableBytesWritable();
-        key.readFields(in);
-        value.readFields(in);
-
-        // in version 8, the BloomFilter setting changed from bool to enum
-        if (version < 8 && Bytes.toString(key.get()).equals(BLOOMFILTER)) {
-          value.set(Bytes.toBytes(
-              Boolean.getBoolean(Bytes.toString(value.get()))
-                ? BloomType.ROW.toString()
-                : BloomType.NONE.toString()));
-        }
-
-        values.put(key, value);
-      }
-      if (version == 6) {
-        // Convert old values.
-        setValue(COMPRESSION, Compression.Algorithm.NONE.getName());
-      }
-      String value = getValue(HConstants.VERSIONS);
-      this.cachedMaxVersions = (value != null)?
-          Integer.valueOf(value).intValue(): DEFAULT_VERSIONS;
-      if (version > 10) {
-        configuration.clear();
-        int numConfigs = in.readInt();
-        for (int i = 0; i < numConfigs; i++) {
-          ImmutableBytesWritable key = new ImmutableBytesWritable();
-          ImmutableBytesWritable val = new ImmutableBytesWritable();
-          key.readFields(in);
-          val.readFields(in);
-          configuration.put(
-            Bytes.toString(key.get(), key.getOffset(), key.getLength()),
-            Bytes.toString(val.get(), val.getOffset(), val.getLength()));
-        }
-      }
-    }
-  }
-
-  /**
-   * @deprecated Writables are going away.  Use {@link #toByteArray()} instead.
-   */
-  @Deprecated
-  public void write(DataOutput out) throws IOException {
-    out.writeByte(COLUMN_DESCRIPTOR_VERSION);
-    Bytes.writeByteArray(out, this.name);
-    out.writeInt(values.size());
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
-        values.entrySet()) {
-      e.getKey().write(out);
-      e.getValue().write(out);
-    }
-    out.writeInt(configuration.size());
-    for (Map.Entry<String, String> e : configuration.entrySet()) {
-      new ImmutableBytesWritable(Bytes.toBytes(e.getKey())).write(out);
-      new ImmutableBytesWritable(Bytes.toBytes(e.getValue())).write(out);
-    }
-  }
-
   // Comparable
-
   public int compareTo(HColumnDescriptor o) {
     int result = Bytes.compareTo(this.name, o.getName());
     if (result == 0) {
@@ -1300,7 +1190,7 @@ public class HColumnDescriptor implements WritableComparable<HColumnDescriptor>
   public ColumnFamilySchema convert() {
     ColumnFamilySchema.Builder builder = ColumnFamilySchema.newBuilder();
     builder.setName(ByteStringer.wrap(getName()));
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e: this.values.entrySet()) {
+    for (Map.Entry<Bytes, Bytes> e : this.values.entrySet()) {
       BytesBytesPair.Builder aBuilder = BytesBytesPair.newBuilder();
       aBuilder.setFirst(ByteStringer.wrap(e.getKey().get()));
       aBuilder.setSecond(ByteStringer.wrap(e.getValue().get()));

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
index 5518f3a..5acfe58 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HRegionInfo.java
@@ -80,30 +80,7 @@ import com.google.protobuf.InvalidProtocolBufferException;
 @InterfaceAudience.Public
 @InterfaceStability.Evolving
 public class HRegionInfo implements Comparable<HRegionInfo> {
-  /*
-   * There are two versions associated with HRegionInfo: HRegionInfo.VERSION and
-   * HConstants.META_VERSION. HRegionInfo.VERSION indicates the data structure's versioning
-   * while HConstants.META_VERSION indicates the versioning of the serialized HRIs stored in
-   * the hbase:meta table.
-   *
-   * Pre-0.92:
-   *   HRI.VERSION == 0 and HConstants.META_VERSION does not exist (is not stored at hbase:meta table)
-   *   HRegionInfo had an HTableDescriptor reference inside it.
-   *   HRegionInfo is serialized as Writable to hbase:meta table.
-   * For 0.92.x and 0.94.x:
-   *   HRI.VERSION == 1 and HConstants.META_VERSION == 0
-   *   HRI no longer has HTableDescriptor in it.
-   *   HRI is serialized as Writable to hbase:meta table.
-   * For 0.96.x:
-   *   HRI.VERSION == 1 and HConstants.META_VERSION == 1
-   *   HRI data structure is the same as 0.92 and 0.94
-   *   HRI is serialized as PB to hbase:meta table.
-   *
-   * Versioning of HRegionInfo is deprecated. HRegionInfo does protobuf
-   * serialization using RegionInfo class, which has it's own versioning.
-   */
-  @Deprecated
-  public static final byte VERSION = 1;
+
   private static final Log LOG = LogFactory.getLog(HRegionInfo.class);
 
   /**
@@ -829,86 +806,6 @@ public class HRegionInfo implements Comparable<HRegionInfo> {
     return this.hashCode;
   }
 
-  /** @return the object version number
-   * @deprecated HRI is no longer a VersionedWritable */
-  @Deprecated
-  public byte getVersion() {
-    return VERSION;
-  }
-
-  /**
-   * @deprecated Use protobuf serialization instead.  See {@link #toByteArray()} and
-   * {@link #toDelimitedByteArray()}
-   */
-  @Deprecated
-  public void write(DataOutput out) throws IOException {
-    out.writeByte(getVersion());
-    Bytes.writeByteArray(out, endKey);
-    out.writeBoolean(offLine);
-    out.writeLong(regionId);
-    Bytes.writeByteArray(out, regionName);
-    out.writeBoolean(split);
-    Bytes.writeByteArray(out, startKey);
-    Bytes.writeByteArray(out, tableName.getName());
-    out.writeInt(hashCode);
-  }
-
-  /**
-   * @deprecated Use protobuf deserialization instead.
-   * @see #parseFrom(byte[])
-   */
-  @Deprecated
-  public void readFields(DataInput in) throws IOException {
-    // Read the single version byte.  We don't ask the super class do it
-    // because freaks out if its not the current classes' version.  This method
-    // can deserialize version 0 and version 1 of HRI.
-    byte version = in.readByte();
-    if (version == 0) {
-      // This is the old HRI that carried an HTD.  Migrate it.  The below
-      // was copied from the old 0.90 HRI readFields.
-      this.endKey = Bytes.readByteArray(in);
-      this.offLine = in.readBoolean();
-      this.regionId = in.readLong();
-      this.regionName = Bytes.readByteArray(in);
-      this.split = in.readBoolean();
-      this.startKey = Bytes.readByteArray(in);
-      try {
-        HTableDescriptor htd = new HTableDescriptor();
-        htd.readFields(in);
-        this.tableName = htd.getTableName();
-      } catch(EOFException eofe) {
-         throw new IOException("HTD not found in input buffer", eofe);
-      }
-      this.hashCode = in.readInt();
-    } else if (getVersion() == version) {
-      this.endKey = Bytes.readByteArray(in);
-      this.offLine = in.readBoolean();
-      this.regionId = in.readLong();
-      this.regionName = Bytes.readByteArray(in);
-      this.split = in.readBoolean();
-      this.startKey = Bytes.readByteArray(in);
-      this.tableName = TableName.valueOf(Bytes.readByteArray(in));
-      this.hashCode = in.readInt();
-    } else {
-      throw new IOException("Non-migratable/unknown version=" + getVersion());
-    }
-  }
-
-  @Deprecated
-  private void readFields(byte[] bytes, int offset, int len) throws IOException {
-    if (bytes == null || len <= 0) {
-      throw new IllegalArgumentException("Can't build a writable with empty " +
-          "bytes array");
-    }
-    DataInputBuffer in = new DataInputBuffer();
-    try {
-      in.reset(bytes, offset, len);
-      this.readFields(in);
-    } finally {
-      in.close();
-    }
-  }
-
   //
   // Comparable
   //
@@ -1106,13 +1003,7 @@ public class HRegionInfo implements Comparable<HRegionInfo> {
         throw new DeserializationException(e);
       }
     } else {
-      try {
-        HRegionInfo hri = new HRegionInfo();
-        hri.readFields(bytes, offset, len);
-        return hri;
-      } catch (IOException e) {
-        throw new DeserializationException(e);
-      }
+      throw new DeserializationException("PB encoded HRegionInfo expected");
     }
   }
 
@@ -1354,25 +1245,12 @@ public class HRegionInfo implements Comparable<HRegionInfo> {
     if (in.markSupported()) { //read it with mark()
       in.mark(pblen);
     }
-    int read = in.read(pbuf); //assumption: if Writable serialization, it should be longer than pblen.
+    int read = in.read(pbuf); //assumption: it should be longer than pblen.
     if (read != pblen) throw new IOException("read=" + read + ", wanted=" + pblen);
     if (ProtobufUtil.isPBMagicPrefix(pbuf)) {
       return convert(HBaseProtos.RegionInfo.parseDelimitedFrom(in));
     } else {
-        // Presume Writables.  Need to reset the stream since it didn't start w/ pb.
-      if (in.markSupported()) {
-        in.reset();
-        HRegionInfo hri = new HRegionInfo();
-        hri.readFields(in);
-        return hri;
-      } else {
-        //we cannot use BufferedInputStream, it consumes more than we read from the underlying IS
-        ByteArrayInputStream bais = new ByteArrayInputStream(pbuf);
-        SequenceInputStream sis = new SequenceInputStream(bais, in); //concatenate input streams
-        HRegionInfo hri = new HRegionInfo();
-        hri.readFields(new DataInputStream(sis));
-        return hri;
-      }
+      throw new IOException("PB encoded HRegionInfo expected");
     }
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
index 99fe157..0e9e25c 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/HTableDescriptor.java
@@ -18,8 +18,7 @@
  */
 package org.apache.hadoop.hbase;
 
-import java.io.DataInput;
-import java.io.DataOutput;
+import javax.annotation.Nonnull;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -34,7 +33,7 @@ import java.util.TreeMap;
 import java.util.TreeSet;
 import java.util.regex.Matcher;
 
-import org.apache.hadoop.hbase.util.ByteStringer;
+import com.google.protobuf.InvalidProtocolBufferException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.classification.InterfaceAudience;
@@ -42,7 +41,6 @@ import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.client.Durability;
 import org.apache.hadoop.hbase.exceptions.DeserializationException;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.BytesBytesPair;
 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.ColumnFamilySchema;
@@ -50,11 +48,8 @@ import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.NameStringPair;
 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.TableSchema;
 import org.apache.hadoop.hbase.regionserver.BloomType;
 import org.apache.hadoop.hbase.security.User;
+import org.apache.hadoop.hbase.util.ByteStringer;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.Writables;
-import org.apache.hadoop.io.WritableComparable;
-
-import com.google.protobuf.InvalidProtocolBufferException;
 
 /**
  * HTableDescriptor contains the details about an HBase table  such as the descriptors of
@@ -64,20 +59,10 @@ import com.google.protobuf.InvalidProtocolBufferException;
  */
 @InterfaceAudience.Public
 @InterfaceStability.Evolving
-public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
+public class HTableDescriptor implements Comparable<HTableDescriptor> {
 
   private static final Log LOG = LogFactory.getLog(HTableDescriptor.class);
 
-  /**
-   *  Changes prior to version 3 were not recorded here.
-   *  Version 3 adds metadata as a map where keys and values are byte[].
-   *  Version 4 adds indexes
-   *  Version 5 removed transactional pollution -- e.g. indexes
-   *  Version 6 changed metadata to BytesBytesPair in PB
-   *  Version 7 adds table-level configuration
-   */
-  private static final byte TABLE_DESCRIPTOR_VERSION = 7;
-
   private TableName name = null;
 
   /**
@@ -85,8 +70,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * includes values like IS_ROOT, IS_META, DEFERRED_LOG_FLUSH, SPLIT_POLICY,
    * MAX_FILE_SIZE, READONLY, MEMSTORE_FLUSHSIZE etc...
    */
-  private final Map<ImmutableBytesWritable, ImmutableBytesWritable> values =
-    new HashMap<ImmutableBytesWritable, ImmutableBytesWritable>();
+  private final Map<Bytes, Bytes> values =
+      new HashMap<Bytes, Bytes>();
 
   /**
    * A map which holds the configuration specific to the table.
@@ -105,12 +90,12 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #getMaxFileSize()
    */
   public static final String MAX_FILESIZE = "MAX_FILESIZE";
-  private static final ImmutableBytesWritable MAX_FILESIZE_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(MAX_FILESIZE));
+  private static final Bytes MAX_FILESIZE_KEY =
+      new Bytes(Bytes.toBytes(MAX_FILESIZE));
 
   public static final String OWNER = "OWNER";
-  public static final ImmutableBytesWritable OWNER_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(OWNER));
+  public static final Bytes OWNER_KEY =
+      new Bytes(Bytes.toBytes(OWNER));
 
   /**
    * <em>INTERNAL</em> Used by rest interface to access this metadata
@@ -119,8 +104,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #isReadOnly()
    */
   public static final String READONLY = "READONLY";
-  private static final ImmutableBytesWritable READONLY_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(READONLY));
+  private static final Bytes READONLY_KEY =
+      new Bytes(Bytes.toBytes(READONLY));
 
   /**
    * <em>INTERNAL</em> Used by HBase Shell interface to access this metadata
@@ -129,8 +114,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #isCompactionEnabled()
    */
   public static final String COMPACTION_ENABLED = "COMPACTION_ENABLED";
-  private static final ImmutableBytesWritable COMPACTION_ENABLED_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(COMPACTION_ENABLED));
+  private static final Bytes COMPACTION_ENABLED_KEY =
+      new Bytes(Bytes.toBytes(COMPACTION_ENABLED));
 
   /**
    * <em>INTERNAL</em> Used by HBase Shell interface to access this metadata
@@ -140,8 +125,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #getMemStoreFlushSize()
    */
   public static final String MEMSTORE_FLUSHSIZE = "MEMSTORE_FLUSHSIZE";
-  private static final ImmutableBytesWritable MEMSTORE_FLUSHSIZE_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(MEMSTORE_FLUSHSIZE));
+  private static final Bytes MEMSTORE_FLUSHSIZE_KEY =
+      new Bytes(Bytes.toBytes(MEMSTORE_FLUSHSIZE));
 
   /**
    * <em>INTERNAL</em> Used by rest interface to access this metadata
@@ -150,8 +135,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #isRootRegion()
    */
   public static final String IS_ROOT = "IS_ROOT";
-  private static final ImmutableBytesWritable IS_ROOT_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(IS_ROOT));
+  private static final Bytes IS_ROOT_KEY =
+      new Bytes(Bytes.toBytes(IS_ROOT));
 
   /**
    * <em>INTERNAL</em> Used by rest interface to access this metadata
@@ -161,8 +146,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #isMetaRegion()
    */
   public static final String IS_META = "IS_META";
-  private static final ImmutableBytesWritable IS_META_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(IS_META));
+  private static final Bytes IS_META_KEY =
+      new Bytes(Bytes.toBytes(IS_META));
 
   /**
    * <em>INTERNAL</em> Used by HBase Shell interface to access this metadata
@@ -172,22 +157,22 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
   @Deprecated
   public static final String DEFERRED_LOG_FLUSH = "DEFERRED_LOG_FLUSH";
   @Deprecated
-  private static final ImmutableBytesWritable DEFERRED_LOG_FLUSH_KEY =
-    new ImmutableBytesWritable(Bytes.toBytes(DEFERRED_LOG_FLUSH));
+  private static final Bytes DEFERRED_LOG_FLUSH_KEY =
+      new Bytes(Bytes.toBytes(DEFERRED_LOG_FLUSH));
 
   /**
    * <em>INTERNAL</em> {@link Durability} setting for the table.
    */
   public static final String DURABILITY = "DURABILITY";
-  private static final ImmutableBytesWritable DURABILITY_KEY =
-      new ImmutableBytesWritable(Bytes.toBytes("DURABILITY"));
+  private static final Bytes DURABILITY_KEY =
+      new Bytes(Bytes.toBytes("DURABILITY"));
 
   /**
    * <em>INTERNAL</em> number of region replicas for the table.
    */
   public static final String REGION_REPLICATION = "REGION_REPLICATION";
-  private static final ImmutableBytesWritable REGION_REPLICATION_KEY =
-      new ImmutableBytesWritable(Bytes.toBytes(REGION_REPLICATION));
+  private static final Bytes REGION_REPLICATION_KEY =
+      new Bytes(Bytes.toBytes(REGION_REPLICATION));
 
   /** Default durability for HTD is USE_DEFAULT, which defaults to HBase-global default value */
   private static final Durability DEFAULT_DURABLITY = Durability.USE_DEFAULT;
@@ -197,11 +182,11 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    *  replace booleans being saved as Strings with plain booleans.  Need a
    *  migration script to do this.  TODO.
    */
-  private static final ImmutableBytesWritable FALSE =
-    new ImmutableBytesWritable(Bytes.toBytes(Boolean.FALSE.toString()));
+  private static final Bytes FALSE =
+      new Bytes(Bytes.toBytes(Boolean.FALSE.toString()));
 
-  private static final ImmutableBytesWritable TRUE =
-    new ImmutableBytesWritable(Bytes.toBytes(Boolean.TRUE.toString()));
+  private static final Bytes TRUE =
+      new Bytes(Bytes.toBytes(Boolean.TRUE.toString()));
 
   private static final boolean DEFAULT_DEFERRED_LOG_FLUSH = false;
 
@@ -225,8 +210,9 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
 
   private final static Map<String, String> DEFAULT_VALUES
     = new HashMap<String, String>();
-  private final static Set<ImmutableBytesWritable> RESERVED_KEYWORDS
-    = new HashSet<ImmutableBytesWritable>();
+  private final static Set<Bytes> RESERVED_KEYWORDS
+      = new HashSet<Bytes>();
+
   static {
     DEFAULT_VALUES.put(MAX_FILESIZE,
         String.valueOf(HConstants.DEFAULT_MAX_FILE_SIZE));
@@ -238,7 +224,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     DEFAULT_VALUES.put(DURABILITY, DEFAULT_DURABLITY.name()); //use the enum name
     DEFAULT_VALUES.put(REGION_REPLICATION, String.valueOf(DEFAULT_REGION_REPLICATION));
     for (String s : DEFAULT_VALUES.keySet()) {
-      RESERVED_KEYWORDS.add(new ImmutableBytesWritable(Bytes.toBytes(s)));
+      RESERVED_KEYWORDS.add(new Bytes(Bytes.toBytes(s)));
     }
     RESERVED_KEYWORDS.add(IS_ROOT_KEY);
     RESERVED_KEYWORDS.add(IS_META_KEY);
@@ -280,12 +266,12 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * catalog tables, <code>hbase:meta</code> and <code>-ROOT-</code>.
    */
   protected HTableDescriptor(final TableName name, HColumnDescriptor[] families,
-      Map<ImmutableBytesWritable,ImmutableBytesWritable> values) {
+      Map<Bytes, Bytes> values) {
     setName(name);
     for(HColumnDescriptor descriptor : families) {
       this.families.put(descriptor.getName(), descriptor);
     }
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry:
+    for (Map.Entry<Bytes, Bytes> entry :
         values.entrySet()) {
       setValue(entry.getKey(), entry.getValue());
     }
@@ -345,7 +331,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     for (HColumnDescriptor c: desc.families.values()) {
       this.families.put(c.getName(), new HColumnDescriptor(c));
     }
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e :
         desc.values.entrySet()) {
       setValue(e.getKey(), e.getValue());
     }
@@ -409,7 +395,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     return (value != null)? Boolean.valueOf(Bytes.toString(value)): Boolean.FALSE;
   }
 
-  private boolean isSomething(final ImmutableBytesWritable key,
+  private boolean isSomething(final Bytes key,
       final boolean valueIfNull) {
     byte [] value = getValue(key);
     if (value != null) {
@@ -447,11 +433,11 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #values
    */
   public byte[] getValue(byte[] key) {
-    return getValue(new ImmutableBytesWritable(key));
+    return getValue(new Bytes(key));
   }
 
-  private byte[] getValue(final ImmutableBytesWritable key) {
-    ImmutableBytesWritable ibw = values.get(key);
+  private byte[] getValue(final Bytes key) {
+    Bytes ibw = values.get(key);
     if (ibw == null)
       return null;
     return ibw.get();
@@ -477,7 +463,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @return unmodifiable map {@link #values}.
    * @see #values
    */
-  public Map<ImmutableBytesWritable,ImmutableBytesWritable> getValues() {
+  public Map<Bytes, Bytes> getValues() {
     // shallow pointer copy
     return Collections.unmodifiableMap(values);
   }
@@ -490,16 +476,16 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @see #values
    */
   public void setValue(byte[] key, byte[] value) {
-    setValue(new ImmutableBytesWritable(key), new ImmutableBytesWritable(value));
+    setValue(new Bytes(key), new Bytes(value));
   }
 
   /*
    * @param key The key.
    * @param value The value.
    */
-  private void setValue(final ImmutableBytesWritable key,
+  private void setValue(final Bytes key,
       final String value) {
-    setValue(key, new ImmutableBytesWritable(Bytes.toBytes(value)));
+    setValue(key, new Bytes(Bytes.toBytes(value)));
   }
 
   /*
@@ -508,8 +494,8 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @param key The key.
    * @param value The value.
    */
-  public void setValue(final ImmutableBytesWritable key,
-      final ImmutableBytesWritable value) {
+  public void setValue(final Bytes key,
+      final Bytes value) {
     if (key.compareTo(DEFERRED_LOG_FLUSH_KEY) == 0) {
       boolean isDeferredFlush = Boolean.valueOf(Bytes.toString(value.get()));
       LOG.warn("HTableDescriptor property:" + DEFERRED_LOG_FLUSH + " is deprecated, " +
@@ -542,7 +528,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * parameters.
    */
   public void remove(final String key) {
-    remove(new ImmutableBytesWritable(Bytes.toBytes(key)));
+    remove(new Bytes(Bytes.toBytes(key)));
   }
 
   /**
@@ -551,7 +537,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @param key Key whose key and value we're to remove from HTableDescriptor
    * parameters.
    */
-  public void remove(ImmutableBytesWritable key) {
+  public void remove(Bytes key) {
     values.remove(key);
   }
 
@@ -562,7 +548,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * parameters.
    */
   public void remove(final byte [] key) {
-    remove(new ImmutableBytesWritable(key));
+    remove(new Bytes(key));
   }
 
   /**
@@ -817,9 +803,9 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     StringBuilder s = new StringBuilder();
 
     // step 1: set partitioning and pruning
-    Set<ImmutableBytesWritable> reservedKeys = new TreeSet<ImmutableBytesWritable>();
-    Set<ImmutableBytesWritable> userKeys = new TreeSet<ImmutableBytesWritable>();
-    for (ImmutableBytesWritable k : values.keySet()) {
+    Set<Bytes> reservedKeys = new TreeSet<Bytes>();
+    Set<Bytes> userKeys = new TreeSet<Bytes>();
+    for (Bytes k : values.keySet()) {
       if (k == null || k.get() == null) continue;
       String key = Bytes.toString(k.get());
       // in this section, print out reserved keywords + coprocessor info
@@ -851,7 +837,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
 
       // print all reserved keys first
       boolean printCommaForAttr = false;
-      for (ImmutableBytesWritable k : reservedKeys) {
+      for (Bytes k : reservedKeys) {
         String key = Bytes.toString(k.get());
         String value = Bytes.toStringBinary(values.get(k).get());
         if (printCommaForAttr) s.append(", ");
@@ -868,7 +854,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
         s.append(HConstants.METADATA).append(" => ");
         s.append("{");
         boolean printCommaForCfg = false;
-        for (ImmutableBytesWritable k : userKeys) {
+        for (Bytes k : userKeys) {
           String key = Bytes.toString(k.get());
           String value = Bytes.toStringBinary(values.get(k).get());
           if (printCommaForCfg) s.append(", ");
@@ -931,8 +917,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
   @Override
   public int hashCode() {
     int result = this.name.hashCode();
-    result ^= Byte.valueOf(TABLE_DESCRIPTOR_VERSION).hashCode();
-    if (this.families != null && this.families.size() > 0) {
+    if (this.families.size() > 0) {
       for (HColumnDescriptor e: this.families.values()) {
         result ^= e.hashCode();
       }
@@ -942,84 +927,6 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     return result;
   }
 
-  /**
-   * <em> INTERNAL </em> This method is a part of {@link WritableComparable} interface
-   * and is used for de-serialization of the HTableDescriptor over RPC
-   * @deprecated Writables are going away.  Use pb {@link #parseFrom(byte[])} instead.
-   */
-  @Deprecated
-  @Override
-  public void readFields(DataInput in) throws IOException {
-    int version = in.readInt();
-    if (version < 3)
-      throw new IOException("versions < 3 are not supported (and never existed!?)");
-    // version 3+
-    name = TableName.valueOf(Bytes.readByteArray(in));
-    setRootRegion(in.readBoolean());
-    setMetaRegion(in.readBoolean());
-    values.clear();
-    configuration.clear();
-    int numVals = in.readInt();
-    for (int i = 0; i < numVals; i++) {
-      ImmutableBytesWritable key = new ImmutableBytesWritable();
-      ImmutableBytesWritable value = new ImmutableBytesWritable();
-      key.readFields(in);
-      value.readFields(in);
-      setValue(key, value);
-    }
-    families.clear();
-    int numFamilies = in.readInt();
-    for (int i = 0; i < numFamilies; i++) {
-      HColumnDescriptor c = new HColumnDescriptor();
-      c.readFields(in);
-      families.put(c.getName(), c);
-    }
-    if (version >= 7) {
-      int numConfigs = in.readInt();
-      for (int i = 0; i < numConfigs; i++) {
-        ImmutableBytesWritable key = new ImmutableBytesWritable();
-        ImmutableBytesWritable value = new ImmutableBytesWritable();
-        key.readFields(in);
-        value.readFields(in);
-        configuration.put(
-          Bytes.toString(key.get(), key.getOffset(), key.getLength()),
-          Bytes.toString(value.get(), value.getOffset(), value.getLength()));
-      }
-    }
-  }
-
-  /**
-   * <em> INTERNAL </em> This method is a part of {@link WritableComparable} interface
-   * and is used for serialization of the HTableDescriptor over RPC
-   * @deprecated Writables are going away.
-   * Use {@link com.google.protobuf.MessageLite#toByteArray} instead.
-   */
-  @Deprecated
-  @Override
-  public void write(DataOutput out) throws IOException {
-	  out.writeInt(TABLE_DESCRIPTOR_VERSION);
-    Bytes.writeByteArray(out, name.toBytes());
-    out.writeBoolean(isRootRegion());
-    out.writeBoolean(isMetaRegion());
-    out.writeInt(values.size());
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
-        values.entrySet()) {
-      e.getKey().write(out);
-      e.getValue().write(out);
-    }
-    out.writeInt(families.size());
-    for(Iterator<HColumnDescriptor> it = families.values().iterator();
-        it.hasNext(); ) {
-      HColumnDescriptor family = it.next();
-      family.write(out);
-    }
-    out.writeInt(configuration.size());
-    for (Map.Entry<String, String> e : configuration.entrySet()) {
-      new ImmutableBytesWritable(Bytes.toBytes(e.getKey())).write(out);
-      new ImmutableBytesWritable(Bytes.toBytes(e.getValue())).write(out);
-    }
-  }
-
   // Comparable
 
   /**
@@ -1030,7 +937,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * 		 1 if there is a mismatch in the contents
    */
   @Override
-  public int compareTo(final HTableDescriptor other) {
+  public int compareTo(@Nonnull final HTableDescriptor other) {
     int result = this.name.compareTo(other.name);
     if (result == 0) {
       result = families.size() - other.families.size();
@@ -1094,7 +1001,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    */
   public void setRegionReplication(int regionReplication) {
     setValue(REGION_REPLICATION_KEY,
-        new ImmutableBytesWritable(Bytes.toBytes(Integer.toString(regionReplication))));
+        new Bytes(Bytes.toBytes(Integer.toString(regionReplication))));
   }
 
   /**
@@ -1207,7 +1114,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     // generate a coprocessor key
     int maxCoprocessorNumber = 0;
     Matcher keyMatcher;
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e :
         this.values.entrySet()) {
       keyMatcher =
           HConstants.CP_HTD_ATTR_KEY_PATTERN.matcher(
@@ -1237,7 +1144,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
   public boolean hasCoprocessor(String className) {
     Matcher keyMatcher;
     Matcher valueMatcher;
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e :
         this.values.entrySet()) {
       keyMatcher =
           HConstants.CP_HTD_ATTR_KEY_PATTERN.matcher(
@@ -1269,7 +1176,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
     List<String> result = new ArrayList<String>();
     Matcher keyMatcher;
     Matcher valueMatcher;
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e : this.values.entrySet()) {
+    for (Map.Entry<Bytes, Bytes> e : this.values.entrySet()) {
       keyMatcher = HConstants.CP_HTD_ATTR_KEY_PATTERN.matcher(Bytes.toString(e.getKey().get()));
       if (!keyMatcher.matches()) {
         continue;
@@ -1289,10 +1196,10 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
    * @param className Class name of the co-processor
    */
   public void removeCoprocessor(String className) {
-    ImmutableBytesWritable match = null;
+    Bytes match = null;
     Matcher keyMatcher;
     Matcher valueMatcher;
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e : this.values
+    for (Map.Entry<Bytes, Bytes> e : this.values
         .entrySet()) {
       keyMatcher = HConstants.CP_HTD_ATTR_KEY_PATTERN.matcher(Bytes.toString(e
           .getKey().get()));
@@ -1427,7 +1334,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
   public static HTableDescriptor parseFrom(final byte [] bytes)
   throws DeserializationException, IOException {
     if (!ProtobufUtil.isPBMagicPrefix(bytes)) {
-      return (HTableDescriptor)Writables.getWritable(bytes, new HTableDescriptor());
+      throw new DeserializationException("Expected PB encoded HTableDescriptor");
     }
     int pblen = ProtobufUtil.lengthOfPBMagic();
     TableSchema.Builder builder = TableSchema.newBuilder();
@@ -1446,7 +1353,7 @@ public class HTableDescriptor implements WritableComparable<HTableDescriptor> {
   public TableSchema convert() {
     TableSchema.Builder builder = TableSchema.newBuilder();
     builder.setTableName(ProtobufUtil.toProtoTableName(getTableName()));
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e: this.values.entrySet()) {
+    for (Map.Entry<Bytes, Bytes> e : this.values.entrySet()) {
       BytesBytesPair.Builder aBuilder = BytesBytesPair.newBuilder();
       aBuilder.setFirst(ByteStringer.wrap(e.getKey().get()));
       aBuilder.setSecond(ByteStringer.wrap(e.getValue().get()));

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-common/src/main/java/org/apache/hadoop/hbase/CompoundConfiguration.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/CompoundConfiguration.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/CompoundConfiguration.java
index 3250888..20ce2ed 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/CompoundConfiguration.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/CompoundConfiguration.java
@@ -31,7 +31,7 @@ import java.util.Map;
 import org.apache.commons.collections.iterators.UnmodifiableIterator;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
+import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Bytes;
 
 /**
@@ -149,27 +149,27 @@ public class CompoundConfiguration extends Configuration {
   }
 
   /**
-   * Add ImmutableBytesWritable map to config list. This map is generally
+   * Add Bytes map to config list. This map is generally
    * created by HTableDescriptor or HColumnDescriptor, but can be abstractly
    * used. The added configuration overrides the previous ones if there are
    * name collisions.
    *
    * @param map
-   *          ImmutableBytesWritable map
+   *          Bytes map
    * @return this, for builder pattern
    */
-  public CompoundConfiguration addWritableMap(
-      final Map<ImmutableBytesWritable, ImmutableBytesWritable> map) {
+  public CompoundConfiguration addBytesMap(
+      final Map<Bytes, Bytes> map) {
     freezeMutableConf();
 
     // put new map at the front of the list (top priority)
     this.configs.add(0, new ImmutableConfigMap() {
-      Map<ImmutableBytesWritable, ImmutableBytesWritable> m = map;
+      Map<Bytes, Bytes> m = map;
 
       @Override
       public Iterator<Map.Entry<String,String>> iterator() {
         Map<String, String> ret = new HashMap<String, String>();
-        for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> entry : map.entrySet()) {
+        for (Map.Entry<Bytes, Bytes> entry : map.entrySet()) {
           String key = Bytes.toString(entry.getKey().get());
           String val = entry.getValue() == null ? null : Bytes.toString(entry.getValue().get());
           ret.put(key, val);
@@ -179,11 +179,11 @@ public class CompoundConfiguration extends Configuration {
       
       @Override
       public String get(String key) {
-        ImmutableBytesWritable ibw = new ImmutableBytesWritable(Bytes
+        Bytes ibw = new Bytes(Bytes
             .toBytes(key));
         if (!m.containsKey(ibw))
           return null;
-        ImmutableBytesWritable value = m.get(ibw);
+        Bytes value = m.get(ibw);
         if (value == null || value.get() == null)
           return null;
         return Bytes.toString(value.get());

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
index d69c3be..44d13a5 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/util/Bytes.java
@@ -39,13 +39,13 @@ import java.util.Comparator;
 import java.util.Iterator;
 import java.util.List;
 
+import com.google.protobuf.ByteString;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.io.RawComparator;
 import org.apache.hadoop.io.WritableComparator;
 import org.apache.hadoop.io.WritableUtils;
@@ -58,11 +58,14 @@ import com.google.common.collect.Lists;
 /**
  * Utility class that handles byte arrays, conversions to/from other types,
  * comparisons, hash code generation, manufacturing keys for HashMaps or
- * HashSets, etc.
+ * HashSets, and can be used as key in maps or trees.
  */
 @InterfaceAudience.Public
 @InterfaceStability.Stable
-public class Bytes {
+@edu.umd.cs.findbugs.annotations.SuppressWarnings(
+    value="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS",
+    justification="It has been like this forever")
+public class Bytes implements Comparable<Bytes> {
   //HConstants.UTF8_ENCODING should be updated if this changed
   /** When we encode strings, we always specify UTF8 encoding */
   private static final String UTF8_ENCODING = "UTF-8";
@@ -136,6 +139,190 @@ public class Bytes {
     return b == null ? 0 : b.length;
   }
 
+  private byte[] bytes;
+  private int offset;
+  private int length;
+
+  /**
+   * Create a zero-size sequence.
+   */
+  public Bytes() {
+    super();
+  }
+
+  /**
+   * Create a Bytes using the byte array as the initial value.
+   * @param bytes This array becomes the backing storage for the object.
+   */
+  public Bytes(byte[] bytes) {
+    this(bytes, 0, bytes.length);
+  }
+
+  /**
+   * Set the new Bytes to the contents of the passed
+   * <code>ibw</code>.
+   * @param ibw the value to set this Bytes to.
+   */
+  public Bytes(final Bytes ibw) {
+    this(ibw.get(), ibw.getOffset(), ibw.getLength());
+  }
+
+  /**
+   * Set the value to a given byte range
+   * @param bytes the new byte range to set to
+   * @param offset the offset in newData to start at
+   * @param length the number of bytes in the range
+   */
+  public Bytes(final byte[] bytes, final int offset,
+      final int length) {
+    this.bytes = bytes;
+    this.offset = offset;
+    this.length = length;
+  }
+
+  /**
+   * Copy bytes from ByteString instance.
+   * @param byteString copy from
+   */
+  public Bytes(final ByteString byteString) {
+    this(byteString.toByteArray());
+  }
+
+  /**
+   * Get the data from the Bytes.
+   * @return The data is only valid between offset and offset+length.
+   */
+  public byte [] get() {
+    if (this.bytes == null) {
+      throw new IllegalStateException("Uninitialiized. Null constructor " +
+          "called w/o accompaying readFields invocation");
+    }
+    return this.bytes;
+  }
+
+  /**
+   * @param b Use passed bytes as backing array for this instance.
+   */
+  public void set(final byte [] b) {
+    set(b, 0, b.length);
+  }
+
+  /**
+   * @param b Use passed bytes as backing array for this instance.
+   * @param offset
+   * @param length
+   */
+  public void set(final byte [] b, final int offset, final int length) {
+    this.bytes = b;
+    this.offset = offset;
+    this.length = length;
+  }
+
+  /**
+   * @return the number of valid bytes in the buffer
+   * @deprecated use {@link #getLength()} instead
+   */
+  @Deprecated
+  public int getSize() {
+    if (this.bytes == null) {
+      throw new IllegalStateException("Uninitialiized. Null constructor " +
+          "called w/o accompaying readFields invocation");
+    }
+    return this.length;
+  }
+
+  /**
+   * @return the number of valid bytes in the buffer
+   */
+  public int getLength() {
+    if (this.bytes == null) {
+      throw new IllegalStateException("Uninitialiized. Null constructor " +
+          "called w/o accompaying readFields invocation");
+    }
+    return this.length;
+  }
+
+  /**
+   * @return offset
+   */
+  public int getOffset(){
+    return this.offset;
+  }
+
+  public ByteString toByteString() {
+    return ByteString.copyFrom(this.bytes, this.offset, this.length);
+  }
+
+  @Override
+  public int hashCode() {
+    return Bytes.hashCode(bytes, offset, length);
+  }
+
+  /**
+   * Define the sort order of the Bytes.
+   * @param that The other bytes writable
+   * @return Positive if left is bigger than right, 0 if they are equal, and
+   *         negative if left is smaller than right.
+   */
+  public int compareTo(Bytes that) {
+    return BYTES_RAWCOMPARATOR.compare(
+        this.bytes, this.offset, this.length,
+        that.bytes, that.offset, that.length);
+  }
+
+  /**
+   * Compares the bytes in this object to the specified byte array
+   * @param that
+   * @return Positive if left is bigger than right, 0 if they are equal, and
+   *         negative if left is smaller than right.
+   */
+  public int compareTo(final byte [] that) {
+    return BYTES_RAWCOMPARATOR.compare(
+        this.bytes, this.offset, this.length,
+        that, 0, that.length);
+  }
+
+  /**
+   * @see Object#equals(Object)
+   */
+  @Override
+  public boolean equals(Object right_obj) {
+    if (right_obj instanceof byte []) {
+      return compareTo((byte [])right_obj) == 0;
+    }
+    if (right_obj instanceof Bytes) {
+      return compareTo((Bytes)right_obj) == 0;
+    }
+    return false;
+  }
+
+  /**
+   * @see Object#toString()
+   */
+  @Override
+  public String toString() {
+    return Bytes.toString(bytes, offset, length);
+  }
+
+  /**
+   * @param array List of byte [].
+   * @return Array of byte [].
+   */
+  public static byte [][] toArray(final List<byte []> array) {
+    // List#toArray doesn't work on lists of byte [].
+    byte[][] results = new byte[array.size()][];
+    for (int i = 0; i < array.size(); i++) {
+      results[i] = array.get(i);
+    }
+    return results;
+  }
+
+  /**
+   * Returns a copy of the bytes referred to by this writable
+   */
+  public byte[] copyBytes() {
+    return Arrays.copyOfRange(bytes, offset, offset+length);
+  }
   /**
    * Byte array comparator class.
    */
@@ -1356,8 +1543,8 @@ public class Bytes {
   /**
    * @param b bytes to hash
    * @return Runs {@link WritableComparator#hashBytes(byte[], int)} on the
-   * passed in array.  This method is what {@link org.apache.hadoop.io.Text} and
-   * {@link ImmutableBytesWritable} use calculating hash code.
+   * passed in array.  This method is what {@link org.apache.hadoop.io.Text}
+   * use calculating hash code.
    */
   public static int hashCode(final byte [] b) {
     return hashCode(b, b.length);
@@ -1367,8 +1554,8 @@ public class Bytes {
    * @param b value
    * @param length length of the value
    * @return Runs {@link WritableComparator#hashBytes(byte[], int)} on the
-   * passed in array.  This method is what {@link org.apache.hadoop.io.Text} and
-   * {@link ImmutableBytesWritable} use calculating hash code.
+   * passed in array.  This method is what {@link org.apache.hadoop.io.Text}
+   * use calculating hash code.
    */
   public static int hashCode(final byte [] b, final int length) {
     return WritableComparator.hashBytes(b, length);

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-common/src/test/java/org/apache/hadoop/hbase/TestCompoundConfiguration.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestCompoundConfiguration.java b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestCompoundConfiguration.java
index 65607a4..57409b6 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestCompoundConfiguration.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestCompoundConfiguration.java
@@ -25,7 +25,6 @@ import java.util.Map;
 import junit.framework.TestCase;
 
 import org.apache.hadoop.conf.Configuration;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.testclassification.MiscTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -116,23 +115,23 @@ public class TestCompoundConfiguration extends TestCase {
     assertEquals(baseConfSize + 1, cnt);
   }
 
-  private ImmutableBytesWritable strToIbw(String s) {
-    return new ImmutableBytesWritable(Bytes.toBytes(s));
+  private Bytes strToIb(String s) {
+    return new Bytes(Bytes.toBytes(s));
   }
 
   @Test
   public void testWithIbwMap() {
-    Map<ImmutableBytesWritable, ImmutableBytesWritable> map =
-      new HashMap<ImmutableBytesWritable, ImmutableBytesWritable>();
-    map.put(strToIbw("B"), strToIbw("2b"));
-    map.put(strToIbw("C"), strToIbw("33"));
-    map.put(strToIbw("D"), strToIbw("4"));
+    Map<Bytes, Bytes> map =
+      new HashMap<Bytes, Bytes>();
+    map.put(strToIb("B"), strToIb("2b"));
+    map.put(strToIb("C"), strToIb("33"));
+    map.put(strToIb("D"), strToIb("4"));
     // unlike config, note that IBW Maps can accept null values
-    map.put(strToIbw("G"), null);
+    map.put(strToIb("G"), null);
 
     CompoundConfiguration compoundConf = new CompoundConfiguration()
       .add(baseConf)
-      .addWritableMap(map);
+      .addBytesMap(map);
     assertEquals("1", compoundConf.get("A"));
     assertEquals("2b", compoundConf.get("B"));
     assertEquals(33, compoundConf.getInt("C", 0));
@@ -157,7 +156,7 @@ public class TestCompoundConfiguration extends TestCase {
     conf2.set("D", "not4");
     assertEquals("modification", conf2.get("X"));
     assertEquals("not4", conf2.get("D"));
-    conf2.addWritableMap(map);
+    conf2.addBytesMap(map);
     assertEquals("4", conf2.get("D")); // map overrides
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
index e904125..09e9f57 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/constraint/Constraints.java
@@ -34,7 +34,6 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
 
@@ -121,9 +120,9 @@ public final class Constraints {
     disable(desc);
 
     // remove all the constraint settings
-    List<ImmutableBytesWritable> keys = new ArrayList<ImmutableBytesWritable>();
+    List<Bytes> keys = new ArrayList<Bytes>();
     // loop through all the key, values looking for constraints
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e : desc
+    for (Map.Entry<Bytes, Bytes> e : desc
         .getValues().entrySet()) {
       String key = Bytes.toString((e.getKey().get()));
       String[] className = CONSTRAINT_HTD_ATTR_KEY_PATTERN.split(key);
@@ -132,7 +131,7 @@ public final class Constraints {
       }
     }
     // now remove all the keys we found
-    for (ImmutableBytesWritable key : keys) {
+    for (Bytes key : keys) {
       desc.remove(key);
     }
   }
@@ -562,7 +561,7 @@ public final class Constraints {
       ClassLoader classloader) throws IOException {
     List<Constraint> constraints = new ArrayList<Constraint>();
     // loop through all the key, values looking for constraints
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e : desc
+    for (Map.Entry<Bytes, Bytes> e : desc
         .getValues().entrySet()) {
       // read out the constraint
       String key = Bytes.toString(e.getKey().get()).trim();

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
index bbf372c..399f13d 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
@@ -586,7 +586,7 @@ public class HRegion implements HeapSize { // , Writable{
     this.conf = new CompoundConfiguration()
       .add(confParam)
       .addStringMap(htd.getConfiguration())
-      .addWritableMap(htd.getValues());
+      .addBytesMap(htd.getValues());
     this.flushCheckInterval = conf.getInt(MEMSTORE_PERIODIC_FLUSH_INTERVAL,
         DEFAULT_CACHE_FLUSH_INTERVAL);
     this.flushPerChanges = conf.getLong(MEMSTORE_FLUSH_PER_CHANGES, DEFAULT_FLUSH_PER_CHANGES);

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
index 8d20d7b..1360c1a 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HStore.java
@@ -221,7 +221,7 @@ public class HStore implements Store {
       .add(confParam)
       .addStringMap(region.getTableDesc().getConfiguration())
       .addStringMap(family.getConfiguration())
-      .addWritableMap(family.getValues());
+      .addBytesMap(family.getValues());
     this.blocksize = family.getBlocksize();
 
     this.dataBlockEncoder =

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
index c31d6ef..2d6ae63 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/RegionCoprocessorHost.java
@@ -32,6 +32,10 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.regex.Matcher;
 
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.protobuf.Message;
+import com.google.protobuf.Service;
 import org.apache.commons.collections.map.AbstractReferenceMap;
 import org.apache.commons.collections.map.ReferenceMap;
 import org.apache.commons.logging.Log;
@@ -68,7 +72,6 @@ import org.apache.hadoop.hbase.coprocessor.RegionObserver.MutationType;
 import org.apache.hadoop.hbase.filter.ByteArrayComparable;
 import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
 import org.apache.hadoop.hbase.io.FSDataInputStreamWrapper;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.io.Reference;
 import org.apache.hadoop.hbase.io.hfile.CacheConfig;
 import org.apache.hadoop.hbase.regionserver.HRegion.Operation;
@@ -78,11 +81,6 @@ import org.apache.hadoop.hbase.regionserver.wal.WALEdit;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
 
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import com.google.protobuf.Message;
-import com.google.protobuf.Service;
-
 /**
  * Implements the coprocessor environment and runtime support for coprocessors
  * loaded within a {@link HRegion}.
@@ -192,7 +190,7 @@ public class RegionCoprocessorHost
     // scan the table attributes for coprocessor load specifications
     // initialize the coprocessors
     List<RegionEnvironment> configured = new ArrayList<RegionEnvironment>();
-    for (Map.Entry<ImmutableBytesWritable,ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e :
         region.getTableDesc().getValues().entrySet()) {
       String key = Bytes.toString(e.getKey().get()).trim();
       String spec = Bytes.toString(e.getValue().get()).trim();

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java
index 6241db9..6d27650 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/TableSchemaModel.java
@@ -38,7 +38,6 @@ import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.rest.ProtobufMessageHandler;
 import org.apache.hadoop.hbase.rest.protobuf.generated.ColumnSchemaMessage.ColumnSchema;
 import org.apache.hadoop.hbase.rest.protobuf.generated.TableSchemaMessage.TableSchema;
@@ -88,7 +87,7 @@ public class TableSchemaModel implements Serializable, ProtobufMessageHandler {
    */
   public TableSchemaModel(HTableDescriptor htd) {
     setName(htd.getTableName().getNameAsString());
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e:
         htd.getValues().entrySet()) {
       addAttribute(Bytes.toString(e.getKey().get()), 
         Bytes.toString(e.getValue().get()));
@@ -96,9 +95,9 @@ public class TableSchemaModel implements Serializable, ProtobufMessageHandler {
     for (HColumnDescriptor hcd: htd.getFamilies()) {
       ColumnSchemaModel columnModel = new ColumnSchemaModel();
       columnModel.setName(hcd.getNameAsString());
-      for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+      for (Map.Entry<Bytes, Bytes> e:
           hcd.getValues().entrySet()) {
-        columnModel.addAttribute(Bytes.toString(e.getKey().get()), 
+        columnModel.addAttribute(Bytes.toString(e.getKey().get()),
             Bytes.toString(e.getValue().get()));
       }
       addColumnFamily(columnModel);

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
index 3a7186f..ef90e0e 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/snapshot/RestoreSnapshotHelper.java
@@ -49,7 +49,6 @@ import org.apache.hadoop.hbase.client.HConnection;
 import org.apache.hadoop.hbase.errorhandling.ForeignExceptionDispatcher;
 import org.apache.hadoop.hbase.io.HFileLink;
 import org.apache.hadoop.hbase.io.Reference;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.monitoring.MonitoredTask;
 import org.apache.hadoop.hbase.monitoring.TaskMonitor;
 import org.apache.hadoop.hbase.protobuf.generated.HBaseProtos.SnapshotDescription;
@@ -59,6 +58,7 @@ import org.apache.hadoop.hbase.regionserver.HRegionFileSystem;
 import org.apache.hadoop.hbase.regionserver.StoreFileInfo;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.FSUtils;
+import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.ModifyRegionUtils;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.hadoop.io.IOUtils;
@@ -690,7 +690,7 @@ public class RestoreSnapshotHelper {
     for (HColumnDescriptor hcd: snapshotTableDescriptor.getColumnFamilies()) {
       htd.addFamily(hcd);
     }
-    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+    for (Map.Entry<Bytes, Bytes> e:
         snapshotTableDescriptor.getValues().entrySet()) {
       htd.setValue(e.getKey(), e.getValue());
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-server/src/test/java/org/apache/hadoop/hbase/TestSerialization.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestSerialization.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestSerialization.java
index c57a8cf..c29a460 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestSerialization.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestSerialization.java
@@ -141,9 +141,8 @@ public class TestSerialization {
   @Test public void testTableDescriptor() throws Exception {
     final String name = "testTableDescriptor";
     HTableDescriptor htd = createTableDescriptor(name);
-    byte [] mb = Writables.getBytes(htd);
-    HTableDescriptor deserializedHtd =
-      (HTableDescriptor)Writables.getWritable(mb, new HTableDescriptor());
+    byte [] mb = htd.toByteArray();
+    HTableDescriptor deserializedHtd = HTableDescriptor.parseFrom(mb);
     assertEquals(htd.getTableName(), deserializedHtd.getTableName());
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/55546928/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
index 8583b5c..14e3cb7 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift/ThriftServerRunner.java
@@ -153,6 +153,7 @@ public class ThriftServerRunner implements Runnable {
 
   private static final String DEFAULT_BIND_ADDR = "0.0.0.0";
   public static final int DEFAULT_LISTEN_PORT = 9090;
+  public static final int HREGION_VERSION = 1;
   private final int listenPort;
 
   private Configuration conf;
@@ -749,7 +750,7 @@ public class ThriftServerRunner implements Runnable {
           region.endKey = ByteBuffer.wrap(info.getEndKey());
           region.id = info.getRegionId();
           region.name = ByteBuffer.wrap(info.getRegionName());
-          region.version = info.getVersion();
+          region.version = HREGION_VERSION; // HRegion now not versioned, PB encoding used
           results.add(region);
         }
         return results;
@@ -1554,7 +1555,7 @@ public class ThriftServerRunner implements Runnable {
         region.setEndKey(regionInfo.getEndKey());
         region.id = regionInfo.getRegionId();
         region.setName(regionInfo.getRegionName());
-        region.version = regionInfo.getVersion();
+        region.version = HREGION_VERSION; // version not used anymore, PB encoding used.
 
         // find region assignment to server
         ServerName serverName = HRegionInfo.getServerName(startRowResult);