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 2017/12/14 22:16:08 UTC

[2/2] hbase git commit: HBASE-19462 Deprecate all addImmutable methods in Put

HBASE-19462 Deprecate all addImmutable methods in Put

Signed-off-by: Michael Stack <st...@apache.org>


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

Branch: refs/heads/master
Commit: 70f02dbc7ceff51949d7e08438520885e9d6380f
Parents: 1a173f8
Author: Chia-Ping Tsai <ch...@gmail.com>
Authored: Thu Dec 14 12:35:07 2017 +0800
Committer: Michael Stack <st...@apache.org>
Committed: Thu Dec 14 14:15:54 2017 -0800

----------------------------------------------------------------------
 .../apache/hadoop/hbase/MetaTableAccessor.java  | 196 +++++++++++++++----
 .../org/apache/hadoop/hbase/client/Put.java     |  67 ++-----
 .../hadoop/hbase/protobuf/ProtobufUtil.java     |  78 ++++----
 .../hbase/shaded/protobuf/ProtobufUtil.java     |  72 ++++---
 .../org/apache/hadoop/hbase/client/TestPut.java |  38 +++-
 .../example/MultiThreadedClientExample.java     |  21 +-
 .../apache/hadoop/hbase/rest/RowResource.java   |  31 ++-
 .../favored/FavoredNodeAssignmentHelper.java    |  13 +-
 .../hbase/master/TableNamespaceManager.java     |  18 +-
 .../master/assignment/RegionStateStore.java     |  24 ++-
 .../security/access/AccessControlLists.java     |  15 +-
 .../DefaultVisibilityLabelServiceImpl.java      |  46 ++++-
 .../hbase/client/TestMultiRespectsLimits.java   |  12 +-
 .../TestCompactionLifeCycleTracker.java         |  26 ++-
 .../regionserver/TestFlushLifeCycleTracker.java |  26 ++-
 .../hadoop/hbase/regionserver/TestHRegion.java  |  40 +++-
 .../ExpAsStringVisibilityLabelServiceImpl.java  |  13 +-
 .../hbase/snapshot/SnapshotTestingUtils.java    |   4 +-
 .../hadoop/hbase/thrift/ThriftServerRunner.java |  50 +++--
 .../hadoop/hbase/thrift2/ThriftUtilities.java   |  42 ++--
 20 files changed, 601 insertions(+), 231 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
index 4286afe..fd339b3 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/MetaTableAccessor.java
@@ -1342,35 +1342,80 @@ public class MetaTableAccessor {
     return delete;
   }
 
