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

git commit: HBASE-12047 Avoid usage of KeyValueUtil#ensureKeyValue in simple cases.

Repository: hbase
Updated Branches:
  refs/heads/master 411991cf1 -> 791a03b40


HBASE-12047 Avoid usage of KeyValueUtil#ensureKeyValue in simple cases.


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

Branch: refs/heads/master
Commit: 791a03b40ff31f92ade454ffe00c57b39d3ccfde
Parents: 411991c
Author: anoopsjohn <an...@gmail.com>
Authored: Tue Sep 23 16:42:01 2014 +0530
Committer: anoopsjohn <an...@gmail.com>
Committed: Tue Sep 23 16:42:01 2014 +0530

----------------------------------------------------------------------
 .../org/apache/hadoop/hbase/client/Append.java  |   7 +-
 .../org/apache/hadoop/hbase/client/HTable.java  |   5 +-
 .../apache/hadoop/hbase/client/Increment.java   |  17 ++-
 .../hadoop/hbase/client/ScannerCallable.java    |   7 +-
 .../hadoop/hbase/filter/FuzzyRowFilter.java     |   2 +-
 .../hadoop/hbase/protobuf/ProtobufUtil.java     |  32 +++---
 .../io/encoding/BufferedDataBlockEncoder.java   |  16 ++-
 .../hbase/client/ClientSideRegionScanner.java   |   6 +-
 .../hadoop/hbase/regionserver/HRegion.java      | 105 +++++++++----------
 .../hadoop/hbase/regionserver/StoreFlusher.java |   5 +-
 .../regionserver/ReplicationSink.java           |   5 +-
 .../hadoop/hbase/rest/client/RemoteHTable.java  |  12 +--
 .../hadoop/hbase/rest/model/CellModel.java      |   8 +-
 .../hbase/security/access/AccessController.java |  37 +++----
 .../hadoop/hbase/thrift2/ThriftUtilities.java   |  11 +-
 15 files changed, 124 insertions(+), 151 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java
index 054c9b4..7d8f01b 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Append.java
@@ -26,8 +26,8 @@ import java.util.UUID;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.security.access.Permission;
 import org.apache.hadoop.hbase.security.visibility.CellVisibility;
 import org.apache.hadoop.hbase.util.Bytes;
