You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/12/26 14:51:47 UTC

[14/18] hbase-site git commit: Published site at 4281cb3b9574333fab0e7c028c9c0d7e5b320c73.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/9b29d8f0/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
index 68e9bfe..0f5a095 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/regionserver/HRegion.BulkLoadListener.html
@@ -7971,832 +7971,819 @@
 <span class="sourceLineNo">7963</span><a name="line.7963"></a>
 <span class="sourceLineNo">7964</span>  /**<a name="line.7964"></a>
 <span class="sourceLineNo">7965</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client; these Sets are not<a name="line.7965"></a>
-<span class="sourceLineNo">7966</span>   * always the same dependent on whether to write WAL or if the amount to increment is zero (in<a name="line.7966"></a>
-<span class="sourceLineNo">7967</span>   * this case we write back nothing, just return latest Cell value to the client).<a name="line.7967"></a>
-<span class="sourceLineNo">7968</span>   *<a name="line.7968"></a>
-<span class="sourceLineNo">7969</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.7969"></a>
-<span class="sourceLineNo">7970</span>   *  doesn't want results).<a name="line.7970"></a>
-<span class="sourceLineNo">7971</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.7971"></a>
-<span class="sourceLineNo">7972</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.7972"></a>
-<span class="sourceLineNo">7973</span>   */<a name="line.7973"></a>
-<span class="sourceLineNo">7974</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.7974"></a>
-<span class="sourceLineNo">7975</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.7975"></a>
-<span class="sourceLineNo">7976</span>    WALEdit walEdit = null;<a name="line.7976"></a>
-<span class="sourceLineNo">7977</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.7977"></a>
-<span class="sourceLineNo">7978</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.7978"></a>
-<span class="sourceLineNo">7979</span>    // Process a Store/family at a time.<a name="line.7979"></a>
-<span class="sourceLineNo">7980</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.7980"></a>
-<span class="sourceLineNo">7981</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.7981"></a>
-<span class="sourceLineNo">7982</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.7982"></a>
-<span class="sourceLineNo">7983</span>      HStore store = this.stores.get(columnFamilyName);<a name="line.7983"></a>
-<span class="sourceLineNo">7984</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.7984"></a>
-<span class="sourceLineNo">7985</span>      List&lt;Cell&gt; toApply =<a name="line.7985"></a>
-<span class="sourceLineNo">7986</span>        reckonDeltasByStore(store, op, mutation, effectiveDurability, now, deltas, results);<a name="line.7986"></a>
-<span class="sourceLineNo">7987</span>      if (!toApply.isEmpty()) {<a name="line.7987"></a>
-<span class="sourceLineNo">7988</span>        forMemStore.put(store, toApply);<a name="line.7988"></a>
-<span class="sourceLineNo">7989</span>        if (writeToWAL) {<a name="line.7989"></a>
-<span class="sourceLineNo">7990</span>          if (walEdit == null) {<a name="line.7990"></a>
-<span class="sourceLineNo">7991</span>            walEdit = new WALEdit();<a name="line.7991"></a>
-<span class="sourceLineNo">7992</span>          }<a name="line.7992"></a>
-<span class="sourceLineNo">7993</span>          walEdit.getCells().addAll(toApply);<a name="line.7993"></a>
-<span class="sourceLineNo">7994</span>        }<a name="line.7994"></a>
-<span class="sourceLineNo">7995</span>      }<a name="line.7995"></a>
-<span class="sourceLineNo">7996</span>    }<a name="line.7996"></a>
-<span class="sourceLineNo">7997</span>    return walEdit;<a name="line.7997"></a>
-<span class="sourceLineNo">7998</span>  }<a name="line.7998"></a>
-<span class="sourceLineNo">7999</span><a name="line.7999"></a>
-<span class="sourceLineNo">8000</span>  /**<a name="line.8000"></a>
-<span class="sourceLineNo">8001</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8001"></a>
-<span class="sourceLineNo">8002</span>   * column family/Store.<a name="line.8002"></a>
-<span class="sourceLineNo">8003</span>   *<a name="line.8003"></a>
-<span class="sourceLineNo">8004</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8004"></a>
-<span class="sourceLineNo">8005</span>   *<a name="line.8005"></a>
-<span class="sourceLineNo">8006</span>   * @param op Whether Increment or Append<a name="line.8006"></a>
-<span class="sourceLineNo">8007</span>   * @param mutation The encompassing Mutation object<a name="line.8007"></a>
-<span class="sourceLineNo">8008</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8008"></a>
-<span class="sourceLineNo">8009</span>   * @param results In here we accumulate all the Cells we are to return to the client; this List<a name="line.8009"></a>
-<span class="sourceLineNo">8010</span>   *  can be larger than what we return in case where delta is zero; i.e. don't write<a name="line.8010"></a>
-<span class="sourceLineNo">8011</span>   *  out new values, just return current value. If null, client doesn't want results returned.<a name="line.8011"></a>
-<span class="sourceLineNo">8012</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8012"></a>
-<span class="sourceLineNo">8013</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8013"></a>
-<span class="sourceLineNo">8014</span>   */<a name="line.8014"></a>
-<span class="sourceLineNo">8015</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8015"></a>
-<span class="sourceLineNo">8016</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8016"></a>
-<span class="sourceLineNo">8017</span>      throws IOException {<a name="line.8017"></a>
-<span class="sourceLineNo">8018</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8018"></a>
-<span class="sourceLineNo">8019</span>    List&lt;Cell&gt; toApply = new ArrayList&lt;&gt;(deltas.size());<a name="line.8019"></a>
-<span class="sourceLineNo">8020</span>    // Get previous values for all columns in this family.<a name="line.8020"></a>
-<span class="sourceLineNo">8021</span>    TimeRange tr = null;<a name="line.8021"></a>
-<span class="sourceLineNo">8022</span>    switch (op) {<a name="line.8022"></a>
-<span class="sourceLineNo">8023</span>      case INCREMENT:<a name="line.8023"></a>
-<span class="sourceLineNo">8024</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8024"></a>
-<span class="sourceLineNo">8025</span>        break;<a name="line.8025"></a>
-<span class="sourceLineNo">8026</span>      case APPEND:<a name="line.8026"></a>
-<span class="sourceLineNo">8027</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8027"></a>
+<span class="sourceLineNo">7966</span>   * always the same dependent on whether to write WAL.<a name="line.7966"></a>
+<span class="sourceLineNo">7967</span>   *<a name="line.7967"></a>
+<span class="sourceLineNo">7968</span>   * @param results Fill in here what goes back to the Client if it is non-null (if null, client<a name="line.7968"></a>
+<span class="sourceLineNo">7969</span>   *  doesn't want results).<a name="line.7969"></a>
+<span class="sourceLineNo">7970</span>   * @param forMemStore Fill in here what to apply to the MemStore (by Store).<a name="line.7970"></a>
+<span class="sourceLineNo">7971</span>   * @return A WALEdit to apply to WAL or null if we are to skip the WAL.<a name="line.7971"></a>
+<span class="sourceLineNo">7972</span>   */<a name="line.7972"></a>
+<span class="sourceLineNo">7973</span>  private WALEdit reckonDeltas(Operation op, Mutation mutation, Durability effectiveDurability,<a name="line.7973"></a>
+<span class="sourceLineNo">7974</span>      Map&lt;HStore, List&lt;Cell&gt;&gt; forMemStore, List&lt;Cell&gt; results) throws IOException {<a name="line.7974"></a>
+<span class="sourceLineNo">7975</span>    WALEdit walEdit = null;<a name="line.7975"></a>
+<span class="sourceLineNo">7976</span>    long now = EnvironmentEdgeManager.currentTime();<a name="line.7976"></a>
+<span class="sourceLineNo">7977</span>    final boolean writeToWAL = effectiveDurability != Durability.SKIP_WAL;<a name="line.7977"></a>
+<span class="sourceLineNo">7978</span>    // Process a Store/family at a time.<a name="line.7978"></a>
+<span class="sourceLineNo">7979</span>    for (Map.Entry&lt;byte [], List&lt;Cell&gt;&gt; entry: mutation.getFamilyCellMap().entrySet()) {<a name="line.7979"></a>
+<span class="sourceLineNo">7980</span>      final byte[] columnFamilyName = entry.getKey();<a name="line.7980"></a>
+<span class="sourceLineNo">7981</span>      List&lt;Cell&gt; deltas = entry.getValue();<a name="line.7981"></a>
+<span class="sourceLineNo">7982</span>      HStore store = this.stores.get(columnFamilyName);<a name="line.7982"></a>
+<span class="sourceLineNo">7983</span>      // Reckon for the Store what to apply to WAL and MemStore.<a name="line.7983"></a>
+<span class="sourceLineNo">7984</span>      List&lt;Cell&gt; toApply =<a name="line.7984"></a>
+<span class="sourceLineNo">7985</span>        reckonDeltasByStore(store, op, mutation, effectiveDurability, now, deltas, results);<a name="line.7985"></a>
+<span class="sourceLineNo">7986</span>      if (!toApply.isEmpty()) {<a name="line.7986"></a>
+<span class="sourceLineNo">7987</span>        forMemStore.put(store, toApply);<a name="line.7987"></a>
+<span class="sourceLineNo">7988</span>        if (writeToWAL) {<a name="line.7988"></a>
+<span class="sourceLineNo">7989</span>          if (walEdit == null) {<a name="line.7989"></a>
+<span class="sourceLineNo">7990</span>            walEdit = new WALEdit();<a name="line.7990"></a>
+<span class="sourceLineNo">7991</span>          }<a name="line.7991"></a>
+<span class="sourceLineNo">7992</span>          walEdit.getCells().addAll(toApply);<a name="line.7992"></a>
+<span class="sourceLineNo">7993</span>        }<a name="line.7993"></a>
+<span class="sourceLineNo">7994</span>      }<a name="line.7994"></a>
+<span class="sourceLineNo">7995</span>    }<a name="line.7995"></a>
+<span class="sourceLineNo">7996</span>    return walEdit;<a name="line.7996"></a>
+<span class="sourceLineNo">7997</span>  }<a name="line.7997"></a>
+<span class="sourceLineNo">7998</span><a name="line.7998"></a>
+<span class="sourceLineNo">7999</span>  /**<a name="line.7999"></a>
+<span class="sourceLineNo">8000</span>   * Reckon the Cells to apply to WAL, memstore, and to return to the Client in passed<a name="line.8000"></a>
+<span class="sourceLineNo">8001</span>   * column family/Store.<a name="line.8001"></a>
+<span class="sourceLineNo">8002</span>   *<a name="line.8002"></a>
+<span class="sourceLineNo">8003</span>   * Does Get of current value and then adds passed in deltas for this Store returning the result.<a name="line.8003"></a>
+<span class="sourceLineNo">8004</span>   *<a name="line.8004"></a>
+<span class="sourceLineNo">8005</span>   * @param op Whether Increment or Append<a name="line.8005"></a>
+<span class="sourceLineNo">8006</span>   * @param mutation The encompassing Mutation object<a name="line.8006"></a>
+<span class="sourceLineNo">8007</span>   * @param deltas Changes to apply to this Store; either increment amount or data to append<a name="line.8007"></a>
+<span class="sourceLineNo">8008</span>   * @param results In here we accumulate all the Cells we are to return to the client. If null,<a name="line.8008"></a>
+<span class="sourceLineNo">8009</span>   *                client doesn't want results returned.<a name="line.8009"></a>
+<span class="sourceLineNo">8010</span>   * @return Resulting Cells after &lt;code&gt;deltas&lt;/code&gt; have been applied to current<a name="line.8010"></a>
+<span class="sourceLineNo">8011</span>   *  values. Side effect is our filling out of the &lt;code&gt;results&lt;/code&gt; List.<a name="line.8011"></a>
+<span class="sourceLineNo">8012</span>   */<a name="line.8012"></a>
+<span class="sourceLineNo">8013</span>  private List&lt;Cell&gt; reckonDeltasByStore(HStore store, Operation op, Mutation mutation,<a name="line.8013"></a>
+<span class="sourceLineNo">8014</span>      Durability effectiveDurability, long now, List&lt;Cell&gt; deltas, List&lt;Cell&gt; results)<a name="line.8014"></a>
+<span class="sourceLineNo">8015</span>      throws IOException {<a name="line.8015"></a>
+<span class="sourceLineNo">8016</span>    byte[] columnFamily = store.getColumnFamilyDescriptor().getName();<a name="line.8016"></a>
+<span class="sourceLineNo">8017</span>    List&lt;Cell&gt; toApply = new ArrayList&lt;&gt;(deltas.size());<a name="line.8017"></a>
+<span class="sourceLineNo">8018</span>    // Get previous values for all columns in this family.<a name="line.8018"></a>
+<span class="sourceLineNo">8019</span>    TimeRange tr = null;<a name="line.8019"></a>
+<span class="sourceLineNo">8020</span>    switch (op) {<a name="line.8020"></a>
+<span class="sourceLineNo">8021</span>      case INCREMENT:<a name="line.8021"></a>
+<span class="sourceLineNo">8022</span>        tr = ((Increment)mutation).getTimeRange();<a name="line.8022"></a>
+<span class="sourceLineNo">8023</span>        break;<a name="line.8023"></a>
+<span class="sourceLineNo">8024</span>      case APPEND:<a name="line.8024"></a>
+<span class="sourceLineNo">8025</span>        tr = ((Append)mutation).getTimeRange();<a name="line.8025"></a>
+<span class="sourceLineNo">8026</span>        break;<a name="line.8026"></a>
+<span class="sourceLineNo">8027</span>      default:<a name="line.8027"></a>
 <span class="sourceLineNo">8028</span>        break;<a name="line.8028"></a>
-<span class="sourceLineNo">8029</span>      default:<a name="line.8029"></a>
-<span class="sourceLineNo">8030</span>        break;<a name="line.8030"></a>
-<span class="sourceLineNo">8031</span>    }<a name="line.8031"></a>
-<span class="sourceLineNo">8032</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8032"></a>
-<span class="sourceLineNo">8033</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8033"></a>
-<span class="sourceLineNo">8034</span>    // add new column initialized to the delta amount<a name="line.8034"></a>
-<span class="sourceLineNo">8035</span>    int currentValuesIndex = 0;<a name="line.8035"></a>
-<span class="sourceLineNo">8036</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8036"></a>
-<span class="sourceLineNo">8037</span>      Cell delta = deltas.get(i);<a name="line.8037"></a>
-<span class="sourceLineNo">8038</span>      Cell currentValue = null;<a name="line.8038"></a>
-<span class="sourceLineNo">8039</span>      boolean firstWrite = false;<a name="line.8039"></a>
-<span class="sourceLineNo">8040</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8040"></a>
-<span class="sourceLineNo">8041</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8041"></a>
-<span class="sourceLineNo">8042</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8042"></a>
-<span class="sourceLineNo">8043</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8043"></a>
-<span class="sourceLineNo">8044</span>          currentValuesIndex++;<a name="line.8044"></a>
-<span class="sourceLineNo">8045</span>        }<a name="line.8045"></a>
-<span class="sourceLineNo">8046</span>      } else {<a name="line.8046"></a>
-<span class="sourceLineNo">8047</span>        firstWrite = true;<a name="line.8047"></a>
-<span class="sourceLineNo">8048</span>      }<a name="line.8048"></a>
-<span class="sourceLineNo">8049</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8049"></a>
-<span class="sourceLineNo">8050</span>      Cell newCell = null;<a name="line.8050"></a>
-<span class="sourceLineNo">8051</span>      MutationType mutationType = null;<a name="line.8051"></a>
-<span class="sourceLineNo">8052</span>      boolean apply = true;<a name="line.8052"></a>
-<span class="sourceLineNo">8053</span>      switch (op) {<a name="line.8053"></a>
-<span class="sourceLineNo">8054</span>        case INCREMENT:<a name="line.8054"></a>
-<span class="sourceLineNo">8055</span>          mutationType = MutationType.INCREMENT;<a name="line.8055"></a>
-<span class="sourceLineNo">8056</span>          // If delta amount to apply is 0, don't write WAL or MemStore.<a name="line.8056"></a>
-<span class="sourceLineNo">8057</span>          long deltaAmount = getLongValue(delta);<a name="line.8057"></a>
-<span class="sourceLineNo">8058</span>          // TODO: Does zero value mean reset Cell? For example, the ttl.<a name="line.8058"></a>
-<span class="sourceLineNo">8059</span>          apply = deltaAmount != 0;<a name="line.8059"></a>
-<span class="sourceLineNo">8060</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8060"></a>
-<span class="sourceLineNo">8061</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8061"></a>
+<span class="sourceLineNo">8029</span>    }<a name="line.8029"></a>
+<span class="sourceLineNo">8030</span>    List&lt;Cell&gt; currentValues = get(mutation, store, deltas,null, tr);<a name="line.8030"></a>
+<span class="sourceLineNo">8031</span>    // Iterate the input columns and update existing values if they were found, otherwise<a name="line.8031"></a>
+<span class="sourceLineNo">8032</span>    // add new column initialized to the delta amount<a name="line.8032"></a>
+<span class="sourceLineNo">8033</span>    int currentValuesIndex = 0;<a name="line.8033"></a>
+<span class="sourceLineNo">8034</span>    for (int i = 0; i &lt; deltas.size(); i++) {<a name="line.8034"></a>
+<span class="sourceLineNo">8035</span>      Cell delta = deltas.get(i);<a name="line.8035"></a>
+<span class="sourceLineNo">8036</span>      Cell currentValue = null;<a name="line.8036"></a>
+<span class="sourceLineNo">8037</span>      if (currentValuesIndex &lt; currentValues.size() &amp;&amp;<a name="line.8037"></a>
+<span class="sourceLineNo">8038</span>          CellUtil.matchingQualifier(currentValues.get(currentValuesIndex), delta)) {<a name="line.8038"></a>
+<span class="sourceLineNo">8039</span>        currentValue = currentValues.get(currentValuesIndex);<a name="line.8039"></a>
+<span class="sourceLineNo">8040</span>        if (i &lt; (deltas.size() - 1) &amp;&amp; !CellUtil.matchingQualifier(delta, deltas.get(i + 1))) {<a name="line.8040"></a>
+<span class="sourceLineNo">8041</span>          currentValuesIndex++;<a name="line.8041"></a>
+<span class="sourceLineNo">8042</span>        }<a name="line.8042"></a>
+<span class="sourceLineNo">8043</span>      }<a name="line.8043"></a>
+<span class="sourceLineNo">8044</span>      // Switch on whether this an increment or an append building the new Cell to apply.<a name="line.8044"></a>
+<span class="sourceLineNo">8045</span>      Cell newCell = null;<a name="line.8045"></a>
+<span class="sourceLineNo">8046</span>      MutationType mutationType = null;<a name="line.8046"></a>
+<span class="sourceLineNo">8047</span>      switch (op) {<a name="line.8047"></a>
+<span class="sourceLineNo">8048</span>        case INCREMENT:<a name="line.8048"></a>
+<span class="sourceLineNo">8049</span>          mutationType = MutationType.INCREMENT;<a name="line.8049"></a>
+<span class="sourceLineNo">8050</span>          long deltaAmount = getLongValue(delta);<a name="line.8050"></a>
+<span class="sourceLineNo">8051</span>          final long newValue = currentValue == null ? deltaAmount : getLongValue(currentValue) + deltaAmount;<a name="line.8051"></a>
+<span class="sourceLineNo">8052</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt; Bytes.toBytes(newValue));<a name="line.8052"></a>
+<span class="sourceLineNo">8053</span>          break;<a name="line.8053"></a>
+<span class="sourceLineNo">8054</span>        case APPEND:<a name="line.8054"></a>
+<span class="sourceLineNo">8055</span>          mutationType = MutationType.APPEND;<a name="line.8055"></a>
+<span class="sourceLineNo">8056</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8056"></a>
+<span class="sourceLineNo">8057</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8057"></a>
+<span class="sourceLineNo">8058</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8058"></a>
+<span class="sourceLineNo">8059</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8059"></a>
+<span class="sourceLineNo">8060</span>                    .array()<a name="line.8060"></a>
+<span class="sourceLineNo">8061</span>          );<a name="line.8061"></a>
 <span class="sourceLineNo">8062</span>          break;<a name="line.8062"></a>
-<span class="sourceLineNo">8063</span>        case APPEND:<a name="line.8063"></a>
-<span class="sourceLineNo">8064</span>          mutationType = MutationType.APPEND;<a name="line.8064"></a>
-<span class="sourceLineNo">8065</span>          // Always apply Append. TODO: Does empty delta value mean reset Cell? It seems to.<a name="line.8065"></a>
-<span class="sourceLineNo">8066</span>          newCell = reckonDelta(delta, currentValue, columnFamily, now, mutation, (oldCell) -&gt;<a name="line.8066"></a>
-<span class="sourceLineNo">8067</span>            ByteBuffer.wrap(new byte[delta.getValueLength() + oldCell.getValueLength()])<a name="line.8067"></a>
-<span class="sourceLineNo">8068</span>                    .put(oldCell.getValueArray(), oldCell.getValueOffset(), oldCell.getValueLength())<a name="line.8068"></a>
-<span class="sourceLineNo">8069</span>                    .put(delta.getValueArray(), delta.getValueOffset(), delta.getValueLength())<a name="line.8069"></a>
-<span class="sourceLineNo">8070</span>                    .array()<a name="line.8070"></a>
-<span class="sourceLineNo">8071</span>          );<a name="line.8071"></a>
-<span class="sourceLineNo">8072</span>          break;<a name="line.8072"></a>
-<span class="sourceLineNo">8073</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8073"></a>
-<span class="sourceLineNo">8074</span>      }<a name="line.8074"></a>
-<span class="sourceLineNo">8075</span><a name="line.8075"></a>
-<span class="sourceLineNo">8076</span>      // Give coprocessors a chance to update the new cell<a name="line.8076"></a>
-<span class="sourceLineNo">8077</span>      if (coprocessorHost != null) {<a name="line.8077"></a>
-<span class="sourceLineNo">8078</span>        newCell =<a name="line.8078"></a>
-<span class="sourceLineNo">8079</span>            coprocessorHost.postMutationBeforeWAL(mutationType, mutation, currentValue, newCell);<a name="line.8079"></a>
-<span class="sourceLineNo">8080</span>      }<a name="line.8080"></a>
-<span class="sourceLineNo">8081</span>      // If apply, we need to update memstore/WAL with new value; add it toApply.<a name="line.8081"></a>
-<span class="sourceLineNo">8082</span>      if (apply || firstWrite) {<a name="line.8082"></a>
-<span class="sourceLineNo">8083</span>        toApply.add(newCell);<a name="line.8083"></a>
-<span class="sourceLineNo">8084</span>      }<a name="line.8084"></a>
-<span class="sourceLineNo">8085</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8085"></a>
-<span class="sourceLineNo">8086</span>      if (results != null) {<a name="line.8086"></a>
-<span class="sourceLineNo">8087</span>        results.add(newCell);<a name="line.8087"></a>
-<span class="sourceLineNo">8088</span>      }<a name="line.8088"></a>
-<span class="sourceLineNo">8089</span>    }<a name="line.8089"></a>
-<span class="sourceLineNo">8090</span>    return toApply;<a name="line.8090"></a>
-<span class="sourceLineNo">8091</span>  }<a name="line.8091"></a>
-<span class="sourceLineNo">8092</span><a name="line.8092"></a>
-<span class="sourceLineNo">8093</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8093"></a>
-<span class="sourceLineNo">8094</span>                                  final byte[] columnFamily, final long now,<a name="line.8094"></a>
-<span class="sourceLineNo">8095</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8095"></a>
-<span class="sourceLineNo">8096</span>    // Forward any tags found on the delta.<a name="line.8096"></a>
-<span class="sourceLineNo">8097</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8097"></a>
-<span class="sourceLineNo">8098</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8098"></a>
-<span class="sourceLineNo">8099</span>    if (currentCell != null) {<a name="line.8099"></a>
-<span class="sourceLineNo">8100</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8100"></a>
-<span class="sourceLineNo">8101</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8101"></a>
-<span class="sourceLineNo">8102</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8102"></a>
-<span class="sourceLineNo">8103</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8103"></a>
-<span class="sourceLineNo">8104</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8104"></a>
-<span class="sourceLineNo">8105</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8105"></a>
-<span class="sourceLineNo">8106</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8106"></a>
-<span class="sourceLineNo">8107</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8107"></a>
-<span class="sourceLineNo">8108</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8108"></a>
-<span class="sourceLineNo">8109</span>              .setValue(newValue, 0, newValue.length)<a name="line.8109"></a>
-<span class="sourceLineNo">8110</span>              .setTags(TagUtil.fromList(tags))<a name="line.8110"></a>
-<span class="sourceLineNo">8111</span>              .build();<a name="line.8111"></a>
-<span class="sourceLineNo">8112</span>    } else {<a name="line.8112"></a>
-<span class="sourceLineNo">8113</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8113"></a>
-<span class="sourceLineNo">8114</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8114"></a>
-<span class="sourceLineNo">8115</span>    }<a name="line.8115"></a>
-<span class="sourceLineNo">8116</span>  }<a name="line.8116"></a>
-<span class="sourceLineNo">8117</span><a name="line.8117"></a>
-<span class="sourceLineNo">8118</span>  /**<a name="line.8118"></a>
-<span class="sourceLineNo">8119</span>   * @return Get the long out of the passed in Cell<a name="line.8119"></a>
-<span class="sourceLineNo">8120</span>   */<a name="line.8120"></a>
-<span class="sourceLineNo">8121</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8121"></a>
-<span class="sourceLineNo">8122</span>    int len = cell.getValueLength();<a name="line.8122"></a>
-<span class="sourceLineNo">8123</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8123"></a>
-<span class="sourceLineNo">8124</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8124"></a>
-<span class="sourceLineNo">8125</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8125"></a>
-<span class="sourceLineNo">8126</span>    }<a name="line.8126"></a>
-<span class="sourceLineNo">8127</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8127"></a>
-<span class="sourceLineNo">8128</span>  }<a name="line.8128"></a>
-<span class="sourceLineNo">8129</span><a name="line.8129"></a>
-<span class="sourceLineNo">8130</span>  /**<a name="line.8130"></a>
-<span class="sourceLineNo">8131</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8131"></a>
-<span class="sourceLineNo">8132</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8132"></a>
-<span class="sourceLineNo">8133</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8133"></a>
-<span class="sourceLineNo">8134</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8134"></a>
-<span class="sourceLineNo">8135</span>   * @return Return list of Cells found.<a name="line.8135"></a>
-<span class="sourceLineNo">8136</span>   */<a name="line.8136"></a>
-<span class="sourceLineNo">8137</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8137"></a>
-<span class="sourceLineNo">8138</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8138"></a>
-<span class="sourceLineNo">8139</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8139"></a>
-<span class="sourceLineNo">8140</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8140"></a>
-<span class="sourceLineNo">8141</span>    // client since cells are in an array list.<a name="line.8141"></a>
-<span class="sourceLineNo">8142</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8142"></a>
-<span class="sourceLineNo">8143</span>    sort(coordinates, store.getComparator());<a name="line.8143"></a>
-<span class="sourceLineNo">8144</span>    Get get = new Get(mutation.getRow());<a name="line.8144"></a>
-<span class="sourceLineNo">8145</span>    if (isolation != null) {<a name="line.8145"></a>
-<span class="sourceLineNo">8146</span>      get.setIsolationLevel(isolation);<a name="line.8146"></a>
-<span class="sourceLineNo">8147</span>    }<a name="line.8147"></a>
-<span class="sourceLineNo">8148</span>    for (Cell cell: coordinates) {<a name="line.8148"></a>
-<span class="sourceLineNo">8149</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8149"></a>
-<span class="sourceLineNo">8150</span>    }<a name="line.8150"></a>
-<span class="sourceLineNo">8151</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8151"></a>
-<span class="sourceLineNo">8152</span>    if (tr != null) {<a name="line.8152"></a>
-<span class="sourceLineNo">8153</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8153"></a>
-<span class="sourceLineNo">8154</span>    }<a name="line.8154"></a>
-<span class="sourceLineNo">8155</span>    return get(get, false);<a name="line.8155"></a>
-<span class="sourceLineNo">8156</span>  }<a name="line.8156"></a>
-<span class="sourceLineNo">8157</span><a name="line.8157"></a>
-<span class="sourceLineNo">8158</span>  /**<a name="line.8158"></a>
-<span class="sourceLineNo">8159</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8159"></a>
-<span class="sourceLineNo">8160</span>   */<a name="line.8160"></a>
-<span class="sourceLineNo">8161</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8161"></a>
-<span class="sourceLineNo">8162</span>    cells.sort(comparator);<a name="line.8162"></a>
-<span class="sourceLineNo">8163</span>    return cells;<a name="line.8163"></a>
-<span class="sourceLineNo">8164</span>  }<a name="line.8164"></a>
-<span class="sourceLineNo">8165</span><a name="line.8165"></a>
-<span class="sourceLineNo">8166</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8166"></a>
-<span class="sourceLineNo">8167</span>      ClassSize.OBJECT +<a name="line.8167"></a>
-<span class="sourceLineNo">8168</span>      ClassSize.ARRAY +<a name="line.8168"></a>
-<span class="sourceLineNo">8169</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8169"></a>
-<span class="sourceLineNo">8170</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8170"></a>
-<span class="sourceLineNo">8171</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8171"></a>
-<span class="sourceLineNo">8172</span><a name="line.8172"></a>
-<span class="sourceLineNo">8173</span>  // woefully out of date - currently missing:<a name="line.8173"></a>
-<span class="sourceLineNo">8174</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8174"></a>
-<span class="sourceLineNo">8175</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8175"></a>
-<span class="sourceLineNo">8176</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8176"></a>
-<span class="sourceLineNo">8177</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8177"></a>
-<span class="sourceLineNo">8178</span>  // 1 x HRegion$WriteState - writestate<a name="line.8178"></a>
-<span class="sourceLineNo">8179</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8179"></a>
-<span class="sourceLineNo">8180</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8180"></a>
-<span class="sourceLineNo">8181</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8181"></a>
-<span class="sourceLineNo">8182</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8182"></a>
-<span class="sourceLineNo">8183</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8183"></a>
-<span class="sourceLineNo">8184</span>      ClassSize.OBJECT + // closeLock<a name="line.8184"></a>
-<span class="sourceLineNo">8185</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8185"></a>
-<span class="sourceLineNo">8186</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8186"></a>
-<span class="sourceLineNo">8187</span>                                    // compactionsFailed<a name="line.8187"></a>
-<span class="sourceLineNo">8188</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8188"></a>
-<span class="sourceLineNo">8189</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8189"></a>
-<span class="sourceLineNo">8190</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8190"></a>
-<span class="sourceLineNo">8191</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8191"></a>
-<span class="sourceLineNo">8192</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8192"></a>
-<span class="sourceLineNo">8193</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8193"></a>
-<span class="sourceLineNo">8194</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8194"></a>
-<span class="sourceLineNo">8195</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8195"></a>
-<span class="sourceLineNo">8196</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8196"></a>
-<span class="sourceLineNo">8197</span>      ;<a name="line.8197"></a>
-<span class="sourceLineNo">8198</span><a name="line.8198"></a>
-<span class="sourceLineNo">8199</span>  @Override<a name="line.8199"></a>
-<span class="sourceLineNo">8200</span>  public long heapSize() {<a name="line.8200"></a>
-<span class="sourceLineNo">8201</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8201"></a>
-<span class="sourceLineNo">8202</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8202"></a>
-<span class="sourceLineNo">8203</span>  }<a name="line.8203"></a>
-<span class="sourceLineNo">8204</span><a name="line.8204"></a>
-<span class="sourceLineNo">8205</span>  /**<a name="line.8205"></a>
-<span class="sourceLineNo">8206</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8206"></a>
-<span class="sourceLineNo">8207</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8207"></a>
-<span class="sourceLineNo">8208</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8208"></a>
-<span class="sourceLineNo">8209</span>   *<a name="line.8209"></a>
-<span class="sourceLineNo">8210</span>   * &lt;p&gt;<a name="line.8210"></a>
-<span class="sourceLineNo">8211</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8211"></a>
-<span class="sourceLineNo">8212</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8212"></a>
-<span class="sourceLineNo">8213</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8213"></a>
-<span class="sourceLineNo">8214</span>   * a return value of {@code false}.<a name="line.8214"></a>
-<span class="sourceLineNo">8215</span>   * &lt;/p&gt;<a name="line.8215"></a>
-<span class="sourceLineNo">8216</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8216"></a>
-<span class="sourceLineNo">8217</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8217"></a>
-<span class="sourceLineNo">8218</span>   * otherwise<a name="line.8218"></a>
-<span class="sourceLineNo">8219</span>   */<a name="line.8219"></a>
-<span class="sourceLineNo">8220</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8220"></a>
-<span class="sourceLineNo">8221</span>    /*<a name="line.8221"></a>
-<span class="sourceLineNo">8222</span>     * No stacking of instances is allowed for a single service name<a name="line.8222"></a>
-<span class="sourceLineNo">8223</span>     */<a name="line.8223"></a>
-<span class="sourceLineNo">8224</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8224"></a>
-<span class="sourceLineNo">8225</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8225"></a>
-<span class="sourceLineNo">8226</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8226"></a>
-<span class="sourceLineNo">8227</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8227"></a>
-<span class="sourceLineNo">8228</span>          " already registered, rejecting request from " + instance);<a name="line.8228"></a>
-<span class="sourceLineNo">8229</span>      return false;<a name="line.8229"></a>
-<span class="sourceLineNo">8230</span>    }<a name="line.8230"></a>
-<span class="sourceLineNo">8231</span><a name="line.8231"></a>
-<span class="sourceLineNo">8232</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8232"></a>
-<span class="sourceLineNo">8233</span>    if (LOG.isDebugEnabled()) {<a name="line.8233"></a>
-<span class="sourceLineNo">8234</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8234"></a>
-<span class="sourceLineNo">8235</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8235"></a>
-<span class="sourceLineNo">8236</span>          " service=" + serviceName);<a name="line.8236"></a>
-<span class="sourceLineNo">8237</span>    }<a name="line.8237"></a>
-<span class="sourceLineNo">8238</span>    return true;<a name="line.8238"></a>
-<span class="sourceLineNo">8239</span>  }<a name="line.8239"></a>
-<span class="sourceLineNo">8240</span><a name="line.8240"></a>
-<span class="sourceLineNo">8241</span>  /**<a name="line.8241"></a>
-<span class="sourceLineNo">8242</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8242"></a>
-<span class="sourceLineNo">8243</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8243"></a>
-<span class="sourceLineNo">8244</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8244"></a>
-<span class="sourceLineNo">8245</span>   * method before they are available.<a name="line.8245"></a>
-<span class="sourceLineNo">8246</span>   *<a name="line.8246"></a>
-<span class="sourceLineNo">8247</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8247"></a>
-<span class="sourceLineNo">8248</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8248"></a>
-<span class="sourceLineNo">8249</span>   *     and parameters for the method invocation<a name="line.8249"></a>
-<span class="sourceLineNo">8250</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8250"></a>
-<span class="sourceLineNo">8251</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8251"></a>
-<span class="sourceLineNo">8252</span>   *     occurs during the invocation<a name="line.8252"></a>
-<span class="sourceLineNo">8253</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8253"></a>
-<span class="sourceLineNo">8254</span>   */<a name="line.8254"></a>
-<span class="sourceLineNo">8255</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8255"></a>
-<span class="sourceLineNo">8256</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8256"></a>
-<span class="sourceLineNo">8257</span>    String serviceName = call.getServiceName();<a name="line.8257"></a>
-<span class="sourceLineNo">8258</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8258"></a>
-<span class="sourceLineNo">8259</span>    if (service == null) {<a name="line.8259"></a>
-<span class="sourceLineNo">8260</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8260"></a>
-<span class="sourceLineNo">8261</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8261"></a>
-<span class="sourceLineNo">8262</span>    }<a name="line.8262"></a>
-<span class="sourceLineNo">8263</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8263"></a>
+<span class="sourceLineNo">8063</span>        default: throw new UnsupportedOperationException(op.toString());<a name="line.8063"></a>
+<span class="sourceLineNo">8064</span>      }<a name="line.8064"></a>
+<span class="sourceLineNo">8065</span><a name="line.8065"></a>
+<span class="sourceLineNo">8066</span>      // Give coprocessors a chance to update the new cell<a name="line.8066"></a>
+<span class="sourceLineNo">8067</span>      if (coprocessorHost != null) {<a name="line.8067"></a>
+<span class="sourceLineNo">8068</span>        newCell =<a name="line.8068"></a>
+<span class="sourceLineNo">8069</span>            coprocessorHost.postMutationBeforeWAL(mutationType, mutation, currentValue, newCell);<a name="line.8069"></a>
+<span class="sourceLineNo">8070</span>      }<a name="line.8070"></a>
+<span class="sourceLineNo">8071</span>      toApply.add(newCell);<a name="line.8071"></a>
+<span class="sourceLineNo">8072</span>      // Add to results to get returned to the Client. If null, cilent does not want results.<a name="line.8072"></a>
+<span class="sourceLineNo">8073</span>      if (results != null) {<a name="line.8073"></a>
+<span class="sourceLineNo">8074</span>        results.add(newCell);<a name="line.8074"></a>
+<span class="sourceLineNo">8075</span>      }<a name="line.8075"></a>
+<span class="sourceLineNo">8076</span>    }<a name="line.8076"></a>
+<span class="sourceLineNo">8077</span>    return toApply;<a name="line.8077"></a>
+<span class="sourceLineNo">8078</span>  }<a name="line.8078"></a>
+<span class="sourceLineNo">8079</span><a name="line.8079"></a>
+<span class="sourceLineNo">8080</span>  private static Cell reckonDelta(final Cell delta, final Cell currentCell,<a name="line.8080"></a>
+<span class="sourceLineNo">8081</span>                                  final byte[] columnFamily, final long now,<a name="line.8081"></a>
+<span class="sourceLineNo">8082</span>                                  Mutation mutation, Function&lt;Cell, byte[]&gt; supplier) throws IOException {<a name="line.8082"></a>
+<span class="sourceLineNo">8083</span>    // Forward any tags found on the delta.<a name="line.8083"></a>
+<span class="sourceLineNo">8084</span>    List&lt;Tag&gt; tags = TagUtil.carryForwardTags(delta);<a name="line.8084"></a>
+<span class="sourceLineNo">8085</span>    tags = TagUtil.carryForwardTTLTag(tags, mutation.getTTL());<a name="line.8085"></a>
+<span class="sourceLineNo">8086</span>    if (currentCell != null) {<a name="line.8086"></a>
+<span class="sourceLineNo">8087</span>      tags = TagUtil.carryForwardTags(tags, currentCell);<a name="line.8087"></a>
+<span class="sourceLineNo">8088</span>      byte[] newValue = supplier.apply(currentCell);<a name="line.8088"></a>
+<span class="sourceLineNo">8089</span>      return ExtendedCellBuilderFactory.create(CellBuilderType.SHALLOW_COPY)<a name="line.8089"></a>
+<span class="sourceLineNo">8090</span>              .setRow(mutation.getRow(), 0, mutation.getRow().length)<a name="line.8090"></a>
+<span class="sourceLineNo">8091</span>              .setFamily(columnFamily, 0, columnFamily.length)<a name="line.8091"></a>
+<span class="sourceLineNo">8092</span>              // copy the qualifier if the cell is located in shared memory.<a name="line.8092"></a>
+<span class="sourceLineNo">8093</span>              .setQualifier(CellUtil.cloneQualifier(delta))<a name="line.8093"></a>
+<span class="sourceLineNo">8094</span>              .setTimestamp(Math.max(currentCell.getTimestamp() + 1, now))<a name="line.8094"></a>
+<span class="sourceLineNo">8095</span>              .setType(KeyValue.Type.Put.getCode())<a name="line.8095"></a>
+<span class="sourceLineNo">8096</span>              .setValue(newValue, 0, newValue.length)<a name="line.8096"></a>
+<span class="sourceLineNo">8097</span>              .setTags(TagUtil.fromList(tags))<a name="line.8097"></a>
+<span class="sourceLineNo">8098</span>              .build();<a name="line.8098"></a>
+<span class="sourceLineNo">8099</span>    } else {<a name="line.8099"></a>
+<span class="sourceLineNo">8100</span>      PrivateCellUtil.updateLatestStamp(delta, now);<a name="line.8100"></a>
+<span class="sourceLineNo">8101</span>      return CollectionUtils.isEmpty(tags) ? delta : PrivateCellUtil.createCell(delta, tags);<a name="line.8101"></a>
+<span class="sourceLineNo">8102</span>    }<a name="line.8102"></a>
+<span class="sourceLineNo">8103</span>  }<a name="line.8103"></a>
+<span class="sourceLineNo">8104</span><a name="line.8104"></a>
+<span class="sourceLineNo">8105</span>  /**<a name="line.8105"></a>
+<span class="sourceLineNo">8106</span>   * @return Get the long out of the passed in Cell<a name="line.8106"></a>
+<span class="sourceLineNo">8107</span>   */<a name="line.8107"></a>
+<span class="sourceLineNo">8108</span>  private static long getLongValue(final Cell cell) throws DoNotRetryIOException {<a name="line.8108"></a>
+<span class="sourceLineNo">8109</span>    int len = cell.getValueLength();<a name="line.8109"></a>
+<span class="sourceLineNo">8110</span>    if (len != Bytes.SIZEOF_LONG) {<a name="line.8110"></a>
+<span class="sourceLineNo">8111</span>      // throw DoNotRetryIOException instead of IllegalArgumentException<a name="line.8111"></a>
+<span class="sourceLineNo">8112</span>      throw new DoNotRetryIOException("Field is not a long, it's " + len + " bytes wide");<a name="line.8112"></a>
+<span class="sourceLineNo">8113</span>    }<a name="line.8113"></a>
+<span class="sourceLineNo">8114</span>    return PrivateCellUtil.getValueAsLong(cell);<a name="line.8114"></a>
+<span class="sourceLineNo">8115</span>  }<a name="line.8115"></a>
+<span class="sourceLineNo">8116</span><a name="line.8116"></a>
+<span class="sourceLineNo">8117</span>  /**<a name="line.8117"></a>
+<span class="sourceLineNo">8118</span>   * Do a specific Get on passed &lt;code&gt;columnFamily&lt;/code&gt; and column qualifiers.<a name="line.8118"></a>
+<span class="sourceLineNo">8119</span>   * @param mutation Mutation we are doing this Get for.<a name="line.8119"></a>
+<span class="sourceLineNo">8120</span>   * @param store Which column family on row (TODO: Go all Gets in one go)<a name="line.8120"></a>
+<span class="sourceLineNo">8121</span>   * @param coordinates Cells from &lt;code&gt;mutation&lt;/code&gt; used as coordinates applied to Get.<a name="line.8121"></a>
+<span class="sourceLineNo">8122</span>   * @return Return list of Cells found.<a name="line.8122"></a>
+<span class="sourceLineNo">8123</span>   */<a name="line.8123"></a>
+<span class="sourceLineNo">8124</span>  private List&lt;Cell&gt; get(Mutation mutation, HStore store, List&lt;Cell&gt; coordinates,<a name="line.8124"></a>
+<span class="sourceLineNo">8125</span>      IsolationLevel isolation, TimeRange tr) throws IOException {<a name="line.8125"></a>
+<span class="sourceLineNo">8126</span>    // Sort the cells so that they match the order that they appear in the Get results. Otherwise,<a name="line.8126"></a>
+<span class="sourceLineNo">8127</span>    // we won't be able to find the existing values if the cells are not specified in order by the<a name="line.8127"></a>
+<span class="sourceLineNo">8128</span>    // client since cells are in an array list.<a name="line.8128"></a>
+<span class="sourceLineNo">8129</span>    // TODO: I don't get why we are sorting. St.Ack 20150107<a name="line.8129"></a>
+<span class="sourceLineNo">8130</span>    sort(coordinates, store.getComparator());<a name="line.8130"></a>
+<span class="sourceLineNo">8131</span>    Get get = new Get(mutation.getRow());<a name="line.8131"></a>
+<span class="sourceLineNo">8132</span>    if (isolation != null) {<a name="line.8132"></a>
+<span class="sourceLineNo">8133</span>      get.setIsolationLevel(isolation);<a name="line.8133"></a>
+<span class="sourceLineNo">8134</span>    }<a name="line.8134"></a>
+<span class="sourceLineNo">8135</span>    for (Cell cell: coordinates) {<a name="line.8135"></a>
+<span class="sourceLineNo">8136</span>      get.addColumn(store.getColumnFamilyDescriptor().getName(), CellUtil.cloneQualifier(cell));<a name="line.8136"></a>
+<span class="sourceLineNo">8137</span>    }<a name="line.8137"></a>
+<span class="sourceLineNo">8138</span>    // Increments carry time range. If an Increment instance, put it on the Get.<a name="line.8138"></a>
+<span class="sourceLineNo">8139</span>    if (tr != null) {<a name="line.8139"></a>
+<span class="sourceLineNo">8140</span>      get.setTimeRange(tr.getMin(), tr.getMax());<a name="line.8140"></a>
+<span class="sourceLineNo">8141</span>    }<a name="line.8141"></a>
+<span class="sourceLineNo">8142</span>    return get(get, false);<a name="line.8142"></a>
+<span class="sourceLineNo">8143</span>  }<a name="line.8143"></a>
+<span class="sourceLineNo">8144</span><a name="line.8144"></a>
+<span class="sourceLineNo">8145</span>  /**<a name="line.8145"></a>
+<span class="sourceLineNo">8146</span>   * @return Sorted list of &lt;code&gt;cells&lt;/code&gt; using &lt;code&gt;comparator&lt;/code&gt;<a name="line.8146"></a>
+<span class="sourceLineNo">8147</span>   */<a name="line.8147"></a>
+<span class="sourceLineNo">8148</span>  private static List&lt;Cell&gt; sort(List&lt;Cell&gt; cells, final CellComparator comparator) {<a name="line.8148"></a>
+<span class="sourceLineNo">8149</span>    cells.sort(comparator);<a name="line.8149"></a>
+<span class="sourceLineNo">8150</span>    return cells;<a name="line.8150"></a>
+<span class="sourceLineNo">8151</span>  }<a name="line.8151"></a>
+<span class="sourceLineNo">8152</span><a name="line.8152"></a>
+<span class="sourceLineNo">8153</span>  public static final long FIXED_OVERHEAD = ClassSize.align(<a name="line.8153"></a>
+<span class="sourceLineNo">8154</span>      ClassSize.OBJECT +<a name="line.8154"></a>
+<span class="sourceLineNo">8155</span>      ClassSize.ARRAY +<a name="line.8155"></a>
+<span class="sourceLineNo">8156</span>      55 * ClassSize.REFERENCE + 3 * Bytes.SIZEOF_INT +<a name="line.8156"></a>
+<span class="sourceLineNo">8157</span>      (15 * Bytes.SIZEOF_LONG) +<a name="line.8157"></a>
+<span class="sourceLineNo">8158</span>      3 * Bytes.SIZEOF_BOOLEAN);<a name="line.8158"></a>
+<span class="sourceLineNo">8159</span><a name="line.8159"></a>
+<span class="sourceLineNo">8160</span>  // woefully out of date - currently missing:<a name="line.8160"></a>
+<span class="sourceLineNo">8161</span>  // 1 x HashMap - coprocessorServiceHandlers<a name="line.8161"></a>
+<span class="sourceLineNo">8162</span>  // 6 x LongAdder - numMutationsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8162"></a>
+<span class="sourceLineNo">8163</span>  //   checkAndMutateChecksPassed, checkAndMutateChecksFailed, readRequestsCount,<a name="line.8163"></a>
+<span class="sourceLineNo">8164</span>  //   writeRequestsCount, cpRequestsCount<a name="line.8164"></a>
+<span class="sourceLineNo">8165</span>  // 1 x HRegion$WriteState - writestate<a name="line.8165"></a>
+<span class="sourceLineNo">8166</span>  // 1 x RegionCoprocessorHost - coprocessorHost<a name="line.8166"></a>
+<span class="sourceLineNo">8167</span>  // 1 x RegionSplitPolicy - splitPolicy<a name="line.8167"></a>
+<span class="sourceLineNo">8168</span>  // 1 x MetricsRegion - metricsRegion<a name="line.8168"></a>
+<span class="sourceLineNo">8169</span>  // 1 x MetricsRegionWrapperImpl - metricsRegionWrapper<a name="line.8169"></a>
+<span class="sourceLineNo">8170</span>  public static final long DEEP_OVERHEAD = FIXED_OVERHEAD +<a name="line.8170"></a>
+<span class="sourceLineNo">8171</span>      ClassSize.OBJECT + // closeLock<a name="line.8171"></a>
+<span class="sourceLineNo">8172</span>      (2 * ClassSize.ATOMIC_BOOLEAN) + // closed, closing<a name="line.8172"></a>
+<span class="sourceLineNo">8173</span>      (3 * ClassSize.ATOMIC_LONG) + // numPutsWithoutWAL, dataInMemoryWithoutWAL,<a name="line.8173"></a>
+<span class="sourceLineNo">8174</span>                                    // compactionsFailed<a name="line.8174"></a>
+<span class="sourceLineNo">8175</span>      (2 * ClassSize.CONCURRENT_HASHMAP) +  // lockedRows, scannerReadPoints<a name="line.8175"></a>
+<span class="sourceLineNo">8176</span>      WriteState.HEAP_SIZE + // writestate<a name="line.8176"></a>
+<span class="sourceLineNo">8177</span>      ClassSize.CONCURRENT_SKIPLISTMAP + ClassSize.CONCURRENT_SKIPLISTMAP_ENTRY + // stores<a name="line.8177"></a>
+<span class="sourceLineNo">8178</span>      (2 * ClassSize.REENTRANT_LOCK) + // lock, updatesLock<a name="line.8178"></a>
+<span class="sourceLineNo">8179</span>      MultiVersionConcurrencyControl.FIXED_SIZE // mvcc<a name="line.8179"></a>
+<span class="sourceLineNo">8180</span>      + 2 * ClassSize.TREEMAP // maxSeqIdInStores, replicationScopes<a name="line.8180"></a>
+<span class="sourceLineNo">8181</span>      + 2 * ClassSize.ATOMIC_INTEGER // majorInProgress, minorInProgress<a name="line.8181"></a>
+<span class="sourceLineNo">8182</span>      + ClassSize.STORE_SERVICES // store services<a name="line.8182"></a>
+<span class="sourceLineNo">8183</span>      + StoreHotnessProtector.FIXED_SIZE<a name="line.8183"></a>
+<span class="sourceLineNo">8184</span>      ;<a name="line.8184"></a>
+<span class="sourceLineNo">8185</span><a name="line.8185"></a>
+<span class="sourceLineNo">8186</span>  @Override<a name="line.8186"></a>
+<span class="sourceLineNo">8187</span>  public long heapSize() {<a name="line.8187"></a>
+<span class="sourceLineNo">8188</span>    // this does not take into account row locks, recent flushes, mvcc entries, and more<a name="line.8188"></a>
+<span class="sourceLineNo">8189</span>    return DEEP_OVERHEAD + stores.values().stream().mapToLong(HStore::heapSize).sum();<a name="line.8189"></a>
+<span class="sourceLineNo">8190</span>  }<a name="line.8190"></a>
+<span class="sourceLineNo">8191</span><a name="line.8191"></a>
+<span class="sourceLineNo">8192</span>  /**<a name="line.8192"></a>
+<span class="sourceLineNo">8193</span>   * Registers a new protocol buffer {@link Service} subclass as a coprocessor endpoint to<a name="line.8193"></a>
+<span class="sourceLineNo">8194</span>   * be available for handling Region#execService(com.google.protobuf.RpcController,<a name="line.8194"></a>
+<span class="sourceLineNo">8195</span>   *    org.apache.hadoop.hbase.protobuf.generated.ClientProtos.CoprocessorServiceCall) calls.<a name="line.8195"></a>
+<span class="sourceLineNo">8196</span>   *<a name="line.8196"></a>
+<span class="sourceLineNo">8197</span>   * &lt;p&gt;<a name="line.8197"></a>
+<span class="sourceLineNo">8198</span>   * Only a single instance may be registered per region for a given {@link Service} subclass (the<a name="line.8198"></a>
+<span class="sourceLineNo">8199</span>   * instances are keyed on {@link com.google.protobuf.Descriptors.ServiceDescriptor#getFullName()}.<a name="line.8199"></a>
+<span class="sourceLineNo">8200</span>   * After the first registration, subsequent calls with the same service name will fail with<a name="line.8200"></a>
+<span class="sourceLineNo">8201</span>   * a return value of {@code false}.<a name="line.8201"></a>
+<span class="sourceLineNo">8202</span>   * &lt;/p&gt;<a name="line.8202"></a>
+<span class="sourceLineNo">8203</span>   * @param instance the {@code Service} subclass instance to expose as a coprocessor endpoint<a name="line.8203"></a>
+<span class="sourceLineNo">8204</span>   * @return {@code true} if the registration was successful, {@code false}<a name="line.8204"></a>
+<span class="sourceLineNo">8205</span>   * otherwise<a name="line.8205"></a>
+<span class="sourceLineNo">8206</span>   */<a name="line.8206"></a>
+<span class="sourceLineNo">8207</span>  public boolean registerService(com.google.protobuf.Service instance) {<a name="line.8207"></a>
+<span class="sourceLineNo">8208</span>    /*<a name="line.8208"></a>
+<span class="sourceLineNo">8209</span>     * No stacking of instances is allowed for a single service name<a name="line.8209"></a>
+<span class="sourceLineNo">8210</span>     */<a name="line.8210"></a>
+<span class="sourceLineNo">8211</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = instance.getDescriptorForType();<a name="line.8211"></a>
+<span class="sourceLineNo">8212</span>    String serviceName = CoprocessorRpcUtils.getServiceName(serviceDesc);<a name="line.8212"></a>
+<span class="sourceLineNo">8213</span>    if (coprocessorServiceHandlers.containsKey(serviceName)) {<a name="line.8213"></a>
+<span class="sourceLineNo">8214</span>      LOG.error("Coprocessor service " + serviceName +<a name="line.8214"></a>
+<span class="sourceLineNo">8215</span>          " already registered, rejecting request from " + instance);<a name="line.8215"></a>
+<span class="sourceLineNo">8216</span>      return false;<a name="line.8216"></a>
+<span class="sourceLineNo">8217</span>    }<a name="line.8217"></a>
+<span class="sourceLineNo">8218</span><a name="line.8218"></a>
+<span class="sourceLineNo">8219</span>    coprocessorServiceHandlers.put(serviceName, instance);<a name="line.8219"></a>
+<span class="sourceLineNo">8220</span>    if (LOG.isDebugEnabled()) {<a name="line.8220"></a>
+<span class="sourceLineNo">8221</span>      LOG.debug("Registered coprocessor service: region=" +<a name="line.8221"></a>
+<span class="sourceLineNo">8222</span>          Bytes.toStringBinary(getRegionInfo().getRegionName()) +<a name="line.8222"></a>
+<span class="sourceLineNo">8223</span>          " service=" + serviceName);<a name="line.8223"></a>
+<span class="sourceLineNo">8224</span>    }<a name="line.8224"></a>
+<span class="sourceLineNo">8225</span>    return true;<a name="line.8225"></a>
+<span class="sourceLineNo">8226</span>  }<a name="line.8226"></a>
+<span class="sourceLineNo">8227</span><a name="line.8227"></a>
+<span class="sourceLineNo">8228</span>  /**<a name="line.8228"></a>
+<span class="sourceLineNo">8229</span>   * Executes a single protocol buffer coprocessor endpoint {@link Service} method using<a name="line.8229"></a>
+<span class="sourceLineNo">8230</span>   * the registered protocol handlers.  {@link Service} implementations must be registered via the<a name="line.8230"></a>
+<span class="sourceLineNo">8231</span>   * {@link #registerService(com.google.protobuf.Service)}<a name="line.8231"></a>
+<span class="sourceLineNo">8232</span>   * method before they are available.<a name="line.8232"></a>
+<span class="sourceLineNo">8233</span>   *<a name="line.8233"></a>
+<span class="sourceLineNo">8234</span>   * @param controller an {@code RpcContoller} implementation to pass to the invoked service<a name="line.8234"></a>
+<span class="sourceLineNo">8235</span>   * @param call a {@code CoprocessorServiceCall} instance identifying the service, method,<a name="line.8235"></a>
+<span class="sourceLineNo">8236</span>   *     and parameters for the method invocation<a name="line.8236"></a>
+<span class="sourceLineNo">8237</span>   * @return a protocol buffer {@code Message} instance containing the method's result<a name="line.8237"></a>
+<span class="sourceLineNo">8238</span>   * @throws IOException if no registered service handler is found or an error<a name="line.8238"></a>
+<span class="sourceLineNo">8239</span>   *     occurs during the invocation<a name="line.8239"></a>
+<span class="sourceLineNo">8240</span>   * @see #registerService(com.google.protobuf.Service)<a name="line.8240"></a>
+<span class="sourceLineNo">8241</span>   */<a name="line.8241"></a>
+<span class="sourceLineNo">8242</span>  public com.google.protobuf.Message execService(com.google.protobuf.RpcController controller,<a name="line.8242"></a>
+<span class="sourceLineNo">8243</span>      CoprocessorServiceCall call) throws IOException {<a name="line.8243"></a>
+<span class="sourceLineNo">8244</span>    String serviceName = call.getServiceName();<a name="line.8244"></a>
+<span class="sourceLineNo">8245</span>    com.google.protobuf.Service service = coprocessorServiceHandlers.get(serviceName);<a name="line.8245"></a>
+<span class="sourceLineNo">8246</span>    if (service == null) {<a name="line.8246"></a>
+<span class="sourceLineNo">8247</span>      throw new UnknownProtocolException(null, "No registered coprocessor service found for " +<a name="line.8247"></a>
+<span class="sourceLineNo">8248</span>          serviceName + " in region " + Bytes.toStringBinary(getRegionInfo().getRegionName()));<a name="line.8248"></a>
+<span class="sourceLineNo">8249</span>    }<a name="line.8249"></a>
+<span class="sourceLineNo">8250</span>    com.google.protobuf.Descriptors.ServiceDescriptor serviceDesc = service.getDescriptorForType();<a name="line.8250"></a>
+<span class="sourceLineNo">8251</span><a name="line.8251"></a>
+<span class="sourceLineNo">8252</span>    cpRequestsCount.increment();<a name="line.8252"></a>
+<span class="sourceLineNo">8253</span>    String methodName = call.getMethodName();<a name="line.8253"></a>
+<span class="sourceLineNo">8254</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8254"></a>
+<span class="sourceLineNo">8255</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8255"></a>
+<span class="sourceLineNo">8256</span><a name="line.8256"></a>
+<span class="sourceLineNo">8257</span>    com.google.protobuf.Message.Builder builder =<a name="line.8257"></a>
+<span class="sourceLineNo">8258</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8258"></a>
+<span class="sourceLineNo">8259</span><a name="line.8259"></a>
+<span class="sourceLineNo">8260</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8260"></a>
+<span class="sourceLineNo">8261</span>        call.getRequest().toByteArray());<a name="line.8261"></a>
+<span class="sourceLineNo">8262</span>    com.google.protobuf.Message request =<a name="line.8262"></a>
+<span class="sourceLineNo">8263</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8263"></a>
 <span class="sourceLineNo">8264</span><a name="line.8264"></a>