-  public static Put makeBarrierPut(byte[] encodedRegionName, long seq, byte[] tableName) {
+  public static Put makeBarrierPut(byte[] encodedRegionName, long seq, byte[] tableName)
+      throws IOException {
     byte[] seqBytes = Bytes.toBytes(seq);
-    return new Put(encodedRegionName)
-        .addImmutable(HConstants.REPLICATION_BARRIER_FAMILY, seqBytes, seqBytes)
-        .addImmutable(HConstants.REPLICATION_META_FAMILY, tableNameCq, tableName);
+    Put put = new Put(encodedRegionName);
+    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(put.getRow())
+            .setFamily(HConstants.REPLICATION_BARRIER_FAMILY)
+            .setQualifier(seqBytes)
+            .setTimestamp(put.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(seqBytes)
+            .build())
+       .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(put.getRow())
+            .setFamily(HConstants.REPLICATION_META_FAMILY)
+            .setQualifier(tableNameCq)
+            .setTimestamp(put.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(tableName)
+            .build());
+    return put;
   }
 
 
-  public static Put makeDaughterPut(byte[] encodedRegionName, byte[] value) {
-    return new Put(encodedRegionName).addImmutable(HConstants.REPLICATION_META_FAMILY,
-        daughterNameCq, value);
+  public static Put makeDaughterPut(byte[] encodedRegionName, byte[] value) throws IOException {
+    Put put = new Put(encodedRegionName);
+    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(put.getRow())
+            .setFamily(HConstants.REPLICATION_META_FAMILY)
+            .setQualifier(daughterNameCq)
+            .setTimestamp(put.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(value)
+            .build());
+    return put;
   }
 
-  public static Put makeParentPut(byte[] encodedRegionName, byte[] value) {
-    return new Put(encodedRegionName).addImmutable(HConstants.REPLICATION_META_FAMILY,
-        parentNameCq, value);
+  public static Put makeParentPut(byte[] encodedRegionName, byte[] value) throws IOException {
+    Put put = new Put(encodedRegionName);
+    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(put.getRow())
+            .setFamily(HConstants.REPLICATION_META_FAMILY)
+            .setQualifier(parentNameCq)
+            .setTimestamp(put.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(value)
+            .build());
+    return put;
   }
 
   /**
    * Adds split daughters to the Put
    */
-  public static Put addDaughtersToPut(Put put, RegionInfo splitA, RegionInfo splitB) {
+  public static Put addDaughtersToPut(Put put, RegionInfo splitA, RegionInfo splitB)
+      throws IOException {
     if (splitA != null) {
-      put.addImmutable(
-        HConstants.CATALOG_FAMILY, HConstants.SPLITA_QUALIFIER, RegionInfo.toByteArray(splitA));
+      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                .setRow(put.getRow())
+                .setFamily(HConstants.CATALOG_FAMILY)
+                .setQualifier(HConstants.SPLITA_QUALIFIER)
+                .setTimestamp(put.getTimeStamp())
+                .setType(CellBuilder.DataType.Put)
+                .setValue(RegionInfo.toByteArray(splitA))
+                .build());
     }
     if (splitB != null) {
-      put.addImmutable(
-        HConstants.CATALOG_FAMILY, HConstants.SPLITB_QUALIFIER, RegionInfo.toByteArray(splitB));
+      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                .setRow(put.getRow())
+                .setFamily(HConstants.CATALOG_FAMILY)
+                .setQualifier(HConstants.SPLITB_QUALIFIER)
+                .setTimestamp(put.getTimeStamp())
+                .setType(CellBuilder.DataType.Put)
+                .setValue(RegionInfo.toByteArray(splitB))
+                .build());
     }
     return put;
   }
@@ -1658,10 +1703,22 @@ public class MetaTableAccessor {
 
       // Put for parent
       Put putOfMerged = makePutFromRegionInfo(mergedRegion, time);
-      putOfMerged.addImmutable(HConstants.CATALOG_FAMILY, HConstants.MERGEA_QUALIFIER,
-        RegionInfo.toByteArray(regionA));
-      putOfMerged.addImmutable(HConstants.CATALOG_FAMILY, HConstants.MERGEB_QUALIFIER,
-          RegionInfo.toByteArray(regionB));
+      putOfMerged.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(putOfMerged.getRow())
+              .setFamily(HConstants.CATALOG_FAMILY)
+              .setQualifier(HConstants.MERGEA_QUALIFIER)
+              .setTimestamp(putOfMerged.getTimeStamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(RegionInfo.toByteArray(regionA))
+              .build())
+          .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(putOfMerged.getRow())
+              .setFamily(HConstants.CATALOG_FAMILY)
+              .setQualifier(HConstants.MERGEB_QUALIFIER)
+              .setTimestamp(putOfMerged.getTimeStamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(RegionInfo.toByteArray(regionB))
+              .build());
 
       // Deletes for merging regions
       Delete deleteA = makeDeleteFromRegionInfo(regionA, time);
@@ -1898,10 +1955,15 @@ public class MetaTableAccessor {
       Map<String, Long> positions) throws IOException {
     List<Put> puts = new ArrayList<>(positions.entrySet().size());
     for (Map.Entry<String, Long> entry : positions.entrySet()) {
-      long value = Math.abs(entry.getValue());
       Put put = new Put(Bytes.toBytes(entry.getKey()));
-      put.addImmutable(HConstants.REPLICATION_POSITION_FAMILY, Bytes.toBytes(peerId),
-          Bytes.toBytes(value));
+      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+          .setRow(put.getRow())
+          .setFamily(HConstants.REPLICATION_POSITION_FAMILY)
+          .setQualifier(Bytes.toBytes(peerId))
+          .setTimestamp(put.getTimeStamp())
+          .setType(CellBuilder.DataType.Put)
+          .setValue(Bytes.toBytes(Math.abs(entry.getValue())))
+          .build());
       puts.add(put);
     }
     getMetaHTable(connection).put(puts);
@@ -2062,31 +2124,73 @@ public class MetaTableAccessor {
 
   public static Put addRegionInfo(final Put p, final RegionInfo hri)
     throws IOException {
-    p.addImmutable(getCatalogFamily(), HConstants.REGIONINFO_QUALIFIER,
-        RegionInfo.toByteArray(hri));
+    p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+        .setRow(p.getRow())
+        .setFamily(getCatalogFamily())
+        .setQualifier(HConstants.REGIONINFO_QUALIFIER)
+        .setTimestamp(p.getTimeStamp())
+        .setType(CellBuilder.DataType.Put)
+        .setValue(RegionInfo.toByteArray(hri))
+        .build());
     return p;
   }
 
   public static Put addLocation(final Put p, final ServerName sn, long openSeqNum,
-      long time, int replicaId){
+      long time, int replicaId) throws IOException {
     if (time <= 0) {
       time = EnvironmentEdgeManager.currentTime();
     }
-    p.addImmutable(getCatalogFamily(), getServerColumn(replicaId), time,
-      Bytes.toBytes(sn.getHostAndPort()));
-    p.addImmutable(getCatalogFamily(), getStartCodeColumn(replicaId), time,
-      Bytes.toBytes(sn.getStartcode()));
-    p.addImmutable(getCatalogFamily(), getSeqNumColumn(replicaId), time,
-      Bytes.toBytes(openSeqNum));
-    return p;
-  }
-
-  public static Put addEmptyLocation(final Put p, int replicaId) {
+    CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
+    return p.add(builder.clear()
+              .setRow(p.getRow())
+              .setFamily(getCatalogFamily())
+              .setQualifier(getServerColumn(replicaId))
+              .setTimestamp(time)
+              .setType(CellBuilder.DataType.Put)
+              .setValue(Bytes.toBytes(sn.getAddress().toString()))
+              .build())
+            .add(builder.clear()
+              .setRow(p.getRow())
+              .setFamily(getCatalogFamily())
+              .setQualifier(getStartCodeColumn(replicaId))
+              .setTimestamp(time)
+              .setType(CellBuilder.DataType.Put)
+              .setValue(Bytes.toBytes(sn.getStartcode()))
+              .build())
+            .add(builder.clear()
+              .setRow(p.getRow())
+              .setFamily(getCatalogFamily())
+              .setQualifier(getSeqNumColumn(replicaId))
+              .setTimestamp(time)
+              .setType(CellBuilder.DataType.Put)
+              .setValue(Bytes.toBytes(openSeqNum))
+              .build());
+  }
+
+  public static Put addEmptyLocation(final Put p, int replicaId) throws IOException {
     long now = EnvironmentEdgeManager.currentTime();
-    p.addImmutable(getCatalogFamily(), getServerColumn(replicaId), now, null);
-    p.addImmutable(getCatalogFamily(), getStartCodeColumn(replicaId), now, null);
-    p.addImmutable(getCatalogFamily(), getSeqNumColumn(replicaId), now, null);
-    return p;
+    CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
+    return p.add(builder.clear()
+                .setRow(p.getRow())
+                .setFamily(getCatalogFamily())
+                .setQualifier(getServerColumn(replicaId))
+                .setTimestamp(now)
+                .setType(CellBuilder.DataType.Put)
+                .build())
+            .add(builder.clear()
+                .setRow(p.getRow())
+                .setFamily(getCatalogFamily())
+                .setQualifier(getStartCodeColumn(replicaId))
+                .setTimestamp(now)
+                .setType(CellBuilder.DataType.Put)
+                .build())
+            .add(builder.clear()
+                .setRow(p.getRow())
+                .setFamily(getCatalogFamily())
+                .setQualifier(getSeqNumColumn(replicaId))
+                .setTimestamp(now)
+                .setType(CellBuilder.DataType.Put)
+                .build());
   }
 
   private static String mutationsToString(List<? extends Mutation> mutations) throws IOException {
@@ -2103,13 +2207,19 @@ public class MetaTableAccessor {
     return p.getClass().getSimpleName() + p.toJSON();
   }
 
-  public static Put addSequenceNum(final Put p, long openSeqNum, long time, int replicaId) {
+  public static Put addSequenceNum(final Put p, long openSeqNum, long time,
+      int replicaId) throws IOException {
     if (time <= 0) {
       time = EnvironmentEdgeManager.currentTime();
     }
-    p.addImmutable(HConstants.CATALOG_FAMILY, getSeqNumColumn(replicaId), time,
-      Bytes.toBytes(openSeqNum));
-    return p;
+    return p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(p.getRow())
+              .setFamily(HConstants.CATALOG_FAMILY)
+              .setQualifier(getSeqNumColumn(replicaId))
+              .setTimestamp(time)
+              .setType(CellBuilder.DataType.Put)
+              .setValue(Bytes.toBytes(openSeqNum))
+              .build());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
index 47349b3..73da4c8 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Put.java
@@ -32,7 +32,6 @@ import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.IndividualBytesFieldCell;
 import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.Tag;
 import org.apache.hadoop.hbase.io.HeapSize;
 import org.apache.hadoop.hbase.security.access.Permission;
 import org.apache.hadoop.hbase.security.visibility.CellVisibility;
@@ -182,23 +181,15 @@ public class Put extends Mutation implements HeapSize, Comparable<Row> {
    * See {@link #addColumn(byte[], byte[], byte[])}. This version expects
    * that the underlying arrays won't change. It's intended
    * for usage internal HBase to and for advanced client applications.
+   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.
+   *             Use {@link #add(Cell)} and {@link org.apache.hadoop.hbase.CellBuilder} instead
    */
+  @Deprecated
   public Put addImmutable(byte [] family, byte [] qualifier, byte [] value) {
     return addImmutable(family, qualifier, this.ts, value);
   }
 
   /**
-   * This expects that the underlying arrays won't change. It's intended
-   * for usage internal HBase to and for advanced client applications.
-   * <p>Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail
-   * that should not be exposed publicly.
-   */
-  @InterfaceAudience.Private
-  public Put addImmutable(byte[] family, byte [] qualifier, byte [] value, Tag[] tag) {
-    return addImmutable(family, qualifier, this.ts, value, tag);
-  }
-
-  /**
    * Add the specified column and value, with the specified timestamp as
    * its version to this Put operation.
    * @param family family name
@@ -221,7 +212,10 @@ public class Put extends Mutation implements HeapSize, Comparable<Row> {
    * See {@link #addColumn(byte[], byte[], long, byte[])}. This version expects
    * that the underlying arrays won't change. It's intended
    * for usage internal HBase to and for advanced client applications.
+   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.
+   *             Use {@link #add(Cell)} and {@link org.apache.hadoop.hbase.CellBuilder} instead
    */
+  @Deprecated
   public Put addImmutable(byte [] family, byte [] qualifier, long ts, byte [] value) {
     // Family can not be null, otherwise NullPointerException is thrown when putting the cell into familyMap
     if (family == null) {
@@ -239,39 +233,6 @@ public class Put extends Mutation implements HeapSize, Comparable<Row> {
   }
 
   /**
-   * This expects that the underlying arrays won't change. It's intended
-   * for usage internal HBase to and for advanced client applications.
-   * <p>Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail
-   * that should not be exposed publicly.
-   */
-  @InterfaceAudience.Private
-  public Put addImmutable(byte[] family, byte[] qualifier, long ts, byte[] value, Tag[] tag) {
-    List<Cell> list = getCellList(family);
-    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);
-    list.add(kv);
-    return this;
-  }
-
-  /**
-   * This expects that the underlying arrays won't change. It's intended
-   * for usage internal HBase to and for advanced client applications.
-   * <p>Marked as audience Private as of 1.2.0. {@link Tag} is an internal implementation detail
-   * that should not be exposed publicly.
-   */
-  @InterfaceAudience.Private
-  public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value,
-                          Tag[] tag) {
-    if (ts < 0) {
-      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
-    }
-    List<Cell> list = getCellList(family);
-    KeyValue kv = createPutKeyValue(family, qualifier, ts, value, tag);
-    list.add(kv);
-    return this;
-  }
-
-
-  /**
    * Add the specified column and value, with the specified timestamp as
    * its version to this Put operation.
    * @param family family name
@@ -294,7 +255,10 @@ public class Put extends Mutation implements HeapSize, Comparable<Row> {
    * See {@link #addColumn(byte[], ByteBuffer, long, ByteBuffer)}. This version expects
    * that the underlying arrays won't change. It's intended
    * for usage internal HBase to and for advanced client applications.
+   * @deprecated As of release 2.0.0, this will be removed in HBase 3.0.0.
+   *             Use {@link #add(Cell)} and {@link org.apache.hadoop.hbase.CellBuilder} instead
    */
+  @Deprecated
   public Put addImmutable(byte[] family, ByteBuffer qualifier, long ts, ByteBuffer value) {
     if (ts < 0) {
       throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
@@ -313,7 +277,18 @@ public class Put extends Mutation implements HeapSize, Comparable<Row> {
    * @return this
    * @throws java.io.IOException e
    */
-  public Put add(Cell kv) throws IOException{
+  public Put add(Cell kv) throws IOException {
+    // Family can not be null, otherwise NullPointerException is thrown when putting
+    // the cell into familyMap
+    if (kv.getFamilyArray() == null) {
+      throw new IllegalArgumentException("Family cannot be null");
+    }
+
+    // Check timestamp
+    if (ts < 0) {
+      throw new IllegalArgumentException("Timestamp cannot be negative. ts=" + ts);
+    }
+
     byte [] family = CellUtil.cloneFamily(kv);
     List<Cell> list = getCellList(family);
     //Checking that the row of the kv is the same as the put

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
index 67fea5f..f334536 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/protobuf/ProtobufUtil.java
@@ -17,10 +17,19 @@
  */
 package org.apache.hadoop.hbase.protobuf;
 
+import com.google.protobuf.ByteString;
+import com.google.protobuf.CodedInputStream;
+import com.google.protobuf.InvalidProtocolBufferException;
+import com.google.protobuf.Message;
+import com.google.protobuf.Parser;
+import com.google.protobuf.RpcChannel;
+import com.google.protobuf.RpcController;
+import com.google.protobuf.Service;
+import com.google.protobuf.ServiceException;
+import com.google.protobuf.TextFormat;
 import java.io.IOException;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -28,9 +37,9 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.NavigableSet;
 import java.util.function.Function;
-
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
 import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.CellUtil;
@@ -43,8 +52,6 @@ import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.Tag;
-import org.apache.hadoop.hbase.TagUtil;
 import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.Consistency;
 import org.apache.hadoop.hbase.client.Delete;
@@ -91,17 +98,6 @@ import org.apache.hadoop.hbase.util.Methods;
 import org.apache.hadoop.ipc.RemoteException;
 import org.apache.yetus.audience.InterfaceAudience;
 
-import com.google.protobuf.ByteString;
-import com.google.protobuf.CodedInputStream;
-import com.google.protobuf.InvalidProtocolBufferException;
-import com.google.protobuf.Message;
-import com.google.protobuf.Parser;
-import com.google.protobuf.RpcChannel;
-import com.google.protobuf.RpcController;
-import com.google.protobuf.Service;
-import com.google.protobuf.ServiceException;
-import com.google.protobuf.TextFormat;
-
 /**
  * Protobufs utility.
  * NOTE: This class OVERLAPS ProtobufUtil in the subpackage 'shaded'. The latter is used
@@ -516,10 +512,6 @@ public final class ProtobufUtil {
             throw new DoNotRetryIOException(
                 "Missing required field: qualifier value");
           }
-          ByteBuffer qualifier =
-              qv.hasQualifier() ? qv.getQualifier().asReadOnlyByteBuffer() : null;
-          ByteBuffer value =
-              qv.hasValue() ? qv.getValue().asReadOnlyByteBuffer() : null;
           long ts = timestamp;
           if (qv.hasTimestamp()) {
             ts = qv.getTimestamp();
@@ -529,30 +521,42 @@ public final class ProtobufUtil {
             allTagsBytes = qv.getTags().toByteArray();
             if(qv.hasDeleteType()) {
               put.add(cellBuilder.clear()
-                      .setRow(proto.getRow().toByteArray())
-                      .setFamily(family)
-                      .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
-                      .setTimestamp(ts)
-                      .setType(fromDeleteType(qv.getDeleteType()).getCode())
-                      .setTags(allTagsBytes)
-                      .build());
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(fromDeleteType(qv.getDeleteType()).getCode())
+                  .setTags(allTagsBytes)
+                  .build());
             } else {
-              List<Tag> tags =
-                  TagUtil.asList(allTagsBytes, 0, (short) allTagsBytes.length);
-              Tag[] tagsArray = new Tag[tags.size()];
-              put.addImmutable(family, qualifier, ts, value, tags.toArray(tagsArray));
+              put.add(cellBuilder.clear()
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(CellBuilder.DataType.Put)
+                  .setValue(qv.hasValue() ? qv.getValue().toByteArray() : null)
+                  .setTags(allTagsBytes)
+                  .build());
             }
           } else {
             if(qv.hasDeleteType()) {
               put.add(cellBuilder.clear()
-                      .setRow(proto.getRow().toByteArray())
-                      .setFamily(family)
-                      .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
-                      .setTimestamp(ts)
-                      .setType(fromDeleteType(qv.getDeleteType()).getCode())
-                      .build());
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(fromDeleteType(qv.getDeleteType()).getCode())
+                  .build());
             } else{
-              put.addImmutable(family, qualifier, ts, value);
+              put.add(cellBuilder.clear()
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(CellBuilder.DataType.Put)
+                  .setValue(qv.hasValue() ? qv.getValue().toByteArray() : null)
+                  .build());
             }
           }
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
index cff8284..d9c699b 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/shaded/protobuf/ProtobufUtil.java
@@ -44,6 +44,7 @@ import org.apache.hadoop.hbase.ByteBufferCell;
 import org.apache.hadoop.hbase.CacheEvictionStats;
 import org.apache.hadoop.hbase.CacheEvictionStatsBuilder;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
 import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellScanner;
 import org.apache.hadoop.hbase.CellUtil;
@@ -61,8 +62,6 @@ import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerLoad;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
-import org.apache.hadoop.hbase.Tag;
-import org.apache.hadoop.hbase.TagUtil;
 import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.ClientUtil;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;
@@ -103,6 +102,15 @@ import org.apache.hadoop.hbase.replication.ReplicationLoadSink;
 import org.apache.hadoop.hbase.replication.ReplicationLoadSource;
 import org.apache.hadoop.hbase.security.visibility.Authorizations;
 import org.apache.hadoop.hbase.security.visibility.CellVisibility;
+import org.apache.hadoop.hbase.util.Addressing;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.DynamicClassLoader;
+import org.apache.hadoop.hbase.util.ExceptionUtil;
+import org.apache.hadoop.hbase.util.Methods;
+import org.apache.hadoop.hbase.util.VersionInfo;
+import org.apache.hadoop.ipc.RemoteException;
+import org.apache.yetus.audience.InterfaceAudience;
+
 import org.apache.hadoop.hbase.shaded.com.google.gson.JsonArray;
 import org.apache.hadoop.hbase.shaded.com.google.gson.JsonElement;
 import org.apache.hadoop.hbase.shaded.com.google.protobuf.ByteString;
@@ -181,14 +189,6 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDe
 import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.RegionEventDescriptor.EventType;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.WALProtos.StoreDescriptor;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;
-import org.apache.hadoop.hbase.util.Addressing;
-import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.util.DynamicClassLoader;
-import org.apache.hadoop.hbase.util.ExceptionUtil;
-import org.apache.hadoop.hbase.util.Methods;
-import org.apache.hadoop.hbase.util.VersionInfo;
-import org.apache.hadoop.ipc.RemoteException;
-import org.apache.yetus.audience.InterfaceAudience;
 
 /**
  * Protobufs utility.
@@ -654,10 +654,6 @@ public final class ProtobufUtil {
             throw new DoNotRetryIOException(
                 "Missing required field: qualifier value");
           }
-          ByteBuffer qualifier =
-              qv.hasQualifier() ? qv.getQualifier().asReadOnlyByteBuffer() : null;
-          ByteBuffer value =
-              qv.hasValue() ? qv.getValue().asReadOnlyByteBuffer() : null;
           long ts = timestamp;
           if (qv.hasTimestamp()) {
             ts = qv.getTimestamp();
@@ -667,30 +663,42 @@ public final class ProtobufUtil {
             allTagsBytes = qv.getTags().toByteArray();
             if(qv.hasDeleteType()) {
               put.add(cellBuilder.clear()
-                      .setRow(proto.getRow().toByteArray())
-                      .setFamily(family)
-                      .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
-                      .setTimestamp(ts)
-                      .setType(fromDeleteType(qv.getDeleteType()).getCode())
-                      .setTags(allTagsBytes)
-                      .build());
+                  .setRow(proto.getRow().toByteArray())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(fromDeleteType(qv.getDeleteType()).getCode())
+                  .setTags(allTagsBytes)
+                  .build());
             } else {
-              List<Tag> tags =
-                  TagUtil.asList(allTagsBytes, 0, (short) allTagsBytes.length);
-              Tag[] tagsArray = new Tag[tags.size()];
-              put.addImmutable(family, qualifier, ts, value, tags.toArray(tagsArray));
+              put.add(cellBuilder.clear()
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(CellBuilder.DataType.Put)
+                  .setValue(qv.hasValue() ? qv.getValue().toByteArray() : null)
+                  .setTags(allTagsBytes)
+                  .build());
             }
           } else {
             if(qv.hasDeleteType()) {
               put.add(cellBuilder.clear()
-                      .setRow(proto.getRow().toByteArray())
-                      .setFamily(family)
-                      .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
-                      .setTimestamp(ts)
-                      .setType(fromDeleteType(qv.getDeleteType()).getCode())
-                      .build());
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(fromDeleteType(qv.getDeleteType()).getCode())
+                  .build());
             } else{
-              put.addImmutable(family, qualifier, ts, value);
+              put.add(cellBuilder.clear()
+                  .setRow(put.getRow())
+                  .setFamily(family)
+                  .setQualifier(qv.hasQualifier() ? qv.getQualifier().toByteArray() : null)
+                  .setTimestamp(ts)
+                  .setType(CellBuilder.DataType.Put)
+                  .setValue(qv.hasValue() ? qv.getValue().toByteArray() : null)
+                  .build());
             }
           }
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPut.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPut.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPut.java
index ad7d424..edc8a5a 100644
--- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPut.java
+++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestPut.java
@@ -19,18 +19,21 @@
 
 package org.apache.hadoop.hbase.client;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.testclassification.ClientTests;
 import org.apache.hadoop.hbase.testclassification.SmallTests;
 import org.apache.hadoop.hbase.util.Bytes;
-import org.apache.hadoop.hbase.Cell;
-
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
 @Category({ SmallTests.class, ClientTests.class })
 public class TestPut {
   @Test
@@ -66,7 +69,7 @@ public class TestPut {
 
   // HBASE-14882
   @Test
-  public void testAddImmutable() {
+  public void testAddImmutable() throws IOException {
     byte[] row        = Bytes.toBytes("immutable-row");
     byte[] family     = Bytes.toBytes("immutable-family");
 
@@ -77,9 +80,24 @@ public class TestPut {
     byte[] value1     = Bytes.toBytes("immutable-value-1");
     long   ts1        = 5000L;
 
-    Put put = new Put(row, true);  // "true" indicates that the input row is immutable
-    put.addImmutable(family, qualifier0, value0);
-    put.addImmutable(family, qualifier1, ts1, value1);
+    // "true" indicates that the input row is immutable
+    Put put = new Put(row, true);
+    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(row)
+            .setFamily(family)
+            .setQualifier(qualifier0)
+            .setTimestamp(put.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(value0)
+            .build())
+        .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(row)
+            .setFamily(family)
+            .setQualifier(qualifier1)
+            .setTimestamp(ts1)
+            .setType(CellBuilder.DataType.Put)
+            .setValue(value1)
+            .build());
 
     // Verify the cell of family:qualifier0
     Cell cell0 = put.get(family, qualifier0).get(0);

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-examples/src/main/java/org/apache/hadoop/hbase/client/example/MultiThreadedClientExample.java
----------------------------------------------------------------------
diff --git a/hbase-examples/src/main/java/org/apache/hadoop/hbase/client/example/MultiThreadedClientExample.java b/hbase-examples/src/main/java/org/apache/hadoop/hbase/client/example/MultiThreadedClientExample.java
index aebc666..5d95fde 100644
--- a/hbase-examples/src/main/java/org/apache/hadoop/hbase/client/example/MultiThreadedClientExample.java
+++ b/hbase-examples/src/main/java/org/apache/hadoop/hbase/client/example/MultiThreadedClientExample.java
@@ -22,6 +22,9 @@ import org.apache.hadoop.hbase.shaded.com.google.common.util.concurrent.ThreadFa
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configured;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Connection;
 import org.apache.hadoop.hbase.client.ConnectionFactory;
@@ -218,7 +221,14 @@ public class MultiThreadedClientExample extends Configured implements Tool {
         for (int i = 0; i < 30; i++) {
           byte[] rk = Bytes.toBytes(ThreadLocalRandom.current().nextLong());
           Put p = new Put(rk);
-          p.addImmutable(FAMILY, QUAL, value);
+          p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                .setRow(rk)
+                .setFamily(FAMILY)
+                .setQualifier(QUAL)
+                .setTimestamp(p.getTimeStamp())
+                .setType(CellBuilder.DataType.Put)
+                .setValue(value)
+                .build());
           puts.add(p);
         }
 
@@ -248,7 +258,14 @@ public class MultiThreadedClientExample extends Configured implements Tool {
         byte[] value = Bytes.toBytes(Double.toString(ThreadLocalRandom.current().nextDouble()));
         byte[] rk = Bytes.toBytes(ThreadLocalRandom.current().nextLong());
         Put p = new Put(rk);
-        p.addImmutable(FAMILY, QUAL, value);
+        p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                .setRow(rk)
+                .setFamily(FAMILY)
+                .setQualifier(QUAL)
+                .setTimestamp(p.getTimeStamp())
+                .setType(CellBuilder.DataType.Put)
+                .setValue(value)
+                .build());
         t.put(p);
       }
       return true;

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java
----------------------------------------------------------------------
diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java
index 7079fe7..dead804 100644
--- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java
+++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java
@@ -39,6 +39,9 @@ import javax.ws.rs.core.UriInfo;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
@@ -238,7 +241,14 @@ public class RowResource extends ResourceBase {
               .type(MIMETYPE_TEXT).entity("Bad request" + CRLF)
               .build();
           }
-          put.addImmutable(parts[0], parts[1], cell.getTimestamp(), cell.getValue());
+          put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(put.getRow())
+              .setFamily(parts[0])
+              .setQualifier(parts[1])
+              .setTimestamp(cell.getTimestamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(cell.getValue())
+              .build());
         }
         puts.add(put);
         if (LOG.isTraceEnabled()) {
@@ -306,7 +316,14 @@ public class RowResource extends ResourceBase {
           .type(MIMETYPE_TEXT).entity("Bad request" + CRLF)
           .build();
       }
-      put.addImmutable(parts[0], parts[1], timestamp, message);
+      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+        .setRow(put.getRow())
+        .setFamily(parts[0])
+        .setQualifier(parts[1])
+        .setTimestamp(timestamp)
+        .setType(CellBuilder.DataType.Put)
+        .setValue(message)
+        .build());
       table = servlet.getTable(tableResource.getName());
       table.put(put);
       if (LOG.isTraceEnabled()) {
@@ -496,8 +513,14 @@ public class RowResource extends ResourceBase {
                     .type(MIMETYPE_TEXT).entity("Bad request" + CRLF)
                     .build();
           }
-          put.addImmutable(parts[0], parts[1], cell.getTimestamp(), cell.getValue());
-
+          put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(put.getRow())
+              .setFamily(parts[0])
+              .setQualifier(parts[1])
+              .setTimestamp(cell.getTimestamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(cell.getValue())
+              .build());
           if(Bytes.equals(col,
                   valueToCheckCell.getColumn())) {
             valueToPutCell = cell;

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java
index baad21b..14b2466 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/favored/FavoredNodeAssignmentHelper.java
@@ -35,6 +35,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.HBaseIOException;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.MetaTableAccessor;
@@ -176,8 +179,14 @@ public class FavoredNodeAssignmentHelper {
     if (favoredNodeList != null) {
       put = MetaTableAccessor.makePutFromRegionInfo(regionInfo);
       byte[] favoredNodes = getFavoredNodes(favoredNodeList);
-      put.addImmutable(HConstants.CATALOG_FAMILY, FAVOREDNODES_QUALIFIER,
-          EnvironmentEdgeManager.currentTime(), favoredNodes);
+      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+          .setRow(put.getRow())
+          .setFamily(HConstants.CATALOG_FAMILY)
+          .setQualifier(FAVOREDNODES_QUALIFIER)
+          .setTimestamp(EnvironmentEdgeManager.currentTime())
+          .setType(CellBuilder.DataType.Put)
+          .setValue(favoredNodes)
+          .build());
       LOG.debug("Create the region " + regionInfo.getRegionNameAsString() +
                  " with favored nodes " + favoredNodeList);
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java
index a270408..6a138ff 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/TableNamespaceManager.java
@@ -26,6 +26,9 @@ import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
 import org.apache.hadoop.hbase.HConstants;
@@ -34,6 +37,7 @@ import org.apache.hadoop.hbase.MetaTableAccessor;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.ZKNamespaceManager;
+import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.apache.hadoop.hbase.client.Delete;
 import org.apache.hadoop.hbase.client.Get;
@@ -149,10 +153,16 @@ public class TableNamespaceManager {
     if (nsTable == null) {
       throw new IOException(this.getClass().getName() + " isn't ready to serve");
     }
-    Put p = new Put(Bytes.toBytes(ns.getName()));
-    p.addImmutable(HTableDescriptor.NAMESPACE_FAMILY_INFO_BYTES,
-        HTableDescriptor.NAMESPACE_COL_DESC_BYTES,
-        ProtobufUtil.toProtoNamespaceDescriptor(ns).toByteArray());
+    byte[] row = Bytes.toBytes(ns.getName());
+    Put p = new Put(row, true);
+    p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+          .setRow(row)
+          .setFamily(TableDescriptorBuilder.NAMESPACE_FAMILY_INFO_BYTES)
+          .setQualifier(TableDescriptorBuilder.NAMESPACE_COL_DESC_BYTES)
+          .setTimestamp(p.getTimeStamp())
+          .setType(CellBuilder.DataType.Put)
+          .setValue(ProtobufUtil.toProtoNamespaceDescriptor(ns).toByteArray())
+          .build());
     nsTable.put(p);
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java
index d428995..0b49b36 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java
@@ -23,10 +23,12 @@ import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.MetaTableAccessor;
@@ -178,12 +180,24 @@ public class RegionStateStore {
     } else if (regionLocation != null && !regionLocation.equals(lastHost)) {
       // Ideally, if no regionLocation, write null to the hbase:meta but this will confuse clients
       // currently; they want a server to hit. TODO: Make clients wait if no location.
-      put.addImmutable(HConstants.CATALOG_FAMILY, getServerNameColumn(replicaId),
-          Bytes.toBytes(regionLocation.getServerName()));
+      put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+          .setRow(put.getRow())
+          .setFamily(HConstants.CATALOG_FAMILY)
+          .setQualifier(getServerNameColumn(replicaId))
+          .setTimestamp(put.getTimeStamp())
+          .setType(CellBuilder.DataType.Put)
+          .setValue(Bytes.toBytes(regionLocation.getServerName()))
+          .build());
       info.append(", regionLocation=").append(regionLocation);
     }
-    put.addImmutable(HConstants.CATALOG_FAMILY, getStateColumn(replicaId),
-      Bytes.toBytes(state.name()));
+    put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+        .setRow(put.getRow())
+        .setFamily(HConstants.CATALOG_FAMILY)
+        .setQualifier(getStateColumn(replicaId))
+        .setTimestamp(put.getTimeStamp())
+        .setType(CellBuilder.DataType.Put)
+        .setValue(Bytes.toBytes(state.name()))
+        .build());
     LOG.info(info);
 
     final boolean serialReplication = hasSerialReplicationScope(regionInfo.getTable());

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlLists.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlLists.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlLists.java
index ecd937b..f5d70f6 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlLists.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessControlLists.java
@@ -37,6 +37,9 @@ import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.AuthUtil;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompareOperator;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
@@ -165,8 +168,14 @@ public class AccessControlLists {
     for (Permission.Action action : actionSet) {
       value[index++] = action.code();
     }
-
-    p.addImmutable(ACL_LIST_FAMILY, key, value);
+    p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+        .setRow(p.getRow())
+        .setFamily(ACL_LIST_FAMILY)
+        .setQualifier(key)
+        .setTimestamp(p.getTimeStamp())
+        .setType(CellBuilder.DataType.Put)
+        .setValue(value)
+        .build());
     if (LOG.isDebugEnabled()) {
       LOG.debug("Writing permission with rowKey "+
           Bytes.toString(rowKey)+" "+
@@ -744,7 +753,7 @@ public class AccessControlLists {
         // Deserialize the table permissions from the KV
         // TODO: This can be improved. Don't build UsersAndPermissions just to unpack it again,
         // use the builder
-        AccessControlProtos.UsersAndPermissions.Builder builder = 
+        AccessControlProtos.UsersAndPermissions.Builder builder =
             AccessControlProtos.UsersAndPermissions.newBuilder();
         if (tag.hasArray()) {
           ProtobufUtil.mergeFrom(builder, tag.getValueArray(), tag.getValueOffset(), tag.getValueLength());

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java
index ca66295..d1fac75 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/visibility/DefaultVisibilityLabelServiceImpl.java
@@ -28,6 +28,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.DataOutputStream;
 import java.io.IOException;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collections;
 import java.util.HashMap;
@@ -45,7 +46,12 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.AuthUtil;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
+import org.apache.hadoop.hbase.ExtendedCellBuilder;
+import org.apache.hadoop.hbase.ExtendedCellBuilderFactory;
 import org.apache.hadoop.hbase.HConstants.OperationStatusCode;
 import org.apache.hadoop.hbase.PrivateCellUtil;
 import org.apache.hadoop.hbase.Tag;
@@ -205,8 +211,16 @@ public class DefaultVisibilityLabelServiceImpl implements VisibilityLabelService
   protected void addSystemLabel(Region region, Map<String, Integer> labels,
       Map<String, List<Integer>> userAuths) throws IOException {
     if (!labels.containsKey(SYSTEM_LABEL)) {
-      Put p = new Put(Bytes.toBytes(SYSTEM_LABEL_ORDINAL));
-      p.addImmutable(LABELS_TABLE_FAMILY, LABEL_QUALIFIER, Bytes.toBytes(SYSTEM_LABEL));
+      byte[] row = Bytes.toBytes(SYSTEM_LABEL_ORDINAL);
+      Put p = new Put(row);
+      p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                    .setRow(row)
+                    .setFamily(LABELS_TABLE_FAMILY)
+                    .setQualifier(LABEL_QUALIFIER)
+                    .setTimestamp(p.getTimeStamp())
+                    .setType(CellBuilder.DataType.Put)
+                    .setValue(Bytes.toBytes(SYSTEM_LABEL))
+                    .build());
       region.put(p);
       labels.put(SYSTEM_LABEL, SYSTEM_LABEL_ORDINAL);
     }
@@ -218,14 +232,24 @@ public class DefaultVisibilityLabelServiceImpl implements VisibilityLabelService
     OperationStatus[] finalOpStatus = new OperationStatus[labels.size()];
     List<Mutation> puts = new ArrayList<>(labels.size());
     int i = 0;
+    ExtendedCellBuilder builder = ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
     for (byte[] label : labels) {
       String labelStr = Bytes.toString(label);
       if (this.labelsCache.getLabelOrdinal(labelStr) > 0) {
         finalOpStatus[i] = new OperationStatus(OperationStatusCode.FAILURE,
             new LabelAlreadyExistsException("Label '" + labelStr + "' already exists"));
       } else {
-        Put p = new Put(Bytes.toBytes(ordinalCounter.get()));
-        p.addImmutable(LABELS_TABLE_FAMILY, LABEL_QUALIFIER, label, LABELS_TABLE_TAGS);
+        byte[] row = Bytes.toBytes(ordinalCounter.get());
+        Put p = new Put(row);
+        p.add(builder.clear()
+              .setRow(row)
+              .setFamily(LABELS_TABLE_FAMILY)
+              .setQualifier(LABEL_QUALIFIER)
+              .setTimestamp(p.getTimeStamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(label)
+              .setTags(Tag.fromList(Arrays.asList(LABELS_TABLE_TAGS)))
+              .build());
         if (LOG.isDebugEnabled()) {
           LOG.debug("Adding the label " + labelStr);
         }
@@ -246,6 +270,7 @@ public class DefaultVisibilityLabelServiceImpl implements VisibilityLabelService
     OperationStatus[] finalOpStatus = new OperationStatus[authLabels.size()];
     List<Mutation> puts = new ArrayList<>(authLabels.size());
     int i = 0;
+    ExtendedCellBuilder builder = ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
     for (byte[] auth : authLabels) {
       String authStr = Bytes.toString(auth);
       int labelOrdinal = this.labelsCache.getLabelOrdinal(authStr);
@@ -254,8 +279,17 @@ public class DefaultVisibilityLabelServiceImpl implements VisibilityLabelService
         finalOpStatus[i] = new OperationStatus(OperationStatusCode.FAILURE,
             new InvalidLabelException("Label '" + authStr + "' doesn't exists"));
       } else {
-        Put p = new Put(Bytes.toBytes(labelOrdinal));
-        p.addImmutable(LABELS_TABLE_FAMILY, user, DUMMY_VALUE, LABELS_TABLE_TAGS);
+        byte[] row = Bytes.toBytes(labelOrdinal);
+        Put p = new Put(row);
+        p.add(builder.clear()
+            .setRow(row)
+            .setFamily(LABELS_TABLE_FAMILY)
+            .setQualifier(user)
+            .setTimestamp(p.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(DUMMY_VALUE)
+            .setTags(Tag.fromList(Arrays.asList(LABELS_TABLE_TAGS)))
+            .build());
         puts.add(p);
       }
       i++;

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMultiRespectsLimits.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMultiRespectsLimits.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMultiRespectsLimits.java
index f718773..d3673c4 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMultiRespectsLimits.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestMultiRespectsLimits.java
@@ -18,6 +18,9 @@
 
 package org.apache.hadoop.hbase.client;
 
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CompatibilityFactory;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HColumnDescriptor;
@@ -149,7 +152,14 @@ public class TestMultiRespectsLimits {
 
     for (byte[] col:cols) {
       Put p = new Put(row);
-      p.addImmutable(FAMILY, col, value);
+      p.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(row)
+              .setFamily(FAMILY)
+              .setQualifier(col)
+              .setTimestamp(p.getTimeStamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(value)
+              .build());
       t.put(p);
     }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
index 4eb43b2..f7b7898 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestCompactionLifeCycleTracker.java
@@ -28,7 +28,11 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.Put;
@@ -143,11 +147,29 @@ public class TestCompactionLifeCycleTracker {
             .addCoprocessor(CompactionObserver.class.getName()).build());
     try (Table table = UTIL.getConnection().getTable(NAME)) {
       for (int i = 0; i < 100; i++) {
-        table.put(new Put(Bytes.toBytes(i)).addImmutable(CF1, QUALIFIER, Bytes.toBytes(i)));
+        byte[] row = Bytes.toBytes(i);
+        table.put(new Put(row)
+                    .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                        .setRow(row)
+                        .setFamily(CF1)
+                        .setQualifier(QUALIFIER)
+                        .setTimestamp(HConstants.LATEST_TIMESTAMP)
+                        .setType(CellBuilder.DataType.Put)
+                        .setValue(Bytes.toBytes(i))
+                        .build()));
       }
       UTIL.getAdmin().flush(NAME);
       for (int i = 100; i < 200; i++) {
-        table.put(new Put(Bytes.toBytes(i)).addImmutable(CF1, QUALIFIER, Bytes.toBytes(i)));
+        byte[] row = Bytes.toBytes(i);
+        table.put(new Put(row)
+                    .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                        .setRow(row)
+                        .setFamily(CF1)
+                        .setQualifier(QUALIFIER)
+                        .setTimestamp(HConstants.LATEST_TIMESTAMP)
+                        .setType(CellBuilder.DataType.Put)
+                        .setValue(Bytes.toBytes(i))
+                        .build()));
       }
       UTIL.getAdmin().flush(NAME);
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
index 7ef1f69..80bd906 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushLifeCycleTracker.java
@@ -28,7 +28,11 @@ import java.io.InterruptedIOException;
 import java.util.Optional;
 import java.util.concurrent.CountDownLatch;
 
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.Put;
@@ -189,7 +193,16 @@ public class TestFlushLifeCycleTracker {
   public void test() throws IOException, InterruptedException {
     try (Table table = UTIL.getConnection().getTable(NAME)) {
       for (int i = 0; i < 100; i++) {
-        table.put(new Put(Bytes.toBytes(i)).addImmutable(CF, QUALIFIER, Bytes.toBytes(i)));
+        byte[] row = Bytes.toBytes(i);
+        table.put(new Put(row, true)
+                    .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                        .setRow(row)
+                        .setFamily(CF)
+                        .setQualifier(QUALIFIER)
+                        .setTimestamp(HConstants.LATEST_TIMESTAMP)
+                        .setType(CellBuilder.DataType.Put)
+                        .setValue(Bytes.toBytes(i))
+                        .build()));
       }
     }
     Tracker tracker = new Tracker();
@@ -214,7 +227,16 @@ public class TestFlushLifeCycleTracker {
   public void testNotExecuted() throws IOException, InterruptedException {
     try (Table table = UTIL.getConnection().getTable(NAME)) {
       for (int i = 0; i < 100; i++) {
-        table.put(new Put(Bytes.toBytes(i)).addImmutable(CF, QUALIFIER, Bytes.toBytes(i)));
+        byte[] row = Bytes.toBytes(i);
+        table.put(new Put(row, true)
+                    .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                        .setRow(row)
+                        .setFamily(CF)
+                        .setQualifier(QUALIFIER)
+                        .setTimestamp(HConstants.LATEST_TIMESTAMP)
+                        .setType(CellBuilder.DataType.Put)
+                        .setValue(Bytes.toBytes(i))
+                        .build()));
       }
     }
     // here we may have overlap when calling the CP hooks so we do not assert on TRACKER

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
index dc4027e..acbdf7d 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java
@@ -74,6 +74,9 @@ import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.CategoryBasedTimeout;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompareOperator;
 import org.apache.hadoop.hbase.CompatibilitySingletonFactory;
@@ -6274,9 +6277,26 @@ public class TestHRegion {
     final HRegion region = initHRegion(tableName, a, c, method, CONF, false, fam1);
 
     Mutation[] mutations = new Mutation[] {
-        new Put(a).addImmutable(fam1, null, null),
-        new Put(c).addImmutable(fam1, null, null), // this is outside the region boundary
-        new Put(b).addImmutable(fam1, null, null),
+        new Put(a)
+            .add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(a)
+              .setFamily(fam1)
+              .setTimestamp(HConstants.LATEST_TIMESTAMP)
+              .setType(CellBuilder.DataType.Put)
+              .build()),
+        // this is outside the region boundary
+        new Put(c).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(c)
+              .setFamily(fam1)
+              .setTimestamp(HConstants.LATEST_TIMESTAMP)
+              .setType(CellBuilder.DataType.Put)
+              .build()),
+        new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+              .setRow(b)
+              .setFamily(fam1)
+              .setTimestamp(HConstants.LATEST_TIMESTAMP)
+              .setType(CellBuilder.DataType.Put)
+              .build())
     };
 
     OperationStatus[] status = region.batchMutate(mutations);
@@ -6307,8 +6327,18 @@ public class TestHRegion {
       @Override
       public Void call() throws Exception {
         Mutation[] mutations = new Mutation[] {
-            new Put(a).addImmutable(fam1, null, null),
-            new Put(b).addImmutable(fam1, null, null),
+            new Put(a).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                .setRow(a)
+                .setFamily(fam1)
+                .setTimestamp(HConstants.LATEST_TIMESTAMP)
+                .setType(CellBuilder.DataType.Put)
+                .build()),
+            new Put(b).add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+                .setRow(b)
+                .setFamily(fam1)
+                .setTimestamp(HConstants.LATEST_TIMESTAMP)
+                .setType(CellBuilder.DataType.Put)
+                .build()),
         };
 
         // this will wait for the row lock, and it will eventually succeed

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
index be99254..cfe4157 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/visibility/ExpAsStringVisibilityLabelServiceImpl.java
@@ -38,6 +38,9 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.ArrayBackedTag;
 import org.apache.hadoop.hbase.AuthUtil;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.HConstants.OperationStatusCode;
 import org.apache.hadoop.hbase.PrivateCellUtil;
 import org.apache.hadoop.hbase.Tag;
@@ -101,8 +104,16 @@ public class ExpAsStringVisibilityLabelServiceImpl implements VisibilityLabelSer
     assert labelsRegion != null;
     OperationStatus[] finalOpStatus = new OperationStatus[authLabels.size()];
     Put p = new Put(user);
+    CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
     for (byte[] auth : authLabels) {
-      p.addImmutable(LABELS_TABLE_FAMILY, auth, DUMMY_VALUE);
+      p.add(builder.clear()
+          .setRow(p.getRow())
+          .setFamily(LABELS_TABLE_FAMILY)
+          .setQualifier(auth)
+          .setTimestamp(p.getTimeStamp())
+          .setType(CellBuilder.DataType.Put)
+          .setValue(DUMMY_VALUE)
+          .build());
     }
     this.labelsRegion.put(p);
     // This is a testing impl and so not doing any caching

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
index cf17e52..64a60c2 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/snapshot/SnapshotTestingUtils.java
@@ -230,7 +230,9 @@ public final class SnapshotTestingUtils {
         }
       });
     }
-
+    for (byte[] b : snapshotFamilies) {
+      LOG.info("[CHIA] " + Bytes.toStringBinary(b));
+    }
     // Verify that there are store files in the specified families
     if (nonEmptyTestFamilies != null) {
       for (final byte[] familyName: nonEmptyTestFamilies) {

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/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 284379a..98e62eb 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
@@ -42,7 +42,6 @@ import javax.security.auth.callback.Callback;
 import javax.security.auth.callback.UnsupportedCallbackException;
 import javax.security.sasl.AuthorizeCallback;
 import javax.security.sasl.SaslServer;
-
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.OptionGroup;
@@ -50,6 +49,9 @@ import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HColumnDescriptor;
@@ -1327,6 +1329,7 @@ public class ThriftServerRunner implements Runnable {
         }
 
         // I apologize for all this mess :)
+        CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
         for (Mutation m : mutations) {
           byte[][] famAndQf = CellUtil.parseColumn(getBytes(m.column));
           if (m.isDelete) {
@@ -1342,9 +1345,15 @@ public class ThriftServerRunner implements Runnable {
               LOG.warn("No column qualifier specified. Delete is the only mutation supported "
                   + "over the whole column family.");
             } else {
-              put.addImmutable(famAndQf[0], famAndQf[1],
-                  m.value != null ? getBytes(m.value)
-                      : HConstants.EMPTY_BYTE_ARRAY);
+              put.add(builder.clear()
+                  .setRow(put.getRow())
+                  .setFamily(famAndQf[0])
+                  .setQualifier(famAndQf[1])
+                  .setTimestamp(put.getTimeStamp())
+                  .setType(CellBuilder.DataType.Put)
+                  .setValue(m.value != null ? getBytes(m.value)
+                      : HConstants.EMPTY_BYTE_ARRAY)
+                  .build());
             }
             put.setDurability(m.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);
           }
@@ -1378,7 +1387,7 @@ public class ThriftServerRunner implements Runnable {
         throws IOError, IllegalArgument, TException {
       List<Put> puts = new ArrayList<>();
       List<Delete> deletes = new ArrayList<>();
-
+      CellBuilder builder = CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY);
       for (BatchMutation batch : rowBatches) {
         byte[] row = getBytes(batch.row);
         List<Mutation> mutations = batch.mutations;
@@ -1403,9 +1412,19 @@ public class ThriftServerRunner implements Runnable {
                   + "over the whole column family.");
             }
             if (famAndQf.length == 2) {
-              put.addImmutable(famAndQf[0], famAndQf[1],
-                  m.value != null ? getBytes(m.value)
-                      : HConstants.EMPTY_BYTE_ARRAY);
+              try {
+                put.add(builder.clear()
+                    .setRow(put.getRow())
+                    .setFamily(famAndQf[0])
+                    .setQualifier(famAndQf[1])
+                    .setTimestamp(put.getTimeStamp())
+                    .setType(CellBuilder.DataType.Put)
+                    .setValue(m.value != null ? getBytes(m.value)
+                        : HConstants.EMPTY_BYTE_ARRAY)
+                    .build());
+              } catch (IOException e) {
+                throw new IllegalArgumentException(e);
+              }
             } else {
               throw new IllegalArgumentException("Invalid famAndQf provided.");
             }
@@ -1877,12 +1896,17 @@ public class ThriftServerRunner implements Runnable {
         addAttributes(put, attributes);
 
         byte[][] famAndQf = CellUtil.parseColumn(getBytes(mput.column));
-
-        put.addImmutable(famAndQf[0], famAndQf[1], mput.value != null ? getBytes(mput.value)
-            : HConstants.EMPTY_BYTE_ARRAY);
-
+        put.add(CellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)
+            .setRow(put.getRow())
+            .setFamily(famAndQf[0])
+            .setQualifier(famAndQf[1])
+            .setTimestamp(put.getTimeStamp())
+            .setType(CellBuilder.DataType.Put)
+            .setValue(mput.value != null ? getBytes(mput.value)
+                : HConstants.EMPTY_BYTE_ARRAY)
+            .build());
         put.setDurability(mput.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);
-      } catch (IllegalArgumentException e) {
+      } catch (IOException | IllegalArgumentException e) {
         LOG.warn(e.getMessage(), e);
         throw new IllegalArgument(Throwables.getStackTraceAsString(e));
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/70f02dbc/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
----------------------------------------------------------------------
diff --git a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
index 3c39d6a..59fe1f4 100644
--- a/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
+++ b/hbase-thrift/src/main/java/org/apache/hadoop/hbase/thrift2/ThriftUtilities.java
@@ -28,6 +28,9 @@ import java.util.Map;
 
 import org.apache.commons.collections4.MapUtils;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellBuilder;
+import org.apache.hadoop.hbase.CellBuilderFactory;
+import org.apache.hadoop.hbase.CellBuilderType;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.CompareOperator;
 import org.apache.hadoop.hbase.HConstants;
@@ -115,7 +118,7 @@ public class ThriftUtilities {
     if (in.isSetAuthorizations()) {
       out.setAuthorizations(new Authorizations(in.getAuthorizations().getLabels()));
     }
-    
+
     if (!in.isSetColumns()) {
       return out;
     }
@@ -217,20 +220,35 @@ public class ThriftUtilities {
     }
 
     for (TColumnValue columnValue : in.getColumnValues()) {
-      if (columnValue.isSetTimestamp()) {
-        out.addImmutable(
-            columnValue.getFamily(), columnValue.getQualifier(), columnValue.getTimestamp(),
-            columnValue.getValue());
-      } else {
-        out.addImmutable(
-            columnValue.getFamily(), columnValue.getQualifier(), columnValue.getValue());
+      try {
+        if (columnValue.isSetTimestamp()) {
+          out.add(CellBuilderFactory.create(CellBuilderType.DEEP_COPY)
+              .setRow(out.getRow())
+              .setFamily(columnValue.getFamily())
+              .setQualifier(columnValue.getQualifier())
+              .setTimestamp(columnValue.getTimestamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(columnValue.getValue())
+              .build());
+        } else {
+          out.add(CellBuilderFactory.create(CellBuilderType.DEEP_COPY)
+              .setRow(out.getRow())
+              .setFamily(columnValue.getFamily())
+              .setQualifier(columnValue.getQualifier())
+              .setTimestamp(out.getTimeStamp())
+              .setType(CellBuilder.DataType.Put)
+              .setValue(columnValue.getValue())
+              .build());
+        }
+      } catch (IOException e) {
+        throw new IllegalArgumentException((e));
       }
     }
 
     if (in.isSetAttributes()) {
       addAttributes(out,in.getAttributes());
     }
-    
+
     if (in.getCellVisibility() != null) {
       out.setCellVisibility(new CellVisibility(in.getCellVisibility().getExpression()));
     }
@@ -437,7 +455,7 @@ public class ThriftUtilities {
     if (in.isSetAttributes()) {
       addAttributes(out,in.getAttributes());
     }
-    
+
     if (in.isSetAuthorizations()) {
       out.setAuthorizations(new Authorizations(in.getAuthorizations().getLabels()));
     }
@@ -484,7 +502,7 @@ public class ThriftUtilities {
     if (in.isSetDurability()) {
       out.setDurability(durabilityFromThrift(in.getDurability()));
     }
-    
+
     if(in.getCellVisibility() != null) {
       out.setCellVisibility(new CellVisibility(in.getCellVisibility().getExpression()));
     }
@@ -505,7 +523,7 @@ public class ThriftUtilities {
     if (append.isSetDurability()) {
       out.setDurability(durabilityFromThrift(append.getDurability()));
     }
-    
+
     if(append.getCellVisibility() != null) {
       out.setCellVisibility(new CellVisibility(append.getCellVisibility().getExpression()));
     }