@@ -121,14 +121,13 @@ public class Append extends Mutation {
   @SuppressWarnings("unchecked")
   public Append add(final Cell cell) {
     // Presume it is KeyValue for now.
-    KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-    byte [] family = kv.getFamily();
+    byte [] family = CellUtil.cloneFamily(cell);
     List<Cell> list = this.familyMap.get(family);
     if (list == null) {
       list  = new ArrayList<Cell>();
     }
     // find where the new entry should be placed in the List
-    list.add(kv);
+    list.add(cell);
     this.familyMap.put(family, list);
     return this;
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
index 0006ef4..8e5558d 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/HTable.java
@@ -46,7 +46,6 @@ import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
 import org.apache.hadoop.hbase.HTableDescriptor;
-import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.RegionLocations;
 import org.apache.hadoop.hbase.ServerName;
@@ -1449,9 +1448,7 @@ public class HTable implements HTableInterface, RegionLocator {
     if (maxKeyValueSize > 0) {
       for (List<Cell> list : put.getFamilyCellMap().values()) {
         for (Cell cell : list) {
-          // KeyValue v1 expectation.  Cast for now.
-          KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-          if (kv.getLength() > maxKeyValueSize) {
+          if (KeyValueUtil.length(cell) > maxKeyValueSize) {
             throw new IllegalArgumentException("KeyValue size too large");
           }
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java
index 1560da5..a187d51 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Increment.java
@@ -28,6 +28,7 @@ import java.util.UUID;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.io.TimeRange;
@@ -97,17 +98,16 @@ public class Increment extends Mutation implements Comparable<Row> {
    */
   @SuppressWarnings("unchecked")
   public Increment add(Cell cell) throws IOException{
-    KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-    byte [] family = kv.getFamily();
+    byte [] family = CellUtil.cloneFamily(cell);
     List<Cell> list = getCellList(family);
     //Checking that the row of the kv is the same as the put
     int res = Bytes.compareTo(this.row, 0, row.length,
-        kv.getRowArray(), kv.getRowOffset(), kv.getRowLength());
+        cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
     if (res != 0) {
-      throw new WrongRowIOException("The row in " + kv.toString() +
+      throw new WrongRowIOException("The row in " + cell +
         " doesn't match the original one " +  Bytes.toStringBinary(this.row));
     }
-    list.add(kv);
+    list.add(cell);
     familyMap.put(family, list);
     return this;
   }
@@ -133,7 +133,7 @@ public class Increment extends Mutation implements Comparable<Row> {
     List<Cell> list = getCellList(family);
     KeyValue kv = createPutKeyValue(family, qualifier, ts, Bytes.toBytes(amount));
     list.add(kv);
-    familyMap.put(kv.getFamily(), list);
+    familyMap.put(CellUtil.cloneFamily(kv), list);
     return this;
   }
 
@@ -197,9 +197,8 @@ public class Increment extends Mutation implements Comparable<Row> {
     for (Map.Entry<byte [], List<Cell>> entry: map.entrySet()) {
       NavigableMap<byte [], Long> longs = new TreeMap<byte [], Long>(Bytes.BYTES_COMPARATOR);
       for (Cell cell: entry.getValue()) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        longs.put(kv.getQualifier(),
-            Bytes.toLong(kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));
+        longs.put(CellUtil.cloneQualifier(cell),
+            Bytes.toLong(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
       }
       results.put(entry.getKey(), longs);
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java
index f62d6bc..d002362 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/ScannerCallable.java
@@ -28,11 +28,11 @@ import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellScanner;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.DoNotRetryIOException;
 import org.apache.hadoop.hbase.HBaseIOException;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HRegionLocation;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.NotServingRegionException;
 import org.apache.hadoop.hbase.RegionLocations;
 import org.apache.hadoop.hbase.ServerName;
@@ -292,9 +292,8 @@ public class ScannerCallable extends RegionServerCallable<Result[]> {
     }
     long resultSize = 0;
     for (Result rr : rrs) {
-      for (Cell kv : rr.rawCells()) {
-        // TODO add getLength to Cell/use CellUtil#estimatedSizeOf
-        resultSize += KeyValueUtil.ensureKeyValue(kv).getLength();
+      for (Cell cell : rr.rawCells()) {
+        resultSize += CellUtil.estimatedLengthOf(cell);
       }
     }
     this.scanMetrics.countOfBytesInResults.addAndGet(resultSize);

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
----------------------------------------------------------------------
diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
index 0cfde8f..e60c5d5 100644
--- a/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
+++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/filter/FuzzyRowFilter.java
@@ -119,7 +119,7 @@ public class FuzzyRowFilter extends FilterBase {
       // TODO: is there a better way than throw exception? (stop the scanner?)
       throw new IllegalStateException("No next row key that satisfies fuzzy exists when"
           + " getNextKeyHint() is invoked." + " Filter: " + this.toString() + " currentKV: "
-          + KeyValueUtil.ensureKeyValue(currentCell).toString());
+          + currentCell);
     }
 
     return KeyValueUtil.createFirstOnRow(nextRowKey);

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/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 dff4388..635daa1 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
@@ -673,7 +673,7 @@ public final class ProtobufUtil {
           delete =
             new Delete(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(), timestamp);
         }
-        delete.addDeleteMarker(KeyValueUtil.ensureKeyValue(cell));
+        delete.addDeleteMarker(cell);
       }
     } else {
       delete = new Delete(row, timestamp);
@@ -737,7 +737,7 @@ public final class ProtobufUtil {
         if (append == null) {
           append = new Append(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
         }
-        append.add(KeyValueUtil.ensureKeyValue(cell));
+        append.add(cell);
       }
     } else {
       append = new Append(row);
@@ -816,7 +816,7 @@ public final class ProtobufUtil {
         if (increment == null) {
           increment = new Increment(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength());
         }
-        increment.add(KeyValueUtil.ensureKeyValue(cell));
+        increment.add(cell);
       }
     } else {
       increment = new Increment(row);
@@ -1126,14 +1126,13 @@ public final class ProtobufUtil {
       List<Cell> values = family.getValue();
       if (values != null && values.size() > 0) {
         for (Cell cell: values) {
-          KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
           valueBuilder.setQualifier(ByteStringer.wrap(
-              kv.getQualifierArray(), kv.getQualifierOffset(), kv.getQualifierLength()));
+              cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
           valueBuilder.setValue(ByteStringer.wrap(
-              kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));
-          if (kv.getTagsLength() > 0) {
-            valueBuilder.setTags(ByteStringer.wrap(kv.getTagsArray(),
-                kv.getTagsOffset(), kv.getTagsLength()));
+              cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
+          if (cell.getTagsLength() > 0) {
+            valueBuilder.setTags(ByteStringer.wrap(cell.getTagsArray(),
+                cell.getTagsOffset(), cell.getTagsLength()));
           }
           columnBuilder.addQualifierValue(valueBuilder.build());
         }
@@ -1189,18 +1188,17 @@ public final class ProtobufUtil {
       columnBuilder.clear();
       columnBuilder.setFamily(ByteStringer.wrap(family.getKey()));
       for (Cell cell: family.getValue()) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
         valueBuilder.setQualifier(ByteStringer.wrap(
-            kv.getQualifierArray(), kv.getQualifierOffset(), kv.getQualifierLength()));
+            cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()));
         valueBuilder.setValue(ByteStringer.wrap(
-            kv.getValueArray(), kv.getValueOffset(), kv.getValueLength()));
-        valueBuilder.setTimestamp(kv.getTimestamp());
+            cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
+        valueBuilder.setTimestamp(cell.getTimestamp());
         if(cell.getTagsLength() > 0) {
-          valueBuilder.setTags(ByteStringer.wrap(kv.getTagsArray(), kv.getTagsOffset(),
-              kv.getTagsLength()));
+          valueBuilder.setTags(ByteStringer.wrap(cell.getTagsArray(), cell.getTagsOffset(),
+              cell.getTagsLength()));
         }
-        if (type == MutationType.DELETE || (type == MutationType.PUT && CellUtil.isDelete(kv))) {
-          KeyValue.Type keyValueType = KeyValue.Type.codeToType(kv.getType());
+        if (type == MutationType.DELETE || (type == MutationType.PUT && CellUtil.isDelete(cell))) {
+          KeyValue.Type keyValueType = KeyValue.Type.codeToType(cell.getTypeByte());
           valueBuilder.setDeleteType(toDeleteType(keyValueType));
         }
         columnBuilder.addQualifierValue(valueBuilder.build());

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
----------------------------------------------------------------------
diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
index 6a821d3..95a50ac 100644
--- a/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
+++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java
@@ -24,6 +24,7 @@ import java.nio.ByteBuffer;
 import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.SettableSequenceId;
@@ -475,34 +476,31 @@ abstract class BufferedDataBlockEncoder implements DataBlockEncoder {
     @Override
     @Deprecated
     public byte[] getValue() {
-      throw new UnsupportedOperationException("getValue() not supported");
+      return CellUtil.cloneValue(this);
     }
 
     @Override
     @Deprecated
     public byte[] getFamily() {
-      throw new UnsupportedOperationException("getFamily() not supported");
+      return CellUtil.cloneFamily(this);
     }
 
     @Override
     @Deprecated
     public byte[] getQualifier() {
-      throw new UnsupportedOperationException("getQualifier() not supported");
+      return CellUtil.cloneQualifier(this);
     }
 
     @Override
     @Deprecated
     public byte[] getRow() {
-      throw new UnsupportedOperationException("getRow() not supported");
+      return CellUtil.cloneRow(this);
     }
 
     @Override
     public String toString() {
-      KeyValue kv = KeyValueUtil.copyToNewKeyValue(this);
-      if (kv == null) {
-        return "null";
-      }
-      return kv.toString();
+      return KeyValue.keyToString(this.keyOnlyBuffer, 0, KeyValueUtil.keyLength(this)) + "/vlen="
+          + getValueLength() + "/seqid=" + seqId;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java
index db2717f..60d5212 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/client/ClientSideRegionScanner.java
@@ -27,6 +27,7 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValueUtil;
@@ -84,9 +85,8 @@ public class ClientSideRegionScanner extends AbstractClientScanner {
     Result result = Result.create(values);
     if (this.scanMetrics != null) {
       long resultSize = 0;
-      for (Cell kv : values) {
-        // TODO add getLength to Cell/use CellUtil#estimatedSizeOf
-        resultSize += KeyValueUtil.ensureKeyValue(kv).getLength();
+      for (Cell cell : values) {
+        resultSize += CellUtil.estimatedLengthOf(cell);
       }
       this.scanMetrics.countOfBytesInResults.addAndGet(resultSize);
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/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 490f2b2..94cc5b2 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
@@ -145,10 +145,8 @@ import org.apache.hadoop.hbase.util.HashedBytes;
 import org.apache.hadoop.hbase.util.Pair;
 import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil;
 import org.apache.hadoop.hbase.util.Threads;
-import org.apache.hadoop.hbase.zookeeper.ZKSplitLog;
 import org.apache.hadoop.io.MultipleIOException;
 import org.apache.hadoop.util.StringUtils;
-import org.apache.zookeeper.KeeperException;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
@@ -3102,7 +3100,7 @@ public class HRegion implements HeapSize { // , Writable{
         CellUtil.setSequenceId(cell, mvccNum);
         Pair<Long, Cell> ret = store.add(cell);
         size += ret.getFirst();
-        memstoreCells.add(KeyValueUtil.ensureKeyValue(ret.getSecond()));
+        memstoreCells.add(ret.getSecond());
       }
     }
 
@@ -3118,7 +3116,7 @@ public class HRegion implements HeapSize { // , Writable{
     int kvsRolledback = 0;
 
     for (Cell cell : memstoreCells) {
-      byte[] family = cell.getFamily();
+      byte[] family = CellUtil.cloneFamily(cell);
       Store store = getStore(family);
       store.rollback(cell);
       kvsRolledback++;
@@ -3170,8 +3168,8 @@ public class HRegion implements HeapSize { // , Writable{
     for (List<Cell> kvs : familyMap.values()) {
       for (Cell cell : kvs) {
         // see if the user-side TS is out of range. latest = server-side
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        if (!kv.isLatestTimestamp() && kv.getTimestamp() > maxTs) {
+        long ts = cell.getTimestamp();
+        if (ts != HConstants.LATEST_TIMESTAMP && ts > maxTs) {
           throw new FailedSanityCheckException("Timestamp for KV out of range "
               + cell + " (too.new=" + timestampSlop + ")");
         }
@@ -4935,8 +4933,8 @@ public class HRegion implements HeapSize { // , Writable{
     // do after lock
     if (this.metricsRegion != null) {
       long totalSize = 0l;
-      for (Cell kv : results) {
-        totalSize += KeyValueUtil.ensureKeyValue(kv).getLength();
+      for (Cell cell : results) {
+        totalSize += CellUtil.estimatedLengthOf(cell);
       }
       this.metricsRegion.updateGet(totalSize);
     }
@@ -5123,8 +5121,8 @@ public class HRegion implements HeapSize { // , Writable{
               processor.getRowsToLock().iterator().next()) + "...");
           for (Mutation m : mutations) {
             for (CellScanner cellScanner = m.cellScanner(); cellScanner.advance();) {
-              KeyValue kv = KeyValueUtil.ensureKeyValue(cellScanner.current());
-              getStore(kv).rollback(kv);
+              Cell cell = cellScanner.current();
+              getStore(cell).rollback(cell);
             }
           }
         }
@@ -5283,60 +5281,61 @@ public class HRegion implements HeapSize { // , Writable{
             // Would be nice if KeyValue had scatter/gather logic
             int idx = 0;
             for (Cell cell : family.getValue()) {
-              KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-              KeyValue newKV;
-              KeyValue oldKv = null;
+              Cell newCell;
+              Cell oldCell = null;
               if (idx < results.size()
-                  && CellUtil.matchingQualifier(results.get(idx),kv)) {
-                oldKv = KeyValueUtil.ensureKeyValue(results.get(idx));
+                  && CellUtil.matchingQualifier(results.get(idx), cell)) {
+                oldCell = results.get(idx);
                 // allocate an empty kv once
-                newKV = new KeyValue(row.length, kv.getFamilyLength(),
-                    kv.getQualifierLength(), now, KeyValue.Type.Put,
-                    oldKv.getValueLength() + kv.getValueLength(),
-                    oldKv.getTagsLength() + kv.getTagsLength());
+                newCell = new KeyValue(row.length, cell.getFamilyLength(),
+                    cell.getQualifierLength(), now, KeyValue.Type.Put,
+                    oldCell.getValueLength() + cell.getValueLength(),
+                    oldCell.getTagsLength() + cell.getTagsLength());
                 // copy in the value
-                System.arraycopy(oldKv.getValueArray(), oldKv.getValueOffset(),
-                    newKV.getValueArray(), newKV.getValueOffset(),
-                    oldKv.getValueLength());
-                System.arraycopy(kv.getValueArray(), kv.getValueOffset(),
-                    newKV.getValueArray(),
-                    newKV.getValueOffset() + oldKv.getValueLength(),
-                    kv.getValueLength());
+                System.arraycopy(oldCell.getValueArray(), oldCell.getValueOffset(),
+                    newCell.getValueArray(), newCell.getValueOffset(),
+                    oldCell.getValueLength());
+                System.arraycopy(cell.getValueArray(), cell.getValueOffset(),
+                    newCell.getValueArray(),
+                    newCell.getValueOffset() + oldCell.getValueLength(),
+                    cell.getValueLength());
                 // copy in the tags
-                System.arraycopy(oldKv.getTagsArray(), oldKv.getTagsOffset(), newKV.getTagsArray(),
-                    newKV.getTagsOffset(), oldKv.getTagsLength());
-                System.arraycopy(kv.getTagsArray(), kv.getTagsOffset(), newKV.getTagsArray(),
-                    newKV.getTagsOffset() + oldKv.getTagsLength(), kv.getTagsLength());
+                System.arraycopy(oldCell.getTagsArray(), oldCell.getTagsOffset(),
+                    newCell.getTagsArray(), newCell.getTagsOffset(), oldCell.getTagsLength());
+                System.arraycopy(cell.getTagsArray(), cell.getTagsOffset(), newCell.getTagsArray(),
+                    newCell.getTagsOffset() + oldCell.getTagsLength(), cell.getTagsLength());
                 // copy in row, family, and qualifier
-                System.arraycopy(kv.getRowArray(), kv.getRowOffset(),
-                    newKV.getRowArray(), newKV.getRowOffset(), kv.getRowLength());
-                System.arraycopy(kv.getFamilyArray(), kv.getFamilyOffset(),
-                    newKV.getFamilyArray(), newKV.getFamilyOffset(),
-                    kv.getFamilyLength());
-                System.arraycopy(kv.getQualifierArray(), kv.getQualifierOffset(),
-                    newKV.getQualifierArray(), newKV.getQualifierOffset(),
-                    kv.getQualifierLength());
+                System.arraycopy(cell.getRowArray(), cell.getRowOffset(),
+                    newCell.getRowArray(), newCell.getRowOffset(), cell.getRowLength());
+                System.arraycopy(cell.getFamilyArray(), cell.getFamilyOffset(),
+                    newCell.getFamilyArray(), newCell.getFamilyOffset(),
+                    cell.getFamilyLength());
+                System.arraycopy(cell.getQualifierArray(), cell.getQualifierOffset(),
+                    newCell.getQualifierArray(), newCell.getQualifierOffset(),
+                    cell.getQualifierLength());
                 idx++;
               } else {
-                newKV = kv;
                 // Append's KeyValue.Type==Put and ts==HConstants.LATEST_TIMESTAMP,
                 // so only need to update the timestamp to 'now'
+                // TODO get rid of KeyValueUtil.ensureKeyValue
+                KeyValue newKV = KeyValueUtil.ensureKeyValue(cell);
                 newKV.updateLatestStamp(Bytes.toBytes(now));
+                newCell = newKV;
              }
-              newKV.setSequenceId(mvccNum);
+              CellUtil.setSequenceId(newCell, mvccNum);
               // Give coprocessors a chance to update the new cell
               if (coprocessorHost != null) {
-                newKV = KeyValueUtil.ensureKeyValue(coprocessorHost.postMutationBeforeWAL(
-                    RegionObserver.MutationType.APPEND, append, oldKv, newKV));
+                newCell = coprocessorHost.postMutationBeforeWAL(RegionObserver.MutationType.APPEND,
+                    append, oldCell, newCell);
               }
-              kvs.add(newKV);
+              kvs.add(newCell);
 
               // Append update to WAL
               if (writeToWAL) {
                 if (walEdits == null) {
                   walEdits = new WALEdit();
                 }
-                walEdits.add(newKV);
+                walEdits.add(newCell);
               }
             }
 
@@ -5354,8 +5353,7 @@ public class HRegion implements HeapSize { // , Writable{
             } else {
               // otherwise keep older versions around
               for (Cell cell: entry.getValue()) {
-                KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-                Pair<Long, Cell> ret = store.add(kv);
+                Pair<Long, Cell> ret = store.add(cell);
                 size += ret.getFirst();
                 memstoreCells.add(ret.getSecond());
                 doRollBackMemstore = true;
@@ -5520,7 +5518,7 @@ public class HRegion implements HeapSize { // , Writable{
               byte[] val = Bytes.toBytes(amount);
               int oldCellTagsLen = (c == null) ? 0 : c.getTagsLength();
               int incCellTagsLen = kv.getTagsLength();
-              KeyValue newKV = new KeyValue(row.length, family.getKey().length, q.length, now,
+              Cell newKV = new KeyValue(row.length, family.getKey().length, q.length, now,
                   KeyValue.Type.Put, val.length, oldCellTagsLen + incCellTagsLen);
               System.arraycopy(row, 0, newKV.getRowArray(), newKV.getRowOffset(), row.length);
               System.arraycopy(family.getKey(), 0, newKV.getFamilyArray(), newKV.getFamilyOffset(),
@@ -5537,11 +5535,11 @@ public class HRegion implements HeapSize { // , Writable{
                 System.arraycopy(kv.getTagsArray(), kv.getTagsOffset(), newKV.getTagsArray(),
                     newKV.getTagsOffset() + oldCellTagsLen, incCellTagsLen);
               }
-              newKV.setSequenceId(mvccNum);
+              CellUtil.setSequenceId(newKV, mvccNum);
               // Give coprocessors a chance to update the new cell
               if (coprocessorHost != null) {
-                newKV = KeyValueUtil.ensureKeyValue(coprocessorHost.postMutationBeforeWAL(
-                    RegionObserver.MutationType.INCREMENT, increment, c, newKV));
+                newKV = coprocessorHost.postMutationBeforeWAL(
+                    RegionObserver.MutationType.INCREMENT, increment, c, newKV);
               }
               allKVs.add(newKV);
 
@@ -5575,8 +5573,7 @@ public class HRegion implements HeapSize { // , Writable{
               } else {
                 // otherwise keep older versions around
                 for (Cell cell : entry.getValue()) {
-                  KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-                  Pair<Long, Cell> ret = store.add(kv);
+                  Pair<Long, Cell> ret = store.add(cell);
                   size += ret.getFirst();
                   memstoreCells.add(ret.getSecond());
                   doRollBackMemstore = true;
@@ -6064,8 +6061,8 @@ public class HRegion implements HeapSize { // , Writable{
     long mutationSize = 0;
     for (List<Cell> cells: familyMap.values()) {
       for (Cell cell : cells) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        mutationSize += kv.getKeyLength() + kv.getValueLength();
+        // TODO we need include tags length also here.
+        mutationSize += KeyValueUtil.keyLength(cell) + cell.getValueLength();
       }
     }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFlusher.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFlusher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFlusher.java
index 7403700..3311cc0 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFlusher.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StoreFlusher.java
@@ -28,8 +28,6 @@ import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.client.Scan;
 import org.apache.hadoop.hbase.monitoring.MonitoredTask;
 import org.apache.hadoop.hbase.regionserver.compactions.Compactor;
@@ -120,8 +118,7 @@ abstract class StoreFlusher {
           // If we know that this KV is going to be included always, then let us
           // set its memstoreTS to 0. This will help us save space when writing to
           // disk.
-          KeyValue kv = KeyValueUtil.ensureKeyValue(c);
-          sink.append(kv);
+          sink.append(c);
         }
         kvs.clear();
       }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java
index d10dc48..98b0b4b 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/replication/regionserver/ReplicationSink.java
@@ -41,7 +41,6 @@ import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.Stoppable;
 import org.apache.hadoop.hbase.client.Delete;
 import org.apache.hadoop.hbase.client.HConnection;
@@ -149,9 +148,9 @@ public class ReplicationSink {
             addToHashMultiMap(rowMap, table, clusterIds, m);
           }
           if (CellUtil.isDelete(cell)) {
-            ((Delete)m).addDeleteMarker(KeyValueUtil.ensureKeyValue(cell));
+            ((Delete)m).addDeleteMarker(cell);
           } else {
-            ((Put)m).add(KeyValueUtil.ensureKeyValue(cell));
+            ((Put)m).add(cell);
           }
           previousCell = cell;
         }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
index cf1416e..2fc4dcc 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
@@ -35,11 +35,11 @@ import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.classification.InterfaceStability;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.TableName;
 import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.Delete;
@@ -198,10 +198,9 @@ public class RemoteHTable implements HTableInterface {
     long ts = put.getTimeStamp();
     for (List<Cell> cells: put.getFamilyCellMap().values()) {
       for (Cell cell: cells) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        row.addCell(new CellModel(kv.getFamily(), kv.getQualifier(),
-          ts != HConstants.LATEST_TIMESTAMP ? ts : kv.getTimestamp(),
-          kv.getValue()));
+        row.addCell(new CellModel(CellUtil.cloneFamily(cell), CellUtil.cloneQualifier(cell),
+          ts != HConstants.LATEST_TIMESTAMP ? ts : cell.getTimestamp(),
+          CellUtil.cloneValue(cell)));
       }
     }
     CellSetModel model = new CellSetModel();
@@ -442,8 +441,7 @@ public class RemoteHTable implements HTableInterface {
     for (Map.Entry<byte[], List<Cell>> e: map.entrySet()) {
       RowModel row = new RowModel(e.getKey());
       for (Cell cell: e.getValue()) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        row.addCell(new CellModel(kv));
+        row.addCell(new CellModel(cell));
       }
       model.addRow(row);
     }

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java
index 66fb85a..78455cb 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/CellModel.java
@@ -30,6 +30,7 @@ import javax.xml.bind.annotation.XmlValue;
 
 import org.apache.hadoop.hbase.util.ByteStringer;
 import org.apache.hadoop.classification.InterfaceAudience;
+import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.rest.ProtobufMessageHandler;
@@ -99,10 +100,11 @@ public class CellModel implements ProtobufMessageHandler, Serializable {
 
   /**
    * Constructor from KeyValue
-   * @param kv
+   * @param cell
    */
-  public CellModel(KeyValue kv) {
-    this(kv.getFamily(), kv.getQualifier(), kv.getTimestamp(), kv.getValue());
+  public CellModel(org.apache.hadoop.hbase.Cell cell) {
+    this(CellUtil.cloneFamily(cell), CellUtil.cloneQualifier(cell), cell.getTimestamp(), CellUtil
+        .cloneValue(cell));
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
index 1d3693f..625b23f 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/AccessController.java
@@ -45,7 +45,6 @@ import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
 import org.apache.hadoop.hbase.KeyValue.Type;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.NamespaceDescriptor;
 import org.apache.hadoop.hbase.ServerName;
 import org.apache.hadoop.hbase.TableName;
@@ -68,7 +67,6 @@ import org.apache.hadoop.hbase.coprocessor.CoprocessorException;
 import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
 import org.apache.hadoop.hbase.coprocessor.EndpointObserver;
 import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment;
-import org.apache.hadoop.hbase.coprocessor.MasterObserver;
 import org.apache.hadoop.hbase.coprocessor.ObserverContext;
 import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
 import org.apache.hadoop.hbase.coprocessor.RegionServerCoprocessorEnvironment;
@@ -232,11 +230,10 @@ public class AccessController extends BaseMasterAndRegionObserver
     for (Map.Entry<byte[], List<Cell>> f : familyMap.entrySet()) {
       List<Cell> cells = f.getValue();
       for (Cell cell: cells) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        if (Bytes.equals(kv.getFamilyArray(), kv.getFamilyOffset(),
-            kv.getFamilyLength(), AccessControlLists.ACL_LIST_FAMILY, 0,
+        if (Bytes.equals(cell.getFamilyArray(), cell.getFamilyOffset(),
+            cell.getFamilyLength(), AccessControlLists.ACL_LIST_FAMILY, 0,
             AccessControlLists.ACL_LIST_FAMILY.length)) {
-          entries.add(kv.getRow());
+          entries.add(CellUtil.cloneRow(cell));
         }
       }
     }
@@ -771,15 +768,12 @@ public class AccessController extends BaseMasterAndRegionObserver
             tags.add(tagIterator.next());
           }
         }
-        // Ensure KeyValue so we can do a scatter gather copy. This is only a win if the
-        // incoming cell type is actually KeyValue.
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
         newCells.add(
-          new KeyValue(kv.getRowArray(), kv.getRowOffset(), kv.getRowLength(),
-            kv.getFamilyArray(), kv.getFamilyOffset(), kv.getFamilyLength(),
-            kv.getQualifierArray(), kv.getQualifierOffset(), kv.getQualifierLength(),
-            kv.getTimestamp(), KeyValue.Type.codeToType(kv.getTypeByte()),
-            kv.getValueArray(), kv.getValueOffset(), kv.getValueLength(),
+          new KeyValue(cell.getRowArray(), cell.getRowOffset(), cell.getRowLength(),
+            cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength(),
+            cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength(),
+            cell.getTimestamp(), KeyValue.Type.codeToType(cell.getTypeByte()),
+            cell.getValueArray(), cell.getValueOffset(), cell.getValueLength(),
             tags));
       }
       // This is supposed to be safe, won't CME
@@ -1769,15 +1763,14 @@ public class AccessController extends BaseMasterAndRegionObserver
 
     // We need to create another KV, unfortunately, because the current new KV
     // has no space for tags
-    KeyValue newKv = KeyValueUtil.ensureKeyValue(newCell);
-    KeyValue rewriteKv = new KeyValue(newKv.getRowArray(), newKv.getRowOffset(), newKv.getRowLength(),
-      newKv.getFamilyArray(), newKv.getFamilyOffset(), newKv.getFamilyLength(),
-      newKv.getQualifierArray(), newKv.getQualifierOffset(), newKv.getQualifierLength(),
-      newKv.getTimestamp(), KeyValue.Type.codeToType(newKv.getTypeByte()),
-      newKv.getValueArray(), newKv.getValueOffset(), newKv.getValueLength(),
-      tags);
+    KeyValue rewriteKv = new KeyValue(newCell.getRowArray(), newCell.getRowOffset(),
+        newCell.getRowLength(), newCell.getFamilyArray(), newCell.getFamilyOffset(),
+        newCell.getFamilyLength(), newCell.getQualifierArray(), newCell.getQualifierOffset(),
+        newCell.getQualifierLength(), newCell.getTimestamp(), KeyValue.Type.codeToType(newCell
+            .getTypeByte()), newCell.getValueArray(), newCell.getValueOffset(),
+        newCell.getValueLength(), tags);
     // Preserve mvcc data
-    rewriteKv.setSequenceId(newKv.getMvccVersion());
+    rewriteKv.setSequenceId(newCell.getSequenceId());
     return rewriteKv;
   }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/791a03b4/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 9cad902..a2afe2a 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
@@ -30,8 +30,6 @@ import org.apache.hadoop.classification.InterfaceAudience;
 import org.apache.hadoop.hbase.Cell;
 import org.apache.hadoop.hbase.CellUtil;
 import org.apache.hadoop.hbase.HConstants;
-import org.apache.hadoop.hbase.KeyValue;
-import org.apache.hadoop.hbase.KeyValueUtil;
 import org.apache.hadoop.hbase.client.Append;
 import org.apache.hadoop.hbase.client.Delete;
 import org.apache.hadoop.hbase.client.Durability;
@@ -333,10 +331,9 @@ public class ThriftUtilities {
         in.getFamilyCellMap().entrySet()) {
       TColumn column = new TColumn(ByteBuffer.wrap(familyEntry.getKey()));
       for (org.apache.hadoop.hbase.Cell cell: familyEntry.getValue()) {
-        KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
-        byte[] family = kv.getFamily();
-        byte[] qualifier = kv.getQualifier();
-        long timestamp = kv.getTimestamp();
+        byte[] family = CellUtil.cloneFamily(cell);
+        byte[] qualifier = CellUtil.cloneQualifier(cell);
+        long timestamp = cell.getTimestamp();
         if (family != null) {
           column.setFamily(family);
         }
@@ -344,7 +341,7 @@ public class ThriftUtilities {
           column.setQualifier(qualifier);
         }
         if (timestamp != HConstants.LATEST_TIMESTAMP) {
-          column.setTimestamp(kv.getTimestamp());
+          column.setTimestamp(timestamp);
         }
       }
       columns.add(column);