-<span class="sourceLineNo">8265</span>    cpRequestsCount.increment();<a name="line.8265"></a>
-<span class="sourceLineNo">8266</span>    String methodName = call.getMethodName();<a name="line.8266"></a>
-<span class="sourceLineNo">8267</span>    com.google.protobuf.Descriptors.MethodDescriptor methodDesc =<a name="line.8267"></a>
-<span class="sourceLineNo">8268</span>        CoprocessorRpcUtils.getMethodDescriptor(methodName, serviceDesc);<a name="line.8268"></a>
-<span class="sourceLineNo">8269</span><a name="line.8269"></a>
-<span class="sourceLineNo">8270</span>    com.google.protobuf.Message.Builder builder =<a name="line.8270"></a>
-<span class="sourceLineNo">8271</span>        service.getRequestPrototype(methodDesc).newBuilderForType();<a name="line.8271"></a>
-<span class="sourceLineNo">8272</span><a name="line.8272"></a>
-<span class="sourceLineNo">8273</span>    org.apache.hadoop.hbase.protobuf.ProtobufUtil.mergeFrom(builder,<a name="line.8273"></a>
-<span class="sourceLineNo">8274</span>        call.getRequest().toByteArray());<a name="line.8274"></a>
-<span class="sourceLineNo">8275</span>    com.google.protobuf.Message request =<a name="line.8275"></a>
-<span class="sourceLineNo">8276</span>        CoprocessorRpcUtils.getRequest(service, methodDesc, call.getRequest());<a name="line.8276"></a>
-<span class="sourceLineNo">8277</span><a name="line.8277"></a>
-<span class="sourceLineNo">8278</span>    if (coprocessorHost != null) {<a name="line.8278"></a>
-<span class="sourceLineNo">8279</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8279"></a>
-<span class="sourceLineNo">8280</span>    }<a name="line.8280"></a>
-<span class="sourceLineNo">8281</span><a name="line.8281"></a>
-<span class="sourceLineNo">8282</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8282"></a>
-<span class="sourceLineNo">8283</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8283"></a>
-<span class="sourceLineNo">8284</span>    service.callMethod(methodDesc, controller, request,<a name="line.8284"></a>
-<span class="sourceLineNo">8285</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8285"></a>
-<span class="sourceLineNo">8286</span>      @Override<a name="line.8286"></a>
-<span class="sourceLineNo">8287</span>      public void run(com.google.protobuf.Message message) {<a name="line.8287"></a>
-<span class="sourceLineNo">8288</span>        if (message != null) {<a name="line.8288"></a>
-<span class="sourceLineNo">8289</span>          responseBuilder.mergeFrom(message);<a name="line.8289"></a>
-<span class="sourceLineNo">8290</span>        }<a name="line.8290"></a>
-<span class="sourceLineNo">8291</span>      }<a name="line.8291"></a>
-<span class="sourceLineNo">8292</span>    });<a name="line.8292"></a>
-<span class="sourceLineNo">8293</span><a name="line.8293"></a>
-<span class="sourceLineNo">8294</span>    if (coprocessorHost != null) {<a name="line.8294"></a>
-<span class="sourceLineNo">8295</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8295"></a>
-<span class="sourceLineNo">8296</span>    }<a name="line.8296"></a>
-<span class="sourceLineNo">8297</span>    IOException exception =<a name="line.8297"></a>
-<span class="sourceLineNo">8298</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8298"></a>
-<span class="sourceLineNo">8299</span>    if (exception != null) {<a name="line.8299"></a>
-<span class="sourceLineNo">8300</span>      throw exception;<a name="line.8300"></a>
-<span class="sourceLineNo">8301</span>    }<a name="line.8301"></a>
-<span class="sourceLineNo">8302</span><a name="line.8302"></a>
-<span class="sourceLineNo">8303</span>    return responseBuilder.build();<a name="line.8303"></a>
-<span class="sourceLineNo">8304</span>  }<a name="line.8304"></a>
-<span class="sourceLineNo">8305</span><a name="line.8305"></a>
-<span class="sourceLineNo">8306</span>  boolean shouldForceSplit() {<a name="line.8306"></a>
-<span class="sourceLineNo">8307</span>    return this.splitRequest;<a name="line.8307"></a>
+<span class="sourceLineNo">8265</span>    if (coprocessorHost != null) {<a name="line.8265"></a>
+<span class="sourceLineNo">8266</span>      request = coprocessorHost.preEndpointInvocation(service, methodName, request);<a name="line.8266"></a>
+<span class="sourceLineNo">8267</span>    }<a name="line.8267"></a>
+<span class="sourceLineNo">8268</span><a name="line.8268"></a>
+<span class="sourceLineNo">8269</span>    final com.google.protobuf.Message.Builder responseBuilder =<a name="line.8269"></a>
+<span class="sourceLineNo">8270</span>        service.getResponsePrototype(methodDesc).newBuilderForType();<a name="line.8270"></a>
+<span class="sourceLineNo">8271</span>    service.callMethod(methodDesc, controller, request,<a name="line.8271"></a>
+<span class="sourceLineNo">8272</span>        new com.google.protobuf.RpcCallback&lt;com.google.protobuf.Message&gt;() {<a name="line.8272"></a>
+<span class="sourceLineNo">8273</span>      @Override<a name="line.8273"></a>
+<span class="sourceLineNo">8274</span>      public void run(com.google.protobuf.Message message) {<a name="line.8274"></a>
+<span class="sourceLineNo">8275</span>        if (message != null) {<a name="line.8275"></a>
+<span class="sourceLineNo">8276</span>          responseBuilder.mergeFrom(message);<a name="line.8276"></a>
+<span class="sourceLineNo">8277</span>        }<a name="line.8277"></a>
+<span class="sourceLineNo">8278</span>      }<a name="line.8278"></a>
+<span class="sourceLineNo">8279</span>    });<a name="line.8279"></a>
+<span class="sourceLineNo">8280</span><a name="line.8280"></a>
+<span class="sourceLineNo">8281</span>    if (coprocessorHost != null) {<a name="line.8281"></a>
+<span class="sourceLineNo">8282</span>      coprocessorHost.postEndpointInvocation(service, methodName, request, responseBuilder);<a name="line.8282"></a>
+<span class="sourceLineNo">8283</span>    }<a name="line.8283"></a>
+<span class="sourceLineNo">8284</span>    IOException exception =<a name="line.8284"></a>
+<span class="sourceLineNo">8285</span>        org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.getControllerException(controller);<a name="line.8285"></a>
+<span class="sourceLineNo">8286</span>    if (exception != null) {<a name="line.8286"></a>
+<span class="sourceLineNo">8287</span>      throw exception;<a name="line.8287"></a>
+<span class="sourceLineNo">8288</span>    }<a name="line.8288"></a>
+<span class="sourceLineNo">8289</span><a name="line.8289"></a>
+<span class="sourceLineNo">8290</span>    return responseBuilder.build();<a name="line.8290"></a>
+<span class="sourceLineNo">8291</span>  }<a name="line.8291"></a>
+<span class="sourceLineNo">8292</span><a name="line.8292"></a>
+<span class="sourceLineNo">8293</span>  boolean shouldForceSplit() {<a name="line.8293"></a>
+<span class="sourceLineNo">8294</span>    return this.splitRequest;<a name="line.8294"></a>
+<span class="sourceLineNo">8295</span>  }<a name="line.8295"></a>
+<span class="sourceLineNo">8296</span><a name="line.8296"></a>
+<span class="sourceLineNo">8297</span>  byte[] getExplicitSplitPoint() {<a name="line.8297"></a>
+<span class="sourceLineNo">8298</span>    return this.explicitSplitPoint;<a name="line.8298"></a>
+<span class="sourceLineNo">8299</span>  }<a name="line.8299"></a>
+<span class="sourceLineNo">8300</span><a name="line.8300"></a>
+<span class="sourceLineNo">8301</span>  void forceSplit(byte[] sp) {<a name="line.8301"></a>
+<span class="sourceLineNo">8302</span>    // This HRegion will go away after the forced split is successful<a name="line.8302"></a>
+<span class="sourceLineNo">8303</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8303"></a>
+<span class="sourceLineNo">8304</span>    this.splitRequest = true;<a name="line.8304"></a>
+<span class="sourceLineNo">8305</span>    if (sp != null) {<a name="line.8305"></a>
+<span class="sourceLineNo">8306</span>      this.explicitSplitPoint = sp;<a name="line.8306"></a>
+<span class="sourceLineNo">8307</span>    }<a name="line.8307"></a>
 <span class="sourceLineNo">8308</span>  }<a name="line.8308"></a>
 <span class="sourceLineNo">8309</span><a name="line.8309"></a>
-<span class="sourceLineNo">8310</span>  byte[] getExplicitSplitPoint() {<a name="line.8310"></a>
-<span class="sourceLineNo">8311</span>    return this.explicitSplitPoint;<a name="line.8311"></a>
-<span class="sourceLineNo">8312</span>  }<a name="line.8312"></a>
-<span class="sourceLineNo">8313</span><a name="line.8313"></a>
-<span class="sourceLineNo">8314</span>  void forceSplit(byte[] sp) {<a name="line.8314"></a>
-<span class="sourceLineNo">8315</span>    // This HRegion will go away after the forced split is successful<a name="line.8315"></a>
-<span class="sourceLineNo">8316</span>    // But if a forced split fails, we need to clear forced split.<a name="line.8316"></a>
-<span class="sourceLineNo">8317</span>    this.splitRequest = true;<a name="line.8317"></a>
-<span class="sourceLineNo">8318</span>    if (sp != null) {<a name="line.8318"></a>
-<span class="sourceLineNo">8319</span>      this.explicitSplitPoint = sp;<a name="line.8319"></a>
-<span class="sourceLineNo">8320</span>    }<a name="line.8320"></a>
-<span class="sourceLineNo">8321</span>  }<a name="line.8321"></a>
-<span class="sourceLineNo">8322</span><a name="line.8322"></a>
-<span class="sourceLineNo">8323</span>  void clearSplit() {<a name="line.8323"></a>
-<span class="sourceLineNo">8324</span>    this.splitRequest = false;<a name="line.8324"></a>
-<span class="sourceLineNo">8325</span>    this.explicitSplitPoint = null;<a name="line.8325"></a>
-<span class="sourceLineNo">8326</span>  }<a name="line.8326"></a>
-<span class="sourceLineNo">8327</span><a name="line.8327"></a>
-<span class="sourceLineNo">8328</span>  /**<a name="line.8328"></a>
-<span class="sourceLineNo">8329</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8329"></a>
-<span class="sourceLineNo">8330</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8330"></a>
-<span class="sourceLineNo">8331</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8331"></a>
-<span class="sourceLineNo">8332</span>   * is based on the size of the store.<a name="line.8332"></a>
-<span class="sourceLineNo">8333</span>   */<a name="line.8333"></a>
-<span class="sourceLineNo">8334</span>  public byte[] checkSplit() {<a name="line.8334"></a>
-<span class="sourceLineNo">8335</span>    // Can't split META<a name="line.8335"></a>
-<span class="sourceLineNo">8336</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8336"></a>
-<span class="sourceLineNo">8337</span>      if (shouldForceSplit()) {<a name="line.8337"></a>
-<span class="sourceLineNo">8338</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8338"></a>
-<span class="sourceLineNo">8339</span>      }<a name="line.8339"></a>
-<span class="sourceLineNo">8340</span>      return null;<a name="line.8340"></a>
-<span class="sourceLineNo">8341</span>    }<a name="line.8341"></a>
-<span class="sourceLineNo">8342</span><a name="line.8342"></a>
-<span class="sourceLineNo">8343</span>    // Can't split a region that is closing.<a name="line.8343"></a>
-<span class="sourceLineNo">8344</span>    if (this.isClosing()) {<a name="line.8344"></a>
-<span class="sourceLineNo">8345</span>      return null;<a name="line.8345"></a>
-<span class="sourceLineNo">8346</span>    }<a name="line.8346"></a>
-<span class="sourceLineNo">8347</span><a name="line.8347"></a>
-<span class="sourceLineNo">8348</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8348"></a>
-<span class="sourceLineNo">8349</span>      return null;<a name="line.8349"></a>
-<span class="sourceLineNo">8350</span>    }<a name="line.8350"></a>
+<span class="sourceLineNo">8310</span>  void clearSplit() {<a name="line.8310"></a>
+<span class="sourceLineNo">8311</span>    this.splitRequest = false;<a name="line.8311"></a>
+<span class="sourceLineNo">8312</span>    this.explicitSplitPoint = null;<a name="line.8312"></a>
+<span class="sourceLineNo">8313</span>  }<a name="line.8313"></a>
+<span class="sourceLineNo">8314</span><a name="line.8314"></a>
+<span class="sourceLineNo">8315</span>  /**<a name="line.8315"></a>
+<span class="sourceLineNo">8316</span>   * Return the splitpoint. null indicates the region isn't splittable<a name="line.8316"></a>
+<span class="sourceLineNo">8317</span>   * If the splitpoint isn't explicitly specified, it will go over the stores<a name="line.8317"></a>
+<span class="sourceLineNo">8318</span>   * to find the best splitpoint. Currently the criteria of best splitpoint<a name="line.8318"></a>
+<span class="sourceLineNo">8319</span>   * is based on the size of the store.<a name="line.8319"></a>
+<span class="sourceLineNo">8320</span>   */<a name="line.8320"></a>
+<span class="sourceLineNo">8321</span>  public byte[] checkSplit() {<a name="line.8321"></a>
+<span class="sourceLineNo">8322</span>    // Can't split META<a name="line.8322"></a>
+<span class="sourceLineNo">8323</span>    if (this.getRegionInfo().isMetaRegion()) {<a name="line.8323"></a>
+<span class="sourceLineNo">8324</span>      if (shouldForceSplit()) {<a name="line.8324"></a>
+<span class="sourceLineNo">8325</span>        LOG.warn("Cannot split meta region in HBase 0.20 and above");<a name="line.8325"></a>
+<span class="sourceLineNo">8326</span>      }<a name="line.8326"></a>
+<span class="sourceLineNo">8327</span>      return null;<a name="line.8327"></a>
+<span class="sourceLineNo">8328</span>    }<a name="line.8328"></a>
+<span class="sourceLineNo">8329</span><a name="line.8329"></a>
+<span class="sourceLineNo">8330</span>    // Can't split a region that is closing.<a name="line.8330"></a>
+<span class="sourceLineNo">8331</span>    if (this.isClosing()) {<a name="line.8331"></a>
+<span class="sourceLineNo">8332</span>      return null;<a name="line.8332"></a>
+<span class="sourceLineNo">8333</span>    }<a name="line.8333"></a>
+<span class="sourceLineNo">8334</span><a name="line.8334"></a>
+<span class="sourceLineNo">8335</span>    if (!splitPolicy.shouldSplit()) {<a name="line.8335"></a>
+<span class="sourceLineNo">8336</span>      return null;<a name="line.8336"></a>
+<span class="sourceLineNo">8337</span>    }<a name="line.8337"></a>
+<span class="sourceLineNo">8338</span><a name="line.8338"></a>
+<span class="sourceLineNo">8339</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8339"></a>
+<span class="sourceLineNo">8340</span><a name="line.8340"></a>
+<span class="sourceLineNo">8341</span>    if (ret != null) {<a name="line.8341"></a>
+<span class="sourceLineNo">8342</span>      try {<a name="line.8342"></a>
+<span class="sourceLineNo">8343</span>        checkRow(ret, "calculated split");<a name="line.8343"></a>
+<span class="sourceLineNo">8344</span>      } catch (IOException e) {<a name="line.8344"></a>
+<span class="sourceLineNo">8345</span>        LOG.error("Ignoring invalid split", e);<a name="line.8345"></a>
+<span class="sourceLineNo">8346</span>        return null;<a name="line.8346"></a>
+<span class="sourceLineNo">8347</span>      }<a name="line.8347"></a>
+<span class="sourceLineNo">8348</span>    }<a name="line.8348"></a>
+<span class="sourceLineNo">8349</span>    return ret;<a name="line.8349"></a>
+<span class="sourceLineNo">8350</span>  }<a name="line.8350"></a>
 <span class="sourceLineNo">8351</span><a name="line.8351"></a>
-<span class="sourceLineNo">8352</span>    byte[] ret = splitPolicy.getSplitPoint();<a name="line.8352"></a>
-<span class="sourceLineNo">8353</span><a name="line.8353"></a>
-<span class="sourceLineNo">8354</span>    if (ret != null) {<a name="line.8354"></a>
-<span class="sourceLineNo">8355</span>      try {<a name="line.8355"></a>
-<span class="sourceLineNo">8356</span>        checkRow(ret, "calculated split");<a name="line.8356"></a>
-<span class="sourceLineNo">8357</span>      } catch (IOException e) {<a name="line.8357"></a>
-<span class="sourceLineNo">8358</span>        LOG.error("Ignoring invalid split", e);<a name="line.8358"></a>
-<span class="sourceLineNo">8359</span>        return null;<a name="line.8359"></a>
-<span class="sourceLineNo">8360</span>      }<a name="line.8360"></a>
-<span class="sourceLineNo">8361</span>    }<a name="line.8361"></a>
-<span class="sourceLineNo">8362</span>    return ret;<a name="line.8362"></a>
+<span class="sourceLineNo">8352</span>  /**<a name="line.8352"></a>
+<span class="sourceLineNo">8353</span>   * @return The priority that this region should have in the compaction queue<a name="line.8353"></a>
+<span class="sourceLineNo">8354</span>   */<a name="line.8354"></a>
+<span class="sourceLineNo">8355</span>  public int getCompactPriority() {<a name="line.8355"></a>
+<span class="sourceLineNo">8356</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8356"></a>
+<span class="sourceLineNo">8357</span>        .orElse(Store.NO_PRIORITY);<a name="line.8357"></a>
+<span class="sourceLineNo">8358</span>  }<a name="line.8358"></a>
+<span class="sourceLineNo">8359</span><a name="line.8359"></a>
+<span class="sourceLineNo">8360</span>  /** @return the coprocessor host */<a name="line.8360"></a>
+<span class="sourceLineNo">8361</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8361"></a>
+<span class="sourceLineNo">8362</span>    return coprocessorHost;<a name="line.8362"></a>
 <span class="sourceLineNo">8363</span>  }<a name="line.8363"></a>
 <span class="sourceLineNo">8364</span><a name="line.8364"></a>
-<span class="sourceLineNo">8365</span>  /**<a name="line.8365"></a>
-<span class="sourceLineNo">8366</span>   * @return The priority that this region should have in the compaction queue<a name="line.8366"></a>
-<span class="sourceLineNo">8367</span>   */<a name="line.8367"></a>
-<span class="sourceLineNo">8368</span>  public int getCompactPriority() {<a name="line.8368"></a>
-<span class="sourceLineNo">8369</span>    return stores.values().stream().mapToInt(HStore::getCompactPriority).min()<a name="line.8369"></a>
-<span class="sourceLineNo">8370</span>        .orElse(Store.NO_PRIORITY);<a name="line.8370"></a>
-<span class="sourceLineNo">8371</span>  }<a name="line.8371"></a>
-<span class="sourceLineNo">8372</span><a name="line.8372"></a>
-<span class="sourceLineNo">8373</span>  /** @return the coprocessor host */<a name="line.8373"></a>
-<span class="sourceLineNo">8374</span>  public RegionCoprocessorHost getCoprocessorHost() {<a name="line.8374"></a>
-<span class="sourceLineNo">8375</span>    return coprocessorHost;<a name="line.8375"></a>
-<span class="sourceLineNo">8376</span>  }<a name="line.8376"></a>
-<span class="sourceLineNo">8377</span><a name="line.8377"></a>
-<span class="sourceLineNo">8378</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8378"></a>
-<span class="sourceLineNo">8379</span>  @VisibleForTesting<a name="line.8379"></a>
-<span class="sourceLineNo">8380</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8380"></a>
-<span class="sourceLineNo">8381</span>    this.coprocessorHost = coprocessorHost;<a name="line.8381"></a>
-<span class="sourceLineNo">8382</span>  }<a name="line.8382"></a>
-<span class="sourceLineNo">8383</span><a name="line.8383"></a>
-<span class="sourceLineNo">8384</span>  @Override<a name="line.8384"></a>
-<span class="sourceLineNo">8385</span>  public void startRegionOperation() throws IOException {<a name="line.8385"></a>
-<span class="sourceLineNo">8386</span>    startRegionOperation(Operation.ANY);<a name="line.8386"></a>
-<span class="sourceLineNo">8387</span>  }<a name="line.8387"></a>
-<span class="sourceLineNo">8388</span><a name="line.8388"></a>
-<span class="sourceLineNo">8389</span>  @Override<a name="line.8389"></a>
-<span class="sourceLineNo">8390</span>  public void startRegionOperation(Operation op) throws IOException {<a name="line.8390"></a>
-<span class="sourceLineNo">8391</span>    switch (op) {<a name="line.8391"></a>
-<span class="sourceLineNo">8392</span>      case GET:  // read operations<a name="line.8392"></a>
-<span class="sourceLineNo">8393</span>      case SCAN:<a name="line.8393"></a>
-<span class="sourceLineNo">8394</span>        checkReadsEnabled();<a name="line.8394"></a>
-<span class="sourceLineNo">8395</span>        break;<a name="line.8395"></a>
-<span class="sourceLineNo">8396</span>      default:<a name="line.8396"></a>
-<span class="sourceLineNo">8397</span>        break;<a name="line.8397"></a>
-<span class="sourceLineNo">8398</span>    }<a name="line.8398"></a>
-<span class="sourceLineNo">8399</span>    if (op == Operation.MERGE_REGION || op == Operation.SPLIT_REGION<a name="line.8399"></a>
-<span class="sourceLineNo">8400</span>        || op == Operation.COMPACT_REGION || op == Operation.COMPACT_SWITCH) {<a name="line.8400"></a>
-<span class="sourceLineNo">8401</span>      // split, merge or compact region doesn't need to check the closing/closed state or lock the<a name="line.8401"></a>
-<span class="sourceLineNo">8402</span>      // region<a name="line.8402"></a>
-<span class="sourceLineNo">8403</span>      return;<a name="line.8403"></a>
+<span class="sourceLineNo">8365</span>  /** @param coprocessorHost the new coprocessor host */<a name="line.8365"></a>
+<span class="sourceLineNo">8366</span>  @VisibleForTesting<a name="line.8366"></a>
+<span class="sourceLineNo">8367</span>  public void setCoprocessorHost(final RegionCoprocessorHost coprocessorHost) {<a name="line.8367"></a>
+<span class="sourceLineNo">8368</span>    this.coprocessorHost = coprocessorHost;<a name="line.8368"></a>
+<span class="sourceLineNo">8369</span>  }<a name="line.8369"></a>
+<span class="sourceLineNo">8370</span><a name="line.8370"></a>
+<span class="sourceLineNo">8371</span>  @Override<a name="line.8371"></a>
+<span class="sourceLineNo">8372</span>  public void startRegionOperation() throws IOException {<a name="line.8372"></a>
+<span class="sourceLineNo">8373</span>    startRegionOperation(Operation.ANY);<a name="line.8373"></a>
+<span class="sourceLineNo">8374</span>  }<a name="line.8374"></a>
+<span class="sourceLineNo">8375</span><a name="line.8375"></a>
+<span class="sourceLineNo">8376</span>  @O

<TRUNCATED>