Published site at 7903f55c18d561d7451e91b8a014936a3116f142.
diff --git a/acid-semantics.html b/acid-semantics.html
index e5cad5c..c2d8761 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -450,7 +450,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index d3be196..78048b2 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
Binary files differ
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index c6ad8d3..175790b 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -736,6 +736,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/rest/client/RemoteHTable.html#batchCoprocessorService-com.google.protobuf.Descriptors.MethodDescriptor-com.google.protobuf.Message-byte:A-byte:A-R-org.apache.hadoop.hbase.client.coprocessor.Batch.Callback-">batchCoprocessorService(Descriptors.MethodDescriptor, Message, byte[], byte[], R, Batch.Callback&lt;R&gt;)</a></span> - Method in class org.apache.hadoop.hbase.rest.client.<a href="org/apache/hadoop/hbase/rest/client/RemoteHTable.html" title="class in org.apache.hadoop.hbase.rest.client">RemoteHTable</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TimeRange.html#between-long-long-">between(long, long)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></dt>
+<dd>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+</dd>
 <dt><a href="org/apache/hadoop/hbase/filter/BigDecimalComparator.html" title="class in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BigDecimalComparator</span></a> - Class in <a href="org/apache/hadoop/hbase/filter/package-summary.html">org.apache.hadoop.hbase.filter</a></dt>
 <dd>
 <div class="block">A BigDecimal comparator which numerical compares against the specified byte array</div>
@@ -5287,6 +5291,10 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/SingleColumnValueFilter.html#foundColumn">foundColumn</a></span> - Variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/SingleColumnValueFilter.html" title="class in org.apache.hadoop.hbase.filter">SingleColumnValueFilter</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TimeRange.html#from-long-">from(long)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></dt>
+<dd>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/ByteRangeUtils.html#fromArrays-java.util.Collection-">fromArrays(Collection&lt;byte[]&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ByteRangeUtils.html" title="class in org.apache.hadoop.hbase.util">ByteRangeUtils</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/IsolationLevel.html#fromByte-byte-">fromByte(byte)</a></span> - Static method in enum org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client">IsolationLevel</a></dt>
@@ -18681,6 +18689,10 @@
 <dd>
 <div class="block">Remove the throttling for the specified user on the specified namespace.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TimeRange.html#until-long-">until(long)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></dt>
+<dd>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/ipc/RemoteWithExtrasException.html#unwrapRemoteException--">unwrapRemoteException()</a></span> - Method in exception org.apache.hadoop.hbase.ipc.<a href="org/apache/hadoop/hbase/ipc/RemoteWithExtrasException.html" title="class in org.apache.hadoop.hbase.ipc">RemoteWithExtrasException</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/Admin.html#updateConfiguration-org.apache.hadoop.hbase.ServerName-">updateConfiguration(ServerName)</a></span> - Method in interface org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/Admin.html" title="interface in org.apache.hadoop.hbase.client">Admin</a></dt>
diff --git a/apidocs/org/apache/hadoop/hbase/io/TimeRange.html b/apidocs/org/apache/hadoop/hbase/io/TimeRange.html
index 10e5edd..7578349 100644
--- a/apidocs/org/apache/hadoop/hbase/io/TimeRange.html
+++ b/apidocs/org/apache/hadoop/hbase/io/TimeRange.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":42,"i10":10};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":10,"i4":9,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":9,"i11":10,"i12":42,"i13":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -110,18 +110,19 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.37">TimeRange</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.38">TimeRange</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Represents an interval of version timestamps. Presumes timestamps between
  <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#INITIAL_MIN_TIMESTAMP"><code>INITIAL_MIN_TIMESTAMP</code></a> and <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#INITIAL_MAX_TIMESTAMP"><code>INITIAL_MAX_TIMESTAMP</code></a> only. Gets freaked out if
  passed a timestamp that is < <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#INITIAL_MIN_TIMESTAMP"><code>INITIAL_MIN_TIMESTAMP</code></a>,
  <p>
- Evaluated according to minStamp &lt;= timestamp &lt; maxStamp
- or [minStamp,maxStamp) in interval notation.
+ Evaluated according to minStamp &lt;= timestamp &lt; maxStamp or [minStamp,maxStamp) in interval
+ notation.
  <p>
- Can be returned and read by clients.  Should not be directly created by clients.
- Thus, all constructors are purposely @InterfaceAudience.Private.
-<p>Immutable. Thread-safe.</div>
+ Can be returned and read by clients. Should not be directly created by clients. Thus, all
+ constructors are purposely @InterfaceAudience.Private.
+ <p>
+ Immutable. Thread-safe.</div>
 </li>
 </ul>
 </div>
@@ -228,42 +229,61 @@
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#at-long-">at</a></span>(long&nbsp;ts)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#between-long-long-">between</a></span>(long&nbsp;minStamp,
+       long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#compare-long-">compare</a></span>(long&nbsp;timestamp)</code>
 <div class="block">Compare the timestamp to timerange.</div>
 </td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#from-long-">from</a></span>(long&nbsp;minStamp)</code>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+</td>
+</tr>
+<tr id="i5" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#getMax--">getMax</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#getMin--">getMin</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#includesTimeRange-org.apache.hadoop.hbase.io.TimeRange-">includesTimeRange</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)</code>
 <div class="block">Check if the range has any overlap with TimeRange</div>
 </td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#isAllTime--">isAllTime</a></span>()</code>
 <div class="block">Check if it is for all time</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i10" class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#until-long-">until</a></span>(long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+</td>
+</tr>
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinOrAfterTimeRange-long-">withinOrAfterTimeRange</a></span>(long&nbsp;timestamp)</code>
 <div class="block">Check if the specified timestamp is within or after this TimeRange.</div>
 </td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-byte:A-int-">withinTimeRange</a></span>(byte[]&nbsp;bytes,
                int&nbsp;offset)</code>
@@ -273,7 +293,7 @@
 </div>
 </td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-long-">withinTimeRange</a></span>(long&nbsp;timestamp)</code>
 <div class="block">Check if the specified timestamp is within this TimeRange.</div>
@@ -307,7 +327,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>INITIAL_MIN_TIMESTAMP</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.38">INITIAL_MIN_TIMESTAMP</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.39">INITIAL_MIN_TIMESTAMP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.io.TimeRange.INITIAL_MIN_TIMESTAMP">Constant Field Values</a></dd>
@@ -320,7 +340,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>INITIAL_MAX_TIMESTAMP</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.39">INITIAL_MAX_TIMESTAMP</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.40">INITIAL_MAX_TIMESTAMP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.io.TimeRange.INITIAL_MAX_TIMESTAMP">Constant Field Values</a></dd>
@@ -343,7 +363,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.66">TimeRange</a>()</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.95">TimeRange</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
 <div class="block">Default constructor.
@@ -358,7 +378,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.78">TimeRange</a>(long&nbsp;minStamp)</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.107">TimeRange</a>(long&nbsp;minStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
 <div class="block">Represents interval [minStamp, Long.MAX_VALUE)</div>
@@ -376,7 +396,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.90">TimeRange</a>(byte[]&nbsp;minStamp)</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.119">TimeRange</a>(byte[]&nbsp;minStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
 <div class="block">Represents interval [minStamp, Long.MAX_VALUE)</div>
@@ -394,7 +414,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.103">TimeRange</a>(byte[]&nbsp;minStamp,
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.132">TimeRange</a>(byte[]&nbsp;minStamp,
                                                          byte[]&nbsp;maxStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
@@ -414,7 +434,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.117">TimeRange</a>(long&nbsp;minStamp,
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.146">TimeRange</a>(long&nbsp;minStamp,
                                                          long&nbsp;maxStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
@@ -442,7 +462,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>allTime</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.43">allTime</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.44">allTime</a>()</pre>
 </li>
 </ul>
 <a name="at-long-">
@@ -451,7 +471,51 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>at</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.47">at</a>(long&nbsp;ts)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.48">at</a>(long&nbsp;ts)</pre>
+</li>
+</ul>
+<a name="from-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>from</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.59">from</a>(long&nbsp;minStamp)</pre>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>minStamp</code> - the minimum timestamp value, inclusive</dd>
+</dl>
+</li>
+</ul>
+<a name="until-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>until</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.68">until</a>(long&nbsp;maxStamp)</pre>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>maxStamp</code> - the minimum timestamp value, exclusive</dd>
+</dl>
+</li>
+</ul>
+<a name="between-long-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>between</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.78">between</a>(long&nbsp;minStamp,
+                                long&nbsp;maxStamp)</pre>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>minStamp</code> - the minimum timestamp, inclusive</dd>
+<dd><code>maxStamp</code> - the maximum timestamp, exclusive</dd>
+</dl>
 </li>
 </ul>
 <a name="getMin--">
@@ -460,7 +524,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMin</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.141">getMin</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.170">getMin</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the smallest timestamp that should be considered</dd>
@@ -473,7 +537,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMax</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.148">getMax</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.177">getMax</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the biggest timestamp that should be considered</dd>
@@ -486,7 +550,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>isAllTime</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.156">isAllTime</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.185">isAllTime</a>()</pre>
 <div class="block">Check if it is for all time</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -501,7 +565,7 @@
 <li class="blockList">
 <h4>withinTimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.171">withinTimeRange</a>(byte[]&nbsp;bytes,
+public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.200">withinTimeRange</a>(byte[]&nbsp;bytes,
                                            int&nbsp;offset)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
    changed to private or removed in 3.0. Use <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-long-"><code>withinTimeRange(long)</code></a> instead</span></div>
@@ -523,7 +587,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withinTimeRange</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.186">withinTimeRange</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.215">withinTimeRange</a>(long&nbsp;timestamp)</pre>
 <div class="block">Check if the specified timestamp is within this TimeRange.
  <p>
  Returns true if within interval [minStamp, maxStamp), false
@@ -542,7 +606,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>includesTimeRange</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.202">includesTimeRange</a>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.231">includesTimeRange</a>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)</pre>
 <div class="block">Check if the range has any overlap with TimeRange</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -558,7 +622,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withinOrAfterTimeRange</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.217">withinOrAfterTimeRange</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.246">withinOrAfterTimeRange</a>(long&nbsp;timestamp)</pre>
 <div class="block">Check if the specified timestamp is within or after this TimeRange.
  <p>
  Returns true if greater than minStamp, false if not.</div>
@@ -576,7 +640,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>compare</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.232">compare</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.261">compare</a>(long&nbsp;timestamp)</pre>
 <div class="block">Compare the timestamp to timerange.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -592,7 +656,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.244">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.273">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/apidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html b/apidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html
index 858eb60..296c7c0 100644
--- a/apidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html
+++ b/apidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html
@@ -178,6 +178,25 @@
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#at-long-">at</a></span>(long&nbsp;ts)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#between-long-long-">between</a></span>(long&nbsp;minStamp,
+       long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#from-long-">from</a></span>(long&nbsp;minStamp)</code>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#until-long-">until</a></span>(long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+</td>
+</tr>
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html b/apidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html
index 1281c8a..004fb01 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html
@@ -34,230 +34,259 @@
 <span class="sourceLineNo">026</span> * {@link #INITIAL_MIN_TIMESTAMP} and {@link #INITIAL_MAX_TIMESTAMP} only. Gets freaked out if<a name="line.26"></a>
 <span class="sourceLineNo">027</span> * passed a timestamp that is &lt; {@link #INITIAL_MIN_TIMESTAMP},<a name="line.27"></a>
 <span class="sourceLineNo">028</span> * &lt;p&gt;<a name="line.28"></a>
-<span class="sourceLineNo">029</span> * Evaluated according to minStamp &amp;lt;= timestamp &amp;lt; maxStamp<a name="line.29"></a>
-<span class="sourceLineNo">030</span> * or [minStamp,maxStamp) in interval notation.<a name="line.30"></a>
+<span class="sourceLineNo">029</span> * Evaluated according to minStamp &amp;lt;= timestamp &amp;lt; maxStamp or [minStamp,maxStamp) in interval<a name="line.29"></a>
+<span class="sourceLineNo">030</span> * notation.<a name="line.30"></a>
 <span class="sourceLineNo">031</span> * &lt;p&gt;<a name="line.31"></a>
-<span class="sourceLineNo">032</span> * Can be returned and read by clients.  Should not be directly created by clients.<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * Thus, all constructors are purposely @InterfaceAudience.Private.<a name="line.33"></a>
-<span class="sourceLineNo">034</span> *&lt;p&gt;Immutable. Thread-safe.<a name="line.34"></a>
-<span class="sourceLineNo">035</span> */<a name="line.35"></a>
-<span class="sourceLineNo">036</span>@InterfaceAudience.Public<a name="line.36"></a>
-<span class="sourceLineNo">037</span>public class TimeRange {<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  public static final long INITIAL_MIN_TIMESTAMP = 0L;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public static final long INITIAL_MAX_TIMESTAMP = Long.MAX_VALUE;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private static final TimeRange ALL_TIME = new TimeRange(INITIAL_MIN_TIMESTAMP,<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    INITIAL_MAX_TIMESTAMP);<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>  public static TimeRange allTime() {<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    return ALL_TIME;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public static TimeRange at(long ts) {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    if (ts &lt; 0 || ts == Long.MAX_VALUE) {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      throw new IllegalArgumentException("invalid ts:" + ts);<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    return new TimeRange(ts, ts + 1);<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private final long minStamp;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private final long maxStamp;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private final boolean allTime;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  /**<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * Default constructor.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * Represents interval [0, Long.MAX_VALUE) (allTime)<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * changed to private or removed in 3.0.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   */<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  @Deprecated<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  @InterfaceAudience.Private<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public TimeRange() {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    this(INITIAL_MIN_TIMESTAMP, INITIAL_MAX_TIMESTAMP);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  }<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * changed to private or removed in 3.0.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @Deprecated<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  @InterfaceAudience.Private<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  public TimeRange(long minStamp) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    this(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * changed to private or removed in 3.0.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @Deprecated<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  @InterfaceAudience.Private<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public TimeRange(byte [] minStamp) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this(Bytes.toLong(minStamp));<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * Represents interval [minStamp, maxStamp)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * changed to private or removed in 3.0.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  @Deprecated<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @InterfaceAudience.Private<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public TimeRange(byte [] minStamp, byte [] maxStamp) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this(Bytes.toLong(minStamp), Bytes.toLong(maxStamp));<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  /**<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * Represents interval [minStamp, maxStamp)<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * @throws IllegalArgumentException if either &lt;0,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * changed to private or removed in 3.0.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  @Deprecated<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  @InterfaceAudience.Private<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  public TimeRange(long minStamp, long maxStamp) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    check(minStamp, maxStamp);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    this.minStamp = minStamp;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this.maxStamp = maxStamp;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    this.allTime = isAllTime(minStamp, maxStamp);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private static boolean isAllTime(long minStamp, long maxStamp) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return minStamp == INITIAL_MIN_TIMESTAMP &amp;&amp; maxStamp == INITIAL_MAX_TIMESTAMP;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  private static void check(long minStamp, long maxStamp) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    if (minStamp &lt; 0 || maxStamp &lt; 0) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      throw new IllegalArgumentException("Timestamp cannot be negative. minStamp:" + minStamp<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        + ", maxStamp:" + maxStamp);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if (maxStamp &lt; minStamp) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      throw new IllegalArgumentException("maxStamp is smaller than minStamp");<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @return the smallest timestamp that should be considered<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public long getMin() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return minStamp;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /**<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @return the biggest timestamp that should be considered<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public long getMax() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return maxStamp;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Check if it is for all time<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @return true if it is for all time<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public boolean isAllTime() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return allTime;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * &lt;p&gt;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Returns true if within interval [minStamp, maxStamp), false if not.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * @param bytes timestamp to check<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * @param offset offset into the bytes<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @return true if within TimeRange, false if not<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *   changed to private or removed in 3.0. Use {@link #withinTimeRange(long)} instead<a name="line.168"></a>
+<span class="sourceLineNo">032</span> * Can be returned and read by clients. Should not be directly created by clients. Thus, all<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * constructors are purposely @InterfaceAudience.Private.<a name="line.33"></a>
+<span class="sourceLineNo">034</span> * &lt;p&gt;<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * Immutable. Thread-safe.<a name="line.35"></a>
+<span class="sourceLineNo">036</span> */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>@InterfaceAudience.Public<a name="line.37"></a>
+<span class="sourceLineNo">038</span>public class TimeRange {<a name="line.38"></a>
+<span class="sourceLineNo">039</span>  public static final long INITIAL_MIN_TIMESTAMP = 0L;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final long INITIAL_MAX_TIMESTAMP = Long.MAX_VALUE;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static final TimeRange ALL_TIME = new TimeRange(INITIAL_MIN_TIMESTAMP,<a name="line.41"></a>
+<span class="sourceLineNo">042</span>    INITIAL_MAX_TIMESTAMP);<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>  public static TimeRange allTime() {<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    return ALL_TIME;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  public static TimeRange at(long ts) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>    if (ts &lt; 0 || ts == Long.MAX_VALUE) {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      throw new IllegalArgumentException("invalid ts:" + ts);<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    }<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    return new TimeRange(ts, ts + 1);<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   * Represents the time interval [minStamp, Long.MAX_VALUE)<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   */<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static TimeRange from(long minStamp) {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    check(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    return new TimeRange(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Represents the time interval [0, maxStamp)<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param maxStamp the minimum timestamp value, exclusive<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  public static TimeRange until(long maxStamp) {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    check(INITIAL_MIN_TIMESTAMP, maxStamp);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    return new TimeRange(INITIAL_MIN_TIMESTAMP, maxStamp);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  /**<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * Represents the time interval [minStamp, maxStamp)<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public static TimeRange between(long minStamp, long maxStamp) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    check(minStamp, maxStamp);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    return new TimeRange(minStamp, maxStamp);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private final long minStamp;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private final long maxStamp;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final boolean allTime;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  /**<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * Default constructor.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * Represents interval [0, Long.MAX_VALUE) (allTime)<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * changed to private or removed in 3.0.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Deprecated<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @InterfaceAudience.Private<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  public TimeRange() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    this(INITIAL_MIN_TIMESTAMP, INITIAL_MAX_TIMESTAMP);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * changed to private or removed in 3.0.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @Deprecated<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  @InterfaceAudience.Private<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public TimeRange(long minStamp) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  /**<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * changed to private or removed in 3.0.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  @Deprecated<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @InterfaceAudience.Private<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  public TimeRange(byte [] minStamp) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    this(Bytes.toLong(minStamp));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * Represents interval [minStamp, maxStamp)<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * changed to private or removed in 3.0.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @Deprecated<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @InterfaceAudience.Private<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public TimeRange(byte [] minStamp, byte [] maxStamp) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    this(Bytes.toLong(minStamp), Bytes.toLong(maxStamp));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Represents interval [minStamp, maxStamp)<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @throws IllegalArgumentException if either &lt;0,<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * changed to private or removed in 3.0.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   */<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  @Deprecated<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @InterfaceAudience.Private<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public TimeRange(long minStamp, long maxStamp) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    check(minStamp, maxStamp);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.minStamp = minStamp;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    this.maxStamp = maxStamp;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    this.allTime = isAllTime(minStamp, maxStamp);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static boolean isAllTime(long minStamp, long maxStamp) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return minStamp == INITIAL_MIN_TIMESTAMP &amp;&amp; maxStamp == INITIAL_MAX_TIMESTAMP;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static void check(long minStamp, long maxStamp) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    if (minStamp &lt; 0 || maxStamp &lt; 0) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      throw new IllegalArgumentException("Timestamp cannot be negative. minStamp:" + minStamp<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        + ", maxStamp:" + maxStamp);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    if (maxStamp &lt; minStamp) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      throw new IllegalArgumentException("maxStamp is smaller than minStamp");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return the smallest timestamp that should be considered<a name="line.168"></a>
 <span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  @Deprecated<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  public boolean withinTimeRange(byte [] bytes, int offset) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    if (allTime) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return true;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    return withinTimeRange(Bytes.toLong(bytes, offset));<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * &lt;p&gt;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * Returns true if within interval [minStamp, maxStamp), false<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * if not.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * @param timestamp timestamp to check<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @return true if within TimeRange, false if not<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  public boolean withinTimeRange(long timestamp) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    assert timestamp &gt;= 0;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    if (this.allTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      return true;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    // check if &gt;= minStamp<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    return (minStamp &lt;= timestamp &amp;&amp; timestamp &lt; maxStamp);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Check if the range has any overlap with TimeRange<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @param tr TimeRange<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @return True if there is overlap, false otherwise<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  // This method came from TimeRangeTracker. We used to go there for this function but better<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  // to come here to the immutable, unsynchronized datastructure at read time.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public boolean includesTimeRange(final TimeRange tr) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (this.allTime) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    assert tr.getMin() &gt;= 0;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    return getMin() &lt; tr.getMax() &amp;&amp; getMax() &gt;= tr.getMin();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * Check if the specified timestamp is within or after this TimeRange.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * &lt;p&gt;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * Returns true if greater than minStamp, false if not.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * @param timestamp timestamp to check<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @return true if within or after TimeRange, false if not<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  public boolean withinOrAfterTimeRange(long timestamp) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    assert timestamp &gt;= 0;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    if (allTime) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      return true;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // check if &gt;= minStamp<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    return timestamp &gt;= minStamp;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * Compare the timestamp to timerange.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @return -1 if timestamp is less than timerange,<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * 0 if timestamp is within timerange,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * 1 if timestamp is greater than timerange<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  public int compare(long timestamp) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    assert timestamp &gt;= 0;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.allTime) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      return 0;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    if (timestamp &lt; minStamp) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      return -1;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    return timestamp &gt;= maxStamp? 1: 0;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  @Override<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  public String toString() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    StringBuilder sb = new StringBuilder();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    sb.append("maxStamp=");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    sb.append(this.maxStamp);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    sb.append(", minStamp=");<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    sb.append(this.minStamp);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    return sb.toString();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
-<span class="sourceLineNo">252</span>}<a name="line.252"></a>
+<span class="sourceLineNo">170</span>  public long getMin() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return minStamp;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  /**<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * @return the biggest timestamp that should be considered<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public long getMax() {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    return maxStamp;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * Check if it is for all time<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @return true if it is for all time<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public boolean isAllTime() {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    return allTime;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * &lt;p&gt;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * Returns true if within interval [minStamp, maxStamp), false if not.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @param bytes timestamp to check<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param offset offset into the bytes<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @return true if within TimeRange, false if not<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   *   changed to private or removed in 3.0. Use {@link #withinTimeRange(long)} instead<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  @Deprecated<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  public boolean withinTimeRange(byte [] bytes, int offset) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (allTime) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      return true;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    return withinTimeRange(Bytes.toLong(bytes, offset));<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * &lt;p&gt;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * Returns true if within interval [minStamp, maxStamp), false<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * if not.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param timestamp timestamp to check<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @return true if within TimeRange, false if not<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public boolean withinTimeRange(long timestamp) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    assert timestamp &gt;= 0;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    if (this.allTime) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // check if &gt;= minStamp<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    return (minStamp &lt;= timestamp &amp;&amp; timestamp &lt; maxStamp);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * Check if the range has any overlap with TimeRange<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * @param tr TimeRange<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @return True if there is overlap, false otherwise<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  // This method came from TimeRangeTracker. We used to go there for this function but better<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  // to come here to the immutable, unsynchronized datastructure at read time.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  public boolean includesTimeRange(final TimeRange tr) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    if (this.allTime) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    assert tr.getMin() &gt;= 0;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return getMin() &lt; tr.getMax() &amp;&amp; getMax() &gt;= tr.getMin();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * Check if the specified timestamp is within or after this TimeRange.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * &lt;p&gt;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Returns true if greater than minStamp, false if not.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param timestamp timestamp to check<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * @return true if within or after TimeRange, false if not<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public boolean withinOrAfterTimeRange(long timestamp) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    assert timestamp &gt;= 0;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (allTime) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return true;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // check if &gt;= minStamp<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    return timestamp &gt;= minStamp;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * Compare the timestamp to timerange.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @return -1 if timestamp is less than timerange,<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * 0 if timestamp is within timerange,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * 1 if timestamp is greater than timerange<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public int compare(long timestamp) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assert timestamp &gt;= 0;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (this.allTime) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return 0;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    if (timestamp &lt; minStamp) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      return -1;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return timestamp &gt;= maxStamp? 1: 0;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  @Override<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public String toString() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    StringBuilder sb = new StringBuilder();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    sb.append("maxStamp=");<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    sb.append(this.maxStamp);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    sb.append(", minStamp=");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    sb.append(this.minStamp);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return sb.toString();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>}<a name="line.281"></a>
 
 
 
diff --git a/book.html b/book.html
index e676f4f..f7c940f 100644
--- a/book.html
+++ b/book.html
@@ -15426,7 +15426,7 @@
 </li>
 <li>
 <p>Mapping a table: In a typical MapReduce job that takes a table in input, every row will be read only once so there&#8217;s no need to put them into the block cache.
-The Scan object has the option of turning this off via the setCaching method (set it to false). You can still keep block caching turned on on this table if you need fast random read access.
+The Scan object has the option of turning this off via the setCacheBlocks method (set it to false). You can still keep block caching turned on on this table if you need fast random read access.
 An example would be counting the number of rows in a table that serves live traffic, caching every block of that table would create massive churn and would surely evict data that&#8217;s currently in use.</p>
 </li>
 </ul>
@@ -42874,7 +42874,7 @@
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2019-08-16 14:29:51 UTC
+Last updated 2019-08-17 14:29:56 UTC
 </div>
 </div>
 </body>
diff --git a/bulk-loads.html b/bulk-loads.html
index f5ba704..3afef99 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -155,7 +155,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 9631a9a..b2eb0f7 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -21474,25 +21474,25 @@
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>5147</td></tr>
+<td>5183</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>5161</td></tr>
+<td>5197</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>blocks</td>
 <td>EmptyBlock</td>
 <td>Must have at least one statement.</td>
-<td>5226</td></tr>
+<td>5262</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>coding</td>
 <td>InnerAssignment</td>
 <td>Inner assignments should be avoided.</td>
-<td>5458</td></tr></table></div>
+<td>5494</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.client.TestFromClientSide3.java">org/apache/hadoop/hbase/client/TestFromClientSide3.java</h3>
 <table border="0" class="table table-striped">
@@ -33744,43 +33744,43 @@
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>62</td></tr>
+<td>91</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>74</td></tr>
+<td>103</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>86</td></tr>
+<td>115</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>99</td></tr>
+<td>128</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>113</td></tr>
+<td>142</td></tr>
 <tr class="b">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>229</td></tr>
+<td>258</td></tr>
 <tr class="a">
 <td><img src="images/icon_error_sml.gif" alt="" />&#160;Error</td>
 <td>javadoc</td>
 <td>JavadocTagContinuationIndentation</td>
 <td>Line continuation have incorrect indentation level, expected level should be 2.</td>
-<td>230</td></tr></table></div>
+<td>259</td></tr></table></div>
 <div class="section">
 <h3 id="org.apache.hadoop.hbase.io.WALLink.java">org/apache/hadoop/hbase/io/WALLink.java</h3>
 <table border="0" class="table table-striped">
@@ -93141,7 +93141,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/coc.html b/coc.html
index 4a29a8f..8130490 100644
--- a/coc.html
+++ b/coc.html
@@ -224,7 +224,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependencies.html b/dependencies.html
index 150f347..e9e4012 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -296,7 +296,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-convergence.html b/dependency-convergence.html
index d4b45dc..1daa5b6 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -679,7 +679,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-info.html b/dependency-info.html
index 26067d7..7c5c715 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -177,7 +177,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/dependency-management.html b/dependency-management.html
index ff0b604..070e13e 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -893,7 +893,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index a13b247..32422b2 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -4039,14 +4039,14 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Fri Aug 16 14:35:41 UTC 2019"</code></td>
+<td class="colLast"><code>"Sat Aug 17 14:34:51 UTC 2019"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"3eb602c7f7081cd1a55deb40797f95adbc9e7758"</code></td>
+<td class="colLast"><code>"7903f55c18d561d7451e91b8a014936a3116f142"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">
diff --git a/devapidocs/index-all.html b/devapidocs/index-all.html
index 5422644..f6de7b2 100644
--- a/devapidocs/index-all.html
+++ b/devapidocs/index-all.html
@@ -6004,6 +6004,10 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html#bestSplitRow">bestSplitRow</a></span> - Variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.html" title="class in org.apache.hadoop.hbase.master.assignment">SplitTableRegionProcedure</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TimeRange.html#between-long-long-">between(long, long)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></dt>
+<dd>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/util/LRUDictionary.BidirectionalLRUMap.html#BidirectionalLRUMap-int-">BidirectionalLRUMap(int)</a></span> - Constructor for class org.apache.hadoop.hbase.io.util.<a href="org/apache/hadoop/hbase/io/util/LRUDictionary.BidirectionalLRUMap.html" title="class in org.apache.hadoop.hbase.io.util">LRUDictionary.BidirectionalLRUMap</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/BigDecimalComparator.html#bigDecimal">bigDecimal</a></span> - Variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/BigDecimalComparator.html" title="class in org.apache.hadoop.hbase.filter">BigDecimalComparator</a></dt>
@@ -33248,6 +33252,10 @@
 <dd>
 <div class="block">If set has been called, it will create a mutableConf.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TimeRange.html#from-long-">from(long)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></dt>
+<dd>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/ByteRangeUtils.html#fromArrays-java.util.Collection-">fromArrays(Collection&lt;byte[]&gt;)</a></span> - Static method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/ByteRangeUtils.html" title="class in org.apache.hadoop.hbase.util">ByteRangeUtils</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/IsolationLevel.html#fromByte-byte-">fromByte(byte)</a></span> - Static method in enum org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client">IsolationLevel</a></dt>
@@ -118627,6 +118635,10 @@
 <dd>
 <div class="block">Remove the throttling for the specified user on the specified namespace.</div>
 </dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/TimeRange.html#until-long-">until(long)</a></span> - Static method in class org.apache.hadoop.hbase.io.<a href="org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></dt>
+<dd>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.SaslNegotiateHandler.html#unwrap-org.apache.hadoop.crypto.CipherOption-javax.security.sasl.SaslClient-">unwrap(CipherOption, SaslClient)</a></span> - Method in class org.apache.hadoop.hbase.io.asyncfs.<a href="org/apache/hadoop/hbase/io/asyncfs/FanOutOneBlockAsyncDFSOutputSaslHelper.SaslNegotiateHandler.html" title="class in org.apache.hadoop.hbase.io.asyncfs">FanOutOneBlockAsyncDFSOutputSaslHelper.SaslNegotiateHandler</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.html#unwrap-byte:A-int-int-">unwrap(byte[], int, int)</a></span> - Method in class org.apache.hadoop.hbase.io.crypto.aes.<a href="org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.html" title="class in org.apache.hadoop.hbase.io.crypto.aes">CryptoAES</a></dt>
diff --git a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
index 841e34a..6b6a01e 100644
--- a/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/backup/package-tree.html
@@ -167,10 +167,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupPhase.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupPhase</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupRestoreConstants.BackupCommand.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupRestoreConstants.BackupCommand</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupType.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.backup.<a href="../../../../../org/apache/hadoop/hbase/backup/BackupInfo.BackupState.html" title="enum in org.apache.hadoop.hbase.backup"><span class="typeNameLink">BackupInfo.BackupState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
index d223687..45a7e3e 100644
--- a/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/client/package-tree.html
@@ -424,21 +424,21 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RequestController.ReturnCode.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RequestController.ReturnCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/RegionLocateType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">RegionLocateType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Durability.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Durability</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Scan.ReadType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Scan.ReadType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanControllerState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/IsolationLevel.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">IsolationLevel</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MasterSwitchType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MasterSwitchType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/SnapshotType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">SnapshotType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/Consistency.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">Consistency</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AbstractResponse.ResponseType.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AbstractResponse.ResponseType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/CompactionState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">CompactionState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">AsyncScanSingleRegionRpcRetryingCaller.ScanResumerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/MobCompactPartitionPolicy.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">MobCompactPartitionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.client.<a href="../../../../../org/apache/hadoop/hbase/client/TableState.State.html" title="enum in org.apache.hadoop.hbase.client"><span class="typeNameLink">TableState.State</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
index 127caa7..531254c 100644
--- a/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/executor/package-tree.html
@@ -104,8 +104,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/ExecutorType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">ExecutorType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.executor.<a href="../../../../../org/apache/hadoop/hbase/executor/EventType.html" title="enum in org.apache.hadoop.hbase.executor"><span class="typeNameLink">EventType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
index ecffd57..0e03311 100644
--- a/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/filter/package-tree.html
@@ -189,13 +189,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/BitComparator.BitwiseOp.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">BitComparator.BitwiseOp</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.Order.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/Filter.ReturnCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">Filter.ReturnCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/RegexStringComparator.EngineType.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">RegexStringComparator.EngineType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterWrapper.FilterRowRetCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterWrapper.FilterRowRetCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FilterList.Operator.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FilterList.Operator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.filter.<a href="../../../../../org/apache/hadoop/hbase/filter/FuzzyRowFilter.SatisfiesCode.html" title="enum in org.apache.hadoop.hbase.filter"><span class="typeNameLink">FuzzyRowFilter.SatisfiesCode</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
index 8078bf2..483ea4b 100644
--- a/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/http/package-tree.html
@@ -138,9 +138,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Event.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Event</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/HttpConfig.Policy.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">HttpConfig.Policy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.http.<a href="../../../../../org/apache/hadoop/hbase/http/ProfileServlet.Output.html" title="enum in org.apache.hadoop.hbase.http"><span class="typeNameLink">ProfileServlet.Output</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/TimeRange.html b/devapidocs/org/apache/hadoop/hbase/io/TimeRange.html
index 813932f..72a21ca 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/TimeRange.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/TimeRange.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":9,"i1":9,"i2":9,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":9,"i9":10,"i10":10,"i11":42,"i12":10};
+var methods = {"i0":9,"i1":9,"i2":9,"i3":9,"i4":10,"i5":9,"i6":10,"i7":10,"i8":10,"i9":10,"i10":9,"i11":10,"i12":9,"i13":10,"i14":42,"i15":10};
 var tabs = {65535:["t0","All Methods"],1:["t1","Static Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"],32:["t6","Deprecated Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -110,18 +110,19 @@
 <hr>
 <br>
 <pre>@InterfaceAudience.Public
-public class <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.37">TimeRange</a>
+public class <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.38">TimeRange</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Represents an interval of version timestamps. Presumes timestamps between
  <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#INITIAL_MIN_TIMESTAMP"><code>INITIAL_MIN_TIMESTAMP</code></a> and <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#INITIAL_MAX_TIMESTAMP"><code>INITIAL_MAX_TIMESTAMP</code></a> only. Gets freaked out if
  passed a timestamp that is < <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#INITIAL_MIN_TIMESTAMP"><code>INITIAL_MIN_TIMESTAMP</code></a>,
  <p>
- Evaluated according to minStamp &lt;= timestamp &lt; maxStamp
- or [minStamp,maxStamp) in interval notation.
+ Evaluated according to minStamp &lt;= timestamp &lt; maxStamp or [minStamp,maxStamp) in interval
+ notation.
  <p>
- Can be returned and read by clients.  Should not be directly created by clients.
- Thus, all constructors are purposely @InterfaceAudience.Private.
-<p>Immutable. Thread-safe.</div>
+ Can be returned and read by clients. Should not be directly created by clients. Thus, all
+ constructors are purposely @InterfaceAudience.Private.
+ <p>
+ Immutable. Thread-safe.</div>
 </li>
 </ul>
 </div>
@@ -244,52 +245,71 @@
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#at-long-">at</a></span>(long&nbsp;ts)</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#between-long-long-">between</a></span>(long&nbsp;minStamp,
+       long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+</td>
+</tr>
+<tr id="i3" class="rowColor">
 <td class="colFirst"><code>private static void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#check-long-long-">check</a></span>(long&nbsp;minStamp,
      long&nbsp;maxStamp)</code>&nbsp;</td>
 </tr>
-<tr id="i3" class="rowColor">
+<tr id="i4" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#compare-long-">compare</a></span>(long&nbsp;timestamp)</code>
 <div class="block">Compare the timestamp to timerange.</div>
 </td>
 </tr>
-<tr id="i4" class="altColor">
+<tr id="i5" class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#from-long-">from</a></span>(long&nbsp;minStamp)</code>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+</td>
+</tr>
+<tr id="i6" class="altColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#getMax--">getMax</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i5" class="rowColor">
+<tr id="i7" class="rowColor">
 <td class="colFirst"><code>long</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#getMin--">getMin</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i6" class="altColor">
+<tr id="i8" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#includesTimeRange-org.apache.hadoop.hbase.io.TimeRange-">includesTimeRange</a></span>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)</code>
 <div class="block">Check if the range has any overlap with TimeRange</div>
 </td>
 </tr>
-<tr id="i7" class="rowColor">
+<tr id="i9" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#isAllTime--">isAllTime</a></span>()</code>
 <div class="block">Check if it is for all time</div>
 </td>
 </tr>
-<tr id="i8" class="altColor">
+<tr id="i10" class="altColor">
 <td class="colFirst"><code>private static boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#isAllTime-long-long-">isAllTime</a></span>(long&nbsp;minStamp,
          long&nbsp;maxStamp)</code>&nbsp;</td>
 </tr>
-<tr id="i9" class="rowColor">
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#toString--">toString</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i10" class="altColor">
+<tr id="i12" class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#until-long-">until</a></span>(long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+</td>
+</tr>
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinOrAfterTimeRange-long-">withinOrAfterTimeRange</a></span>(long&nbsp;timestamp)</code>
 <div class="block">Check if the specified timestamp is within or after this TimeRange.</div>
 </td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-byte:A-int-">withinTimeRange</a></span>(byte[]&nbsp;bytes,
                int&nbsp;offset)</code>
@@ -299,7 +319,7 @@
 </div>
 </td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-long-">withinTimeRange</a></span>(long&nbsp;timestamp)</code>
 <div class="block">Check if the specified timestamp is within this TimeRange.</div>
@@ -333,7 +353,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>INITIAL_MIN_TIMESTAMP</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.38">INITIAL_MIN_TIMESTAMP</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.39">INITIAL_MIN_TIMESTAMP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.io.TimeRange.INITIAL_MIN_TIMESTAMP">Constant Field Values</a></dd>
@@ -346,7 +366,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>INITIAL_MAX_TIMESTAMP</h4>
-<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.39">INITIAL_MAX_TIMESTAMP</a></pre>
+<pre>public static final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.40">INITIAL_MAX_TIMESTAMP</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.io.TimeRange.INITIAL_MAX_TIMESTAMP">Constant Field Values</a></dd>
@@ -359,7 +379,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>ALL_TIME</h4>
-<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.40">ALL_TIME</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.41">ALL_TIME</a></pre>
 </li>
 </ul>
 <a name="minStamp">
@@ -368,7 +388,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>minStamp</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.54">minStamp</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.83">minStamp</a></pre>
 </li>
 </ul>
 <a name="maxStamp">
@@ -377,7 +397,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>maxStamp</h4>
-<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.55">maxStamp</a></pre>
+<pre>private final&nbsp;long <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.84">maxStamp</a></pre>
 </li>
 </ul>
 <a name="allTime">
@@ -386,7 +406,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>allTime</h4>
-<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.56">allTime</a></pre>
+<pre>private final&nbsp;boolean <a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.85">allTime</a></pre>
 </li>
 </ul>
 </li>
@@ -405,7 +425,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.66">TimeRange</a>()</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.95">TimeRange</a>()</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
 <div class="block">Default constructor.
@@ -420,7 +440,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.78">TimeRange</a>(long&nbsp;minStamp)</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.107">TimeRange</a>(long&nbsp;minStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
 <div class="block">Represents interval [minStamp, Long.MAX_VALUE)</div>
@@ -438,7 +458,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.90">TimeRange</a>(byte[]&nbsp;minStamp)</pre>
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.119">TimeRange</a>(byte[]&nbsp;minStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
 <div class="block">Represents interval [minStamp, Long.MAX_VALUE)</div>
@@ -456,7 +476,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.103">TimeRange</a>(byte[]&nbsp;minStamp,
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.132">TimeRange</a>(byte[]&nbsp;minStamp,
                                                          byte[]&nbsp;maxStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
@@ -476,7 +496,7 @@
 <h4>TimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
  @InterfaceAudience.Private
-public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.117">TimeRange</a>(long&nbsp;minStamp,
+public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.146">TimeRange</a>(long&nbsp;minStamp,
                                                          long&nbsp;maxStamp)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
  changed to private or removed in 3.0.</span></div>
@@ -504,7 +524,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>allTime</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.43">allTime</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.44">allTime</a>()</pre>
 </li>
 </ul>
 <a name="at-long-">
@@ -513,7 +533,51 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>at</h4>
-<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.47">at</a>(long&nbsp;ts)</pre>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.48">at</a>(long&nbsp;ts)</pre>
+</li>
+</ul>
+<a name="from-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>from</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.59">from</a>(long&nbsp;minStamp)</pre>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>minStamp</code> - the minimum timestamp value, inclusive</dd>
+</dl>
+</li>
+</ul>
+<a name="until-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>until</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.68">until</a>(long&nbsp;maxStamp)</pre>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>maxStamp</code> - the minimum timestamp value, exclusive</dd>
+</dl>
+</li>
+</ul>
+<a name="between-long-long-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>between</h4>
+<pre>public static&nbsp;<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.78">between</a>(long&nbsp;minStamp,
+                                long&nbsp;maxStamp)</pre>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+<dl>
+<dt><span class="paramLabel">Parameters:</span></dt>
+<dd><code>minStamp</code> - the minimum timestamp, inclusive</dd>
+<dd><code>maxStamp</code> - the maximum timestamp, exclusive</dd>
+</dl>
 </li>
 </ul>
 <a name="isAllTime-long-long-">
@@ -522,7 +586,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>isAllTime</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.124">isAllTime</a>(long&nbsp;minStamp,
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.153">isAllTime</a>(long&nbsp;minStamp,
                                  long&nbsp;maxStamp)</pre>
 </li>
 </ul>
@@ -532,7 +596,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>check</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.128">check</a>(long&nbsp;minStamp,
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.157">check</a>(long&nbsp;minStamp,
                           long&nbsp;maxStamp)</pre>
 </li>
 </ul>
@@ -542,7 +606,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMin</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.141">getMin</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.170">getMin</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the smallest timestamp that should be considered</dd>
@@ -555,7 +619,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getMax</h4>
-<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.148">getMax</a>()</pre>
+<pre>public&nbsp;long&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.177">getMax</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>the biggest timestamp that should be considered</dd>
@@ -568,7 +632,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>isAllTime</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.156">isAllTime</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.185">isAllTime</a>()</pre>
 <div class="block">Check if it is for all time</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -583,7 +647,7 @@
 <li class="blockList">
 <h4>withinTimeRange</h4>
 <pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Deprecated.html?is-external=true" title="class or interface in java.lang">@Deprecated</a>
-public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.171">withinTimeRange</a>(byte[]&nbsp;bytes,
+public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.200">withinTimeRange</a>(byte[]&nbsp;bytes,
                                            int&nbsp;offset)</pre>
 <div class="block"><span class="deprecatedLabel">Deprecated.</span>&nbsp;<span class="deprecationComment">This is made @InterfaceAudience.Private in the 2.0 line and above and may be
    changed to private or removed in 3.0. Use <a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html#withinTimeRange-long-"><code>withinTimeRange(long)</code></a> instead</span></div>
@@ -605,7 +669,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withinTimeRange</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.186">withinTimeRange</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.215">withinTimeRange</a>(long&nbsp;timestamp)</pre>
 <div class="block">Check if the specified timestamp is within this TimeRange.
  <p>
  Returns true if within interval [minStamp, maxStamp), false
@@ -624,7 +688,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>includesTimeRange</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.202">includesTimeRange</a>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.231">includesTimeRange</a>(<a href="../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a>&nbsp;tr)</pre>
 <div class="block">Check if the range has any overlap with TimeRange</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -640,7 +704,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>withinOrAfterTimeRange</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.217">withinOrAfterTimeRange</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.246">withinOrAfterTimeRange</a>(long&nbsp;timestamp)</pre>
 <div class="block">Check if the specified timestamp is within or after this TimeRange.
  <p>
  Returns true if greater than minStamp, false if not.</div>
@@ -658,7 +722,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>compare</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.232">compare</a>(long&nbsp;timestamp)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.261">compare</a>(long&nbsp;timestamp)</pre>
 <div class="block">Compare the timestamp to timerange.</div>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
@@ -674,7 +738,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.244">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/io/TimeRange.html#line.273">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
diff --git a/devapidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html b/devapidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html
index 92bb29a..de50614 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/class-use/TimeRange.html
@@ -261,6 +261,25 @@
 <td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
 <td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#at-long-">at</a></span>(long&nbsp;ts)</code>&nbsp;</td>
 </tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#between-long-long-">between</a></span>(long&nbsp;minStamp,
+       long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [minStamp, maxStamp)</div>
+</td>
+</tr>
+<tr class="rowColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#from-long-">from</a></span>(long&nbsp;minStamp)</code>
+<div class="block">Represents the time interval [minStamp, Long.MAX_VALUE)</div>
+</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>static <a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html" title="class in org.apache.hadoop.hbase.io">TimeRange</a></code></td>
+<td class="colLast"><span class="typeNameLabel">TimeRange.</span><code><span class="memberNameLink"><a href="../../../../../../org/apache/hadoop/hbase/io/TimeRange.html#until-long-">until</a></span>(long&nbsp;maxStamp)</code>
+<div class="block">Represents the time interval [0, maxStamp)</div>
+</td>
+</tr>
 </tbody>
 </table>
 <table class="useSummary" border="0" cellpadding="3" cellspacing="0" summary="Use table, listing methods, and an explanation">
diff --git a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 201421d..5204b3e 100644
--- a/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -298,11 +298,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockType.BlockCategory.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockType.BlockCategory</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockCacheFactory.ExternalBlockCaches.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockCacheFactory.ExternalBlockCaches</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/HFileBlock.Writer.State.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">HFileBlock.Writer.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/BlockPriority.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">BlockPriority</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
index cb4ea86..53b29e4 100644
--- a/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/ipc/package-tree.html
@@ -353,9 +353,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceFactoryImpl.SourceStorage.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">MetricsHBaseServerSourceFactoryImpl.SourceStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/CallEvent.Type.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">CallEvent.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.ipc.<a href="../../../../../org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.BufferCallAction.html" title="enum in org.apache.hadoop.hbase.ipc"><span class="typeNameLink">BufferCallBeforeInitHandler.BufferCallAction</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
index a697a37..6a3002e 100644
--- a/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/mapreduce/package-tree.html
@@ -296,10 +296,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/TableSplit.Version.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">TableSplit.Version</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/SyncTable.SyncMapper.Counter.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">SyncTable.SyncMapper.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/CellCounter.CellCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">CellCounter.CellCounterMapper.Counters</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.mapreduce.<a href="../../../../../org/apache/hadoop/hbase/mapreduce/RowCounter.RowCounterMapper.Counters.html" title="enum in org.apache.hadoop.hbase.mapreduce"><span class="typeNameLink">RowCounter.RowCounterMapper.Counters</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
index b988a3c..b3e7c99 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/assignment/package-tree.html
@@ -151,8 +151,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/ServerState.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">ServerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.assignment.<a href="../../../../../../org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.TransitionType.html" title="enum in org.apache.hadoop.hbase.master.assignment"><span class="typeNameLink">TransitRegionStateProcedure.TransitionType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
index 445e765..33e023a 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/package-tree.html
@@ -359,12 +359,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/RegionState.State.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">RegionState.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MasterRpcServices.BalanceSwitchMode.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MasterRpcServices.BalanceSwitchMode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.TerminationStatus.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.TerminationStatus</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/MetricsMasterSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">MetricsMasterSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/SplitLogManager.ResubmitDirective.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">SplitLogManager.ResubmitDirective</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.<a href="../../../../../org/apache/hadoop/hbase/master/ServerManager.ServerLiveState.html" title="enum in org.apache.hadoop.hbase.master"><span class="typeNameLink">ServerManager.ServerLiveState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
index c5ce7d6..9402da3 100644
--- a/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/master/procedure/package-tree.html
@@ -216,10 +216,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/PeerProcedureInterface.PeerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">PeerProcedureInterface.PeerOperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/ServerProcedureInterface.ServerOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">ServerProcedureInterface.ServerOperationType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/MetaProcedureInterface.MetaOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">MetaProcedureInterface.MetaOperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.master.procedure.<a href="../../../../../../org/apache/hadoop/hbase/master/procedure/TableProcedureInterface.TableOperationType.html" title="enum in org.apache.hadoop.hbase.master.procedure"><span class="typeNameLink">TableProcedureInterface.TableOperationType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
index 452eaee..7524d90 100644
--- a/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/monitoring/package-tree.html
@@ -127,8 +127,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/MonitoredTask.State.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">MonitoredTask.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.monitoring.<a href="../../../../../org/apache/hadoop/hbase/monitoring/TaskMonitor.TaskFilter.TaskType.html" title="enum in org.apache.hadoop.hbase.monitoring"><span class="typeNameLink">TaskMonitor.TaskFilter.TaskType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/package-tree.html b/devapidocs/org/apache/hadoop/hbase/package-tree.html
index b3d1c22..2ec7c2f 100644
--- a/devapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -428,19 +428,19 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeepDeletedCells.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeepDeletedCells</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Coprocessor.State.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Coprocessor.State</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/KeyValue.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">KeyValue.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Cell.Type.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Cell.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MetaTableAccessor.QueryType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MetaTableAccessor.QueryType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CellBuilderType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CellBuilderType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/MemoryCompactionPolicy.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">MemoryCompactionPolicy</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompatibilitySingletonFactory.SingletonStorage.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompatibilitySingletonFactory.SingletonStorage</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/CompareOperator.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">CompareOperator</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterMetrics.Option.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterMetrics.Option</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/Size.Unit.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">Size.Unit</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HConstants.OperationStatusCode.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HConstants.OperationStatusCode</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HealthChecker.HealthCheckerExitStatus.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HealthChecker.HealthCheckerExitStatus</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
index 4ab7f28..ee84515 100644
--- a/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/procedure2/package-tree.html
@@ -216,11 +216,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/StateMachineProcedure.Flow.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">StateMachineProcedure.Flow</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/RootProcedureState.State.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">RootProcedureState.State</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/Procedure.LockState.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">Procedure.LockState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.procedure2.<a href="../../../../../org/apache/hadoop/hbase/procedure2/LockedResourceType.html" title="enum in org.apache.hadoop.hbase.procedure2"><span class="typeNameLink">LockedResourceType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
index 1f56261..88d5096 100644
--- a/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/quotas/package-tree.html
@@ -240,12 +240,12 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/SpaceViolationPolicy.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">SpaceViolationPolicy</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/RpcThrottlingException.Type.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">RpcThrottlingException.Type</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/ThrottleType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">ThrottleType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/OperationQuota.OperationType.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">OperationQuota.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.quotas.<a href="../../../../../org/apache/hadoop/hbase/quotas/QuotaScope.html" title="enum in org.apache.hadoop.hbase.quotas"><span class="typeNameLink">QuotaScope</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index c74a357..bb28ecc 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -715,20 +715,20 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScanType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScanType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/SplitLogWorker.TaskExecutor.Status.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">SplitLogWorker.TaskExecutor.Status</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MetricsRegionServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MetricsRegionServerSourceFactoryImpl.FactoryStorage</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/FlushType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">FlushType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TimeRangeTracker.Type.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TimeRangeTracker.Type</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/HRegion.FlushResult.Result.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">HRegion.FlushResult.Result</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/CompactingMemStore.IndexType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">CompactingMemStore.IndexType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/BloomType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">BloomType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.NextState.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.NextState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ChunkCreator.ChunkType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ChunkCreator.ChunkType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/ScannerContext.LimitScope.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">ScannerContext.LimitScope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/Region.Operation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">Region.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/MemStoreCompactionStrategy.Action.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">MemStoreCompactionStrategy.Action</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DefaultHeapMemoryTuner.StepDirection.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DefaultHeapMemoryTuner.StepDirection</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
index 8eef1de..21cdabe 100644
--- a/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/regionserver/wal/package-tree.html
@@ -247,10 +247,10 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/CompressionContext.DictionaryIndex.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">CompressionContext.DictionaryIndex</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/RingBufferTruck.Type.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">RingBufferTruck.Type</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/ProtobufLogReader.WALHdrResult.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">ProtobufLogReader.WALHdrResult</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.wal.<a href="../../../../../../org/apache/hadoop/hbase/regionserver/wal/WALActionsListener.RollRequestReason.html" title="enum in org.apache.hadoop.hbase.regionserver.wal"><span class="typeNameLink">WALActionsListener.RollRequestReason</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
index 02505ac..818a04c 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/package-tree.html
@@ -162,8 +162,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/SyncReplicationState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">SyncReplicationState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.<a href="../../../../../org/apache/hadoop/hbase/replication/ReplicationPeer.PeerState.html" title="enum in org.apache.hadoop.hbase.replication"><span class="typeNameLink">ReplicationPeer.PeerState</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
index c9ac434..800a66a 100644
--- a/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/replication/regionserver/package-tree.html
@@ -192,8 +192,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/ReplicationSourceShipper.WorkerState.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">ReplicationSourceShipper.WorkerState</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.replication.regionserver.<a href="../../../../../../org/apache/hadoop/hbase/replication/regionserver/MetricsReplicationSourceFactoryImpl.SourceHolder.html" title="enum in org.apache.hadoop.hbase.replication.regionserver"><span class="typeNameLink">MetricsReplicationSourceFactoryImpl.SourceHolder</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
index 7d70035..3aa879d 100644
--- a/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/rest/model/package-tree.html
@@ -110,8 +110,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.FilterType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.FilterType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.rest.model.<a href="../../../../../../org/apache/hadoop/hbase/rest/model/ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType.html" title="enum in org.apache.hadoop.hbase.rest.model"><span class="typeNameLink">ScannerModel.FilterModel.ByteArrayComparableModel.ComparatorType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
index 67a5c74..4a47ad8 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/access/package-tree.html
@@ -163,11 +163,11 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.AclType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">SnapshotScannerHDFSAclHelper.HDFSAclOperation.OperationType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Scope.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Scope</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/Permission.Action.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">Permission.Action</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessController.OpType.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessController.OpType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.access.<a href="../../../../../../org/apache/hadoop/hbase/security/access/AccessControlFilter.Strategy.html" title="enum in org.apache.hadoop.hbase.security.access"><span class="typeNameLink">AccessControlFilter.Strategy</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
index bd591e2..3f42ad7 100644
--- a/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/security/package-tree.html
@@ -193,8 +193,8 @@
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslStatus.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslStatus</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/AuthMethod.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">AuthMethod</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.security.<a href="../../../../../org/apache/hadoop/hbase/security/SaslUtil.QualityOfProtection.html" title="enum in org.apache.hadoop.hbase.security"><span class="typeNameLink">SaslUtil.QualityOfProtection</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
index 55f5b5a..fc1596c 100644
--- a/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/thrift/package-tree.html
@@ -212,9 +212,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/MetricsThriftServerSourceFactoryImpl.FactoryStorage.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">MetricsThriftServerSourceFactoryImpl.FactoryStorage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ThriftMetrics.ThriftServerType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ThriftMetrics.ThriftServerType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.thrift.<a href="../../../../../org/apache/hadoop/hbase/thrift/ImplType.html" title="enum in org.apache.hadoop.hbase.thrift"><span class="typeNameLink">ImplType</span></a></li>
 </ul>
 </li>
 </ul>
diff --git a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
index 60fe1a7..8dc3ad1 100644
--- a/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
+++ b/devapidocs/org/apache/hadoop/hbase/util/package-tree.html
@@ -539,13 +539,13 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
-<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.ERROR_CODE</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/IdReadWriteLock.ReferenceType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">IdReadWriteLock.ReferenceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Order.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Order</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/HbckErrorReporter.ERROR_CODE.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">HbckErrorReporter.ERROR_CODE</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.PureJavaComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.PureJavaComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/ChecksumType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">ChecksumType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.LexicographicalComparerHolder.UnsafeComparer.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">Bytes.LexicographicalComparerHolder.UnsafeComparer</span></a> (implements org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/Bytes.Comparer.html" title="interface in org.apache.hadoop.hbase.util">Bytes.Comparer</a>&lt;T&gt;)</li>
+<li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PrettyPrinter.Unit.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PrettyPrinter.Unit</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.util.<a href="../../../../../org/apache/hadoop/hbase/util/PoolMap.PoolType.html" title="enum in org.apache.hadoop.hbase.util"><span class="typeNameLink">PoolMap.PoolType</span></a></li>
 </ul>
 </li>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index c62c901..9ff8f9e 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,9 +16,9 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "3eb602c7f7081cd1a55deb40797f95adbc9e7758";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "7903f55c18d561d7451e91b8a014936a3116f142";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Fri Aug 16 14:35:41 UTC 2019";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Sat Aug 17 14:34:51 UTC 2019";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites-he-de.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
 <span class="sourceLineNo">015</span>  public static final String srcChecksum = "(stdin)=";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html b/devapidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html
index 1281c8a..004fb01 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/io/TimeRange.html
@@ -34,230 +34,259 @@
 <span class="sourceLineNo">026</span> * {@link #INITIAL_MIN_TIMESTAMP} and {@link #INITIAL_MAX_TIMESTAMP} only. Gets freaked out if<a name="line.26"></a>
 <span class="sourceLineNo">027</span> * passed a timestamp that is &lt; {@link #INITIAL_MIN_TIMESTAMP},<a name="line.27"></a>
 <span class="sourceLineNo">028</span> * &lt;p&gt;<a name="line.28"></a>
-<span class="sourceLineNo">029</span> * Evaluated according to minStamp &amp;lt;= timestamp &amp;lt; maxStamp<a name="line.29"></a>
-<span class="sourceLineNo">030</span> * or [minStamp,maxStamp) in interval notation.<a name="line.30"></a>
+<span class="sourceLineNo">029</span> * Evaluated according to minStamp &amp;lt;= timestamp &amp;lt; maxStamp or [minStamp,maxStamp) in interval<a name="line.29"></a>
+<span class="sourceLineNo">030</span> * notation.<a name="line.30"></a>
 <span class="sourceLineNo">031</span> * &lt;p&gt;<a name="line.31"></a>
-<span class="sourceLineNo">032</span> * Can be returned and read by clients.  Should not be directly created by clients.<a name="line.32"></a>
-<span class="sourceLineNo">033</span> * Thus, all constructors are purposely @InterfaceAudience.Private.<a name="line.33"></a>
-<span class="sourceLineNo">034</span> *&lt;p&gt;Immutable. Thread-safe.<a name="line.34"></a>
-<span class="sourceLineNo">035</span> */<a name="line.35"></a>
-<span class="sourceLineNo">036</span>@InterfaceAudience.Public<a name="line.36"></a>
-<span class="sourceLineNo">037</span>public class TimeRange {<a name="line.37"></a>
-<span class="sourceLineNo">038</span>  public static final long INITIAL_MIN_TIMESTAMP = 0L;<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public static final long INITIAL_MAX_TIMESTAMP = Long.MAX_VALUE;<a name="line.39"></a>
-<span class="sourceLineNo">040</span>  private static final TimeRange ALL_TIME = new TimeRange(INITIAL_MIN_TIMESTAMP,<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    INITIAL_MAX_TIMESTAMP);<a name="line.41"></a>
-<span class="sourceLineNo">042</span><a name="line.42"></a>
-<span class="sourceLineNo">043</span>  public static TimeRange allTime() {<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    return ALL_TIME;<a name="line.44"></a>
-<span class="sourceLineNo">045</span>  }<a name="line.45"></a>
-<span class="sourceLineNo">046</span><a name="line.46"></a>
-<span class="sourceLineNo">047</span>  public static TimeRange at(long ts) {<a name="line.47"></a>
-<span class="sourceLineNo">048</span>    if (ts &lt; 0 || ts == Long.MAX_VALUE) {<a name="line.48"></a>
-<span class="sourceLineNo">049</span>      throw new IllegalArgumentException("invalid ts:" + ts);<a name="line.49"></a>
-<span class="sourceLineNo">050</span>    }<a name="line.50"></a>
-<span class="sourceLineNo">051</span>    return new TimeRange(ts, ts + 1);<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  }<a name="line.52"></a>
-<span class="sourceLineNo">053</span><a name="line.53"></a>
-<span class="sourceLineNo">054</span>  private final long minStamp;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>  private final long maxStamp;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>  private final boolean allTime;<a name="line.56"></a>
-<span class="sourceLineNo">057</span><a name="line.57"></a>
-<span class="sourceLineNo">058</span>  /**<a name="line.58"></a>
-<span class="sourceLineNo">059</span>   * Default constructor.<a name="line.59"></a>
-<span class="sourceLineNo">060</span>   * Represents interval [0, Long.MAX_VALUE) (allTime)<a name="line.60"></a>
-<span class="sourceLineNo">061</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.61"></a>
-<span class="sourceLineNo">062</span>   * changed to private or removed in 3.0.<a name="line.62"></a>
-<span class="sourceLineNo">063</span>   */<a name="line.63"></a>
-<span class="sourceLineNo">064</span>  @Deprecated<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  @InterfaceAudience.Private<a name="line.65"></a>
-<span class="sourceLineNo">066</span>  public TimeRange() {<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    this(INITIAL_MIN_TIMESTAMP, INITIAL_MAX_TIMESTAMP);<a name="line.67"></a>
-<span class="sourceLineNo">068</span>  }<a name="line.68"></a>
-<span class="sourceLineNo">069</span><a name="line.69"></a>
-<span class="sourceLineNo">070</span>  /**<a name="line.70"></a>
-<span class="sourceLineNo">071</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.71"></a>
-<span class="sourceLineNo">072</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.72"></a>
-<span class="sourceLineNo">073</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.73"></a>
-<span class="sourceLineNo">074</span>   * changed to private or removed in 3.0.<a name="line.74"></a>
-<span class="sourceLineNo">075</span>   */<a name="line.75"></a>
-<span class="sourceLineNo">076</span>  @Deprecated<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  @InterfaceAudience.Private<a name="line.77"></a>
-<span class="sourceLineNo">078</span>  public TimeRange(long minStamp) {<a name="line.78"></a>
-<span class="sourceLineNo">079</span>    this(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  }<a name="line.80"></a>
-<span class="sourceLineNo">081</span><a name="line.81"></a>
-<span class="sourceLineNo">082</span>  /**<a name="line.82"></a>
-<span class="sourceLineNo">083</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.83"></a>
-<span class="sourceLineNo">084</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.84"></a>
-<span class="sourceLineNo">085</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.85"></a>
-<span class="sourceLineNo">086</span>   * changed to private or removed in 3.0.<a name="line.86"></a>
-<span class="sourceLineNo">087</span>   */<a name="line.87"></a>
-<span class="sourceLineNo">088</span>  @Deprecated<a name="line.88"></a>
-<span class="sourceLineNo">089</span>  @InterfaceAudience.Private<a name="line.89"></a>
-<span class="sourceLineNo">090</span>  public TimeRange(byte [] minStamp) {<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    this(Bytes.toLong(minStamp));<a name="line.91"></a>
-<span class="sourceLineNo">092</span>  }<a name="line.92"></a>
-<span class="sourceLineNo">093</span><a name="line.93"></a>
-<span class="sourceLineNo">094</span>  /**<a name="line.94"></a>
-<span class="sourceLineNo">095</span>   * Represents interval [minStamp, maxStamp)<a name="line.95"></a>
-<span class="sourceLineNo">096</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.96"></a>
-<span class="sourceLineNo">097</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.97"></a>
-<span class="sourceLineNo">098</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.98"></a>
-<span class="sourceLineNo">099</span>   * changed to private or removed in 3.0.<a name="line.99"></a>
-<span class="sourceLineNo">100</span>   */<a name="line.100"></a>
-<span class="sourceLineNo">101</span>  @Deprecated<a name="line.101"></a>
-<span class="sourceLineNo">102</span>  @InterfaceAudience.Private<a name="line.102"></a>
-<span class="sourceLineNo">103</span>  public TimeRange(byte [] minStamp, byte [] maxStamp) {<a name="line.103"></a>
-<span class="sourceLineNo">104</span>    this(Bytes.toLong(minStamp), Bytes.toLong(maxStamp));<a name="line.104"></a>
-<span class="sourceLineNo">105</span>  }<a name="line.105"></a>
-<span class="sourceLineNo">106</span><a name="line.106"></a>
-<span class="sourceLineNo">107</span>  /**<a name="line.107"></a>
-<span class="sourceLineNo">108</span>   * Represents interval [minStamp, maxStamp)<a name="line.108"></a>
-<span class="sourceLineNo">109</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.109"></a>
-<span class="sourceLineNo">110</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.110"></a>
-<span class="sourceLineNo">111</span>   * @throws IllegalArgumentException if either &lt;0,<a name="line.111"></a>
-<span class="sourceLineNo">112</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.112"></a>
-<span class="sourceLineNo">113</span>   * changed to private or removed in 3.0.<a name="line.113"></a>
-<span class="sourceLineNo">114</span>   */<a name="line.114"></a>
-<span class="sourceLineNo">115</span>  @Deprecated<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  @InterfaceAudience.Private<a name="line.116"></a>
-<span class="sourceLineNo">117</span>  public TimeRange(long minStamp, long maxStamp) {<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    check(minStamp, maxStamp);<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    this.minStamp = minStamp;<a name="line.119"></a>
-<span class="sourceLineNo">120</span>    this.maxStamp = maxStamp;<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    this.allTime = isAllTime(minStamp, maxStamp);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  }<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  private static boolean isAllTime(long minStamp, long maxStamp) {<a name="line.124"></a>
-<span class="sourceLineNo">125</span>    return minStamp == INITIAL_MIN_TIMESTAMP &amp;&amp; maxStamp == INITIAL_MAX_TIMESTAMP;<a name="line.125"></a>
-<span class="sourceLineNo">126</span>  }<a name="line.126"></a>
-<span class="sourceLineNo">127</span><a name="line.127"></a>
-<span class="sourceLineNo">128</span>  private static void check(long minStamp, long maxStamp) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>    if (minStamp &lt; 0 || maxStamp &lt; 0) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>      throw new IllegalArgumentException("Timestamp cannot be negative. minStamp:" + minStamp<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        + ", maxStamp:" + maxStamp);<a name="line.131"></a>
-<span class="sourceLineNo">132</span>    }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    if (maxStamp &lt; minStamp) {<a name="line.133"></a>
-<span class="sourceLineNo">134</span>      throw new IllegalArgumentException("maxStamp is smaller than minStamp");<a name="line.134"></a>
-<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
-<span class="sourceLineNo">136</span>  }<a name="line.136"></a>
-<span class="sourceLineNo">137</span><a name="line.137"></a>
-<span class="sourceLineNo">138</span>  /**<a name="line.138"></a>
-<span class="sourceLineNo">139</span>   * @return the smallest timestamp that should be considered<a name="line.139"></a>
-<span class="sourceLineNo">140</span>   */<a name="line.140"></a>
-<span class="sourceLineNo">141</span>  public long getMin() {<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    return minStamp;<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  }<a name="line.143"></a>
-<span class="sourceLineNo">144</span><a name="line.144"></a>
-<span class="sourceLineNo">145</span>  /**<a name="line.145"></a>
-<span class="sourceLineNo">146</span>   * @return the biggest timestamp that should be considered<a name="line.146"></a>
-<span class="sourceLineNo">147</span>   */<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  public long getMax() {<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    return maxStamp;<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  }<a name="line.150"></a>
-<span class="sourceLineNo">151</span><a name="line.151"></a>
-<span class="sourceLineNo">152</span>  /**<a name="line.152"></a>
-<span class="sourceLineNo">153</span>   * Check if it is for all time<a name="line.153"></a>
-<span class="sourceLineNo">154</span>   * @return true if it is for all time<a name="line.154"></a>
-<span class="sourceLineNo">155</span>   */<a name="line.155"></a>
-<span class="sourceLineNo">156</span>  public boolean isAllTime() {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    return allTime;<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  }<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  /**<a name="line.160"></a>
-<span class="sourceLineNo">161</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.161"></a>
-<span class="sourceLineNo">162</span>   * &lt;p&gt;<a name="line.162"></a>
-<span class="sourceLineNo">163</span>   * Returns true if within interval [minStamp, maxStamp), false if not.<a name="line.163"></a>
-<span class="sourceLineNo">164</span>   * @param bytes timestamp to check<a name="line.164"></a>
-<span class="sourceLineNo">165</span>   * @param offset offset into the bytes<a name="line.165"></a>
-<span class="sourceLineNo">166</span>   * @return true if within TimeRange, false if not<a name="line.166"></a>
-<span class="sourceLineNo">167</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.167"></a>
-<span class="sourceLineNo">168</span>   *   changed to private or removed in 3.0. Use {@link #withinTimeRange(long)} instead<a name="line.168"></a>
+<span class="sourceLineNo">032</span> * Can be returned and read by clients. Should not be directly created by clients. Thus, all<a name="line.32"></a>
+<span class="sourceLineNo">033</span> * constructors are purposely @InterfaceAudience.Private.<a name="line.33"></a>
+<span class="sourceLineNo">034</span> * &lt;p&gt;<a name="line.34"></a>
+<span class="sourceLineNo">035</span> * Immutable. Thread-safe.<a name="line.35"></a>
+<span class="sourceLineNo">036</span> */<a name="line.36"></a>
+<span class="sourceLineNo">037</span>@InterfaceAudience.Public<a name="line.37"></a>
+<span class="sourceLineNo">038</span>public class TimeRange {<a name="line.38"></a>
+<span class="sourceLineNo">039</span>  public static final long INITIAL_MIN_TIMESTAMP = 0L;<a name="line.39"></a>
+<span class="sourceLineNo">040</span>  public static final long INITIAL_MAX_TIMESTAMP = Long.MAX_VALUE;<a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static final TimeRange ALL_TIME = new TimeRange(INITIAL_MIN_TIMESTAMP,<a name="line.41"></a>
+<span class="sourceLineNo">042</span>    INITIAL_MAX_TIMESTAMP);<a name="line.42"></a>
+<span class="sourceLineNo">043</span><a name="line.43"></a>
+<span class="sourceLineNo">044</span>  public static TimeRange allTime() {<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    return ALL_TIME;<a name="line.45"></a>
+<span class="sourceLineNo">046</span>  }<a name="line.46"></a>
+<span class="sourceLineNo">047</span><a name="line.47"></a>
+<span class="sourceLineNo">048</span>  public static TimeRange at(long ts) {<a name="line.48"></a>
+<span class="sourceLineNo">049</span>    if (ts &lt; 0 || ts == Long.MAX_VALUE) {<a name="line.49"></a>
+<span class="sourceLineNo">050</span>      throw new IllegalArgumentException("invalid ts:" + ts);<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    }<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    return new TimeRange(ts, ts + 1);<a name="line.52"></a>
+<span class="sourceLineNo">053</span>  }<a name="line.53"></a>
+<span class="sourceLineNo">054</span><a name="line.54"></a>
+<span class="sourceLineNo">055</span>  /**<a name="line.55"></a>
+<span class="sourceLineNo">056</span>   * Represents the time interval [minStamp, Long.MAX_VALUE)<a name="line.56"></a>
+<span class="sourceLineNo">057</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.57"></a>
+<span class="sourceLineNo">058</span>   */<a name="line.58"></a>
+<span class="sourceLineNo">059</span>  public static TimeRange from(long minStamp) {<a name="line.59"></a>
+<span class="sourceLineNo">060</span>    check(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.60"></a>
+<span class="sourceLineNo">061</span>    return new TimeRange(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.61"></a>
+<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
+<span class="sourceLineNo">063</span><a name="line.63"></a>
+<span class="sourceLineNo">064</span>  /**<a name="line.64"></a>
+<span class="sourceLineNo">065</span>   * Represents the time interval [0, maxStamp)<a name="line.65"></a>
+<span class="sourceLineNo">066</span>   * @param maxStamp the minimum timestamp value, exclusive<a name="line.66"></a>
+<span class="sourceLineNo">067</span>   */<a name="line.67"></a>
+<span class="sourceLineNo">068</span>  public static TimeRange until(long maxStamp) {<a name="line.68"></a>
+<span class="sourceLineNo">069</span>    check(INITIAL_MIN_TIMESTAMP, maxStamp);<a name="line.69"></a>
+<span class="sourceLineNo">070</span>    return new TimeRange(INITIAL_MIN_TIMESTAMP, maxStamp);<a name="line.70"></a>
+<span class="sourceLineNo">071</span>  }<a name="line.71"></a>
+<span class="sourceLineNo">072</span><a name="line.72"></a>
+<span class="sourceLineNo">073</span>  /**<a name="line.73"></a>
+<span class="sourceLineNo">074</span>   * Represents the time interval [minStamp, maxStamp)<a name="line.74"></a>
+<span class="sourceLineNo">075</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.75"></a>
+<span class="sourceLineNo">076</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.76"></a>
+<span class="sourceLineNo">077</span>   */<a name="line.77"></a>
+<span class="sourceLineNo">078</span>  public static TimeRange between(long minStamp, long maxStamp) {<a name="line.78"></a>
+<span class="sourceLineNo">079</span>    check(minStamp, maxStamp);<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    return new TimeRange(minStamp, maxStamp);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>  }<a name="line.81"></a>
+<span class="sourceLineNo">082</span><a name="line.82"></a>
+<span class="sourceLineNo">083</span>  private final long minStamp;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>  private final long maxStamp;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>  private final boolean allTime;<a name="line.85"></a>
+<span class="sourceLineNo">086</span><a name="line.86"></a>
+<span class="sourceLineNo">087</span>  /**<a name="line.87"></a>
+<span class="sourceLineNo">088</span>   * Default constructor.<a name="line.88"></a>
+<span class="sourceLineNo">089</span>   * Represents interval [0, Long.MAX_VALUE) (allTime)<a name="line.89"></a>
+<span class="sourceLineNo">090</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.90"></a>
+<span class="sourceLineNo">091</span>   * changed to private or removed in 3.0.<a name="line.91"></a>
+<span class="sourceLineNo">092</span>   */<a name="line.92"></a>
+<span class="sourceLineNo">093</span>  @Deprecated<a name="line.93"></a>
+<span class="sourceLineNo">094</span>  @InterfaceAudience.Private<a name="line.94"></a>
+<span class="sourceLineNo">095</span>  public TimeRange() {<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    this(INITIAL_MIN_TIMESTAMP, INITIAL_MAX_TIMESTAMP);<a name="line.96"></a>
+<span class="sourceLineNo">097</span>  }<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  /**<a name="line.99"></a>
+<span class="sourceLineNo">100</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.100"></a>
+<span class="sourceLineNo">101</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.101"></a>
+<span class="sourceLineNo">102</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.102"></a>
+<span class="sourceLineNo">103</span>   * changed to private or removed in 3.0.<a name="line.103"></a>
+<span class="sourceLineNo">104</span>   */<a name="line.104"></a>
+<span class="sourceLineNo">105</span>  @Deprecated<a name="line.105"></a>
+<span class="sourceLineNo">106</span>  @InterfaceAudience.Private<a name="line.106"></a>
+<span class="sourceLineNo">107</span>  public TimeRange(long minStamp) {<a name="line.107"></a>
+<span class="sourceLineNo">108</span>    this(minStamp, INITIAL_MAX_TIMESTAMP);<a name="line.108"></a>
+<span class="sourceLineNo">109</span>  }<a name="line.109"></a>
+<span class="sourceLineNo">110</span><a name="line.110"></a>
+<span class="sourceLineNo">111</span>  /**<a name="line.111"></a>
+<span class="sourceLineNo">112</span>   * Represents interval [minStamp, Long.MAX_VALUE)<a name="line.112"></a>
+<span class="sourceLineNo">113</span>   * @param minStamp the minimum timestamp value, inclusive<a name="line.113"></a>
+<span class="sourceLineNo">114</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.114"></a>
+<span class="sourceLineNo">115</span>   * changed to private or removed in 3.0.<a name="line.115"></a>
+<span class="sourceLineNo">116</span>   */<a name="line.116"></a>
+<span class="sourceLineNo">117</span>  @Deprecated<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  @InterfaceAudience.Private<a name="line.118"></a>
+<span class="sourceLineNo">119</span>  public TimeRange(byte [] minStamp) {<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    this(Bytes.toLong(minStamp));<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  }<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  /**<a name="line.123"></a>
+<span class="sourceLineNo">124</span>   * Represents interval [minStamp, maxStamp)<a name="line.124"></a>
+<span class="sourceLineNo">125</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.125"></a>
+<span class="sourceLineNo">126</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.126"></a>
+<span class="sourceLineNo">127</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.127"></a>
+<span class="sourceLineNo">128</span>   * changed to private or removed in 3.0.<a name="line.128"></a>
+<span class="sourceLineNo">129</span>   */<a name="line.129"></a>
+<span class="sourceLineNo">130</span>  @Deprecated<a name="line.130"></a>
+<span class="sourceLineNo">131</span>  @InterfaceAudience.Private<a name="line.131"></a>
+<span class="sourceLineNo">132</span>  public TimeRange(byte [] minStamp, byte [] maxStamp) {<a name="line.132"></a>
+<span class="sourceLineNo">133</span>    this(Bytes.toLong(minStamp), Bytes.toLong(maxStamp));<a name="line.133"></a>
+<span class="sourceLineNo">134</span>  }<a name="line.134"></a>
+<span class="sourceLineNo">135</span><a name="line.135"></a>
+<span class="sourceLineNo">136</span>  /**<a name="line.136"></a>
+<span class="sourceLineNo">137</span>   * Represents interval [minStamp, maxStamp)<a name="line.137"></a>
+<span class="sourceLineNo">138</span>   * @param minStamp the minimum timestamp, inclusive<a name="line.138"></a>
+<span class="sourceLineNo">139</span>   * @param maxStamp the maximum timestamp, exclusive<a name="line.139"></a>
+<span class="sourceLineNo">140</span>   * @throws IllegalArgumentException if either &lt;0,<a name="line.140"></a>
+<span class="sourceLineNo">141</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.141"></a>
+<span class="sourceLineNo">142</span>   * changed to private or removed in 3.0.<a name="line.142"></a>
+<span class="sourceLineNo">143</span>   */<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  @Deprecated<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  @InterfaceAudience.Private<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public TimeRange(long minStamp, long maxStamp) {<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    check(minStamp, maxStamp);<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    this.minStamp = minStamp;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>    this.maxStamp = maxStamp;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>    this.allTime = isAllTime(minStamp, maxStamp);<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  }<a name="line.151"></a>
+<span class="sourceLineNo">152</span><a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static boolean isAllTime(long minStamp, long maxStamp) {<a name="line.153"></a>
+<span class="sourceLineNo">154</span>    return minStamp == INITIAL_MIN_TIMESTAMP &amp;&amp; maxStamp == INITIAL_MAX_TIMESTAMP;<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  }<a name="line.155"></a>
+<span class="sourceLineNo">156</span><a name="line.156"></a>
+<span class="sourceLineNo">157</span>  private static void check(long minStamp, long maxStamp) {<a name="line.157"></a>
+<span class="sourceLineNo">158</span>    if (minStamp &lt; 0 || maxStamp &lt; 0) {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>      throw new IllegalArgumentException("Timestamp cannot be negative. minStamp:" + minStamp<a name="line.159"></a>
+<span class="sourceLineNo">160</span>        + ", maxStamp:" + maxStamp);<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    }<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    if (maxStamp &lt; minStamp) {<a name="line.162"></a>
+<span class="sourceLineNo">163</span>      throw new IllegalArgumentException("maxStamp is smaller than minStamp");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    }<a name="line.164"></a>
+<span class="sourceLineNo">165</span>  }<a name="line.165"></a>
+<span class="sourceLineNo">166</span><a name="line.166"></a>
+<span class="sourceLineNo">167</span>  /**<a name="line.167"></a>
+<span class="sourceLineNo">168</span>   * @return the smallest timestamp that should be considered<a name="line.168"></a>
 <span class="sourceLineNo">169</span>   */<a name="line.169"></a>
-<span class="sourceLineNo">170</span>  @Deprecated<a name="line.170"></a>
-<span class="sourceLineNo">171</span>  public boolean withinTimeRange(byte [] bytes, int offset) {<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    if (allTime) {<a name="line.172"></a>
-<span class="sourceLineNo">173</span>      return true;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    }<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    return withinTimeRange(Bytes.toLong(bytes, offset));<a name="line.175"></a>
-<span class="sourceLineNo">176</span>  }<a name="line.176"></a>
-<span class="sourceLineNo">177</span><a name="line.177"></a>
-<span class="sourceLineNo">178</span>  /**<a name="line.178"></a>
-<span class="sourceLineNo">179</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.179"></a>
-<span class="sourceLineNo">180</span>   * &lt;p&gt;<a name="line.180"></a>
-<span class="sourceLineNo">181</span>   * Returns true if within interval [minStamp, maxStamp), false<a name="line.181"></a>
-<span class="sourceLineNo">182</span>   * if not.<a name="line.182"></a>
-<span class="sourceLineNo">183</span>   * @param timestamp timestamp to check<a name="line.183"></a>
-<span class="sourceLineNo">184</span>   * @return true if within TimeRange, false if not<a name="line.184"></a>
-<span class="sourceLineNo">185</span>   */<a name="line.185"></a>
-<span class="sourceLineNo">186</span>  public boolean withinTimeRange(long timestamp) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    assert timestamp &gt;= 0;<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    if (this.allTime) {<a name="line.188"></a>
-<span class="sourceLineNo">189</span>      return true;<a name="line.189"></a>
-<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    // check if &gt;= minStamp<a name="line.191"></a>
-<span class="sourceLineNo">192</span>    return (minStamp &lt;= timestamp &amp;&amp; timestamp &lt; maxStamp);<a name="line.192"></a>
-<span class="sourceLineNo">193</span>  }<a name="line.193"></a>
-<span class="sourceLineNo">194</span><a name="line.194"></a>
-<span class="sourceLineNo">195</span>  /**<a name="line.195"></a>
-<span class="sourceLineNo">196</span>   * Check if the range has any overlap with TimeRange<a name="line.196"></a>
-<span class="sourceLineNo">197</span>   * @param tr TimeRange<a name="line.197"></a>
-<span class="sourceLineNo">198</span>   * @return True if there is overlap, false otherwise<a name="line.198"></a>
-<span class="sourceLineNo">199</span>   */<a name="line.199"></a>
-<span class="sourceLineNo">200</span>  // This method came from TimeRangeTracker. We used to go there for this function but better<a name="line.200"></a>
-<span class="sourceLineNo">201</span>  // to come here to the immutable, unsynchronized datastructure at read time.<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  public boolean includesTimeRange(final TimeRange tr) {<a name="line.202"></a>
-<span class="sourceLineNo">203</span>    if (this.allTime) {<a name="line.203"></a>
-<span class="sourceLineNo">204</span>      return true;<a name="line.204"></a>
-<span class="sourceLineNo">205</span>    }<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    assert tr.getMin() &gt;= 0;<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    return getMin() &lt; tr.getMax() &amp;&amp; getMax() &gt;= tr.getMin();<a name="line.207"></a>
-<span class="sourceLineNo">208</span>  }<a name="line.208"></a>
-<span class="sourceLineNo">209</span><a name="line.209"></a>
-<span class="sourceLineNo">210</span>  /**<a name="line.210"></a>
-<span class="sourceLineNo">211</span>   * Check if the specified timestamp is within or after this TimeRange.<a name="line.211"></a>
-<span class="sourceLineNo">212</span>   * &lt;p&gt;<a name="line.212"></a>
-<span class="sourceLineNo">213</span>   * Returns true if greater than minStamp, false if not.<a name="line.213"></a>
-<span class="sourceLineNo">214</span>   * @param timestamp timestamp to check<a name="line.214"></a>
-<span class="sourceLineNo">215</span>   * @return true if within or after TimeRange, false if not<a name="line.215"></a>
-<span class="sourceLineNo">216</span>   */<a name="line.216"></a>
-<span class="sourceLineNo">217</span>  public boolean withinOrAfterTimeRange(long timestamp) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    assert timestamp &gt;= 0;<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    if (allTime) {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      return true;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span>    // check if &gt;= minStamp<a name="line.222"></a>
-<span class="sourceLineNo">223</span>    return timestamp &gt;= minStamp;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>  }<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>  /**<a name="line.226"></a>
-<span class="sourceLineNo">227</span>   * Compare the timestamp to timerange.<a name="line.227"></a>
-<span class="sourceLineNo">228</span>   * @return -1 if timestamp is less than timerange,<a name="line.228"></a>
-<span class="sourceLineNo">229</span>   * 0 if timestamp is within timerange,<a name="line.229"></a>
-<span class="sourceLineNo">230</span>   * 1 if timestamp is greater than timerange<a name="line.230"></a>
-<span class="sourceLineNo">231</span>   */<a name="line.231"></a>
-<span class="sourceLineNo">232</span>  public int compare(long timestamp) {<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    assert timestamp &gt;= 0;<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    if (this.allTime) {<a name="line.234"></a>
-<span class="sourceLineNo">235</span>      return 0;<a name="line.235"></a>
-<span class="sourceLineNo">236</span>    }<a name="line.236"></a>
-<span class="sourceLineNo">237</span>    if (timestamp &lt; minStamp) {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>      return -1;<a name="line.238"></a>
-<span class="sourceLineNo">239</span>    }<a name="line.239"></a>
-<span class="sourceLineNo">240</span>    return timestamp &gt;= maxStamp? 1: 0;<a name="line.240"></a>
-<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
-<span class="sourceLineNo">242</span><a name="line.242"></a>
-<span class="sourceLineNo">243</span>  @Override<a name="line.243"></a>
-<span class="sourceLineNo">244</span>  public String toString() {<a name="line.244"></a>
-<span class="sourceLineNo">245</span>    StringBuilder sb = new StringBuilder();<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    sb.append("maxStamp=");<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    sb.append(this.maxStamp);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>    sb.append(", minStamp=");<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    sb.append(this.minStamp);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>    return sb.toString();<a name="line.250"></a>
-<span class="sourceLineNo">251</span>  }<a name="line.251"></a>
-<span class="sourceLineNo">252</span>}<a name="line.252"></a>
+<span class="sourceLineNo">170</span>  public long getMin() {<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    return minStamp;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>  }<a name="line.172"></a>
+<span class="sourceLineNo">173</span><a name="line.173"></a>
+<span class="sourceLineNo">174</span>  /**<a name="line.174"></a>
+<span class="sourceLineNo">175</span>   * @return the biggest timestamp that should be considered<a name="line.175"></a>
+<span class="sourceLineNo">176</span>   */<a name="line.176"></a>
+<span class="sourceLineNo">177</span>  public long getMax() {<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    return maxStamp;<a name="line.178"></a>
+<span class="sourceLineNo">179</span>  }<a name="line.179"></a>
+<span class="sourceLineNo">180</span><a name="line.180"></a>
+<span class="sourceLineNo">181</span>  /**<a name="line.181"></a>
+<span class="sourceLineNo">182</span>   * Check if it is for all time<a name="line.182"></a>
+<span class="sourceLineNo">183</span>   * @return true if it is for all time<a name="line.183"></a>
+<span class="sourceLineNo">184</span>   */<a name="line.184"></a>
+<span class="sourceLineNo">185</span>  public boolean isAllTime() {<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    return allTime;<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  }<a name="line.187"></a>
+<span class="sourceLineNo">188</span><a name="line.188"></a>
+<span class="sourceLineNo">189</span>  /**<a name="line.189"></a>
+<span class="sourceLineNo">190</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.190"></a>
+<span class="sourceLineNo">191</span>   * &lt;p&gt;<a name="line.191"></a>
+<span class="sourceLineNo">192</span>   * Returns true if within interval [minStamp, maxStamp), false if not.<a name="line.192"></a>
+<span class="sourceLineNo">193</span>   * @param bytes timestamp to check<a name="line.193"></a>
+<span class="sourceLineNo">194</span>   * @param offset offset into the bytes<a name="line.194"></a>
+<span class="sourceLineNo">195</span>   * @return true if within TimeRange, false if not<a name="line.195"></a>
+<span class="sourceLineNo">196</span>   * @deprecated This is made @InterfaceAudience.Private in the 2.0 line and above and may be<a name="line.196"></a>
+<span class="sourceLineNo">197</span>   *   changed to private or removed in 3.0. Use {@link #withinTimeRange(long)} instead<a name="line.197"></a>
+<span class="sourceLineNo">198</span>   */<a name="line.198"></a>
+<span class="sourceLineNo">199</span>  @Deprecated<a name="line.199"></a>
+<span class="sourceLineNo">200</span>  public boolean withinTimeRange(byte [] bytes, int offset) {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    if (allTime) {<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      return true;<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    }<a name="line.203"></a>
+<span class="sourceLineNo">204</span>    return withinTimeRange(Bytes.toLong(bytes, offset));<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Check if the specified timestamp is within this TimeRange.<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * &lt;p&gt;<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   * Returns true if within interval [minStamp, maxStamp), false<a name="line.210"></a>
+<span class="sourceLineNo">211</span>   * if not.<a name="line.211"></a>
+<span class="sourceLineNo">212</span>   * @param timestamp timestamp to check<a name="line.212"></a>
+<span class="sourceLineNo">213</span>   * @return true if within TimeRange, false if not<a name="line.213"></a>
+<span class="sourceLineNo">214</span>   */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>  public boolean withinTimeRange(long timestamp) {<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    assert timestamp &gt;= 0;<a name="line.216"></a>
+<span class="sourceLineNo">217</span>    if (this.allTime) {<a name="line.217"></a>
+<span class="sourceLineNo">218</span>      return true;<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    }<a name="line.219"></a>
+<span class="sourceLineNo">220</span>    // check if &gt;= minStamp<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    return (minStamp &lt;= timestamp &amp;&amp; timestamp &lt; maxStamp);<a name="line.221"></a>
+<span class="sourceLineNo">222</span>  }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>  /**<a name="line.224"></a>
+<span class="sourceLineNo">225</span>   * Check if the range has any overlap with TimeRange<a name="line.225"></a>
+<span class="sourceLineNo">226</span>   * @param tr TimeRange<a name="line.226"></a>
+<span class="sourceLineNo">227</span>   * @return True if there is overlap, false otherwise<a name="line.227"></a>
+<span class="sourceLineNo">228</span>   */<a name="line.228"></a>
+<span class="sourceLineNo">229</span>  // This method came from TimeRangeTracker. We used to go there for this function but better<a name="line.229"></a>
+<span class="sourceLineNo">230</span>  // to come here to the immutable, unsynchronized datastructure at read time.<a name="line.230"></a>
+<span class="sourceLineNo">231</span>  public boolean includesTimeRange(final TimeRange tr) {<a name="line.231"></a>
+<span class="sourceLineNo">232</span>    if (this.allTime) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return true;<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>    assert tr.getMin() &gt;= 0;<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    return getMin() &lt; tr.getMax() &amp;&amp; getMax() &gt;= tr.getMin();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  /**<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   * Check if the specified timestamp is within or after this TimeRange.<a name="line.240"></a>
+<span class="sourceLineNo">241</span>   * &lt;p&gt;<a name="line.241"></a>
+<span class="sourceLineNo">242</span>   * Returns true if greater than minStamp, false if not.<a name="line.242"></a>
+<span class="sourceLineNo">243</span>   * @param timestamp timestamp to check<a name="line.243"></a>
+<span class="sourceLineNo">244</span>   * @return true if within or after TimeRange, false if not<a name="line.244"></a>
+<span class="sourceLineNo">245</span>   */<a name="line.245"></a>
+<span class="sourceLineNo">246</span>  public boolean withinOrAfterTimeRange(long timestamp) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    assert timestamp &gt;= 0;<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    if (allTime) {<a name="line.248"></a>
+<span class="sourceLineNo">249</span>      return true;<a name="line.249"></a>
+<span class="sourceLineNo">250</span>    }<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    // check if &gt;= minStamp<a name="line.251"></a>
+<span class="sourceLineNo">252</span>    return timestamp &gt;= minStamp;<a name="line.252"></a>
+<span class="sourceLineNo">253</span>  }<a name="line.253"></a>
+<span class="sourceLineNo">254</span><a name="line.254"></a>
+<span class="sourceLineNo">255</span>  /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>   * Compare the timestamp to timerange.<a name="line.256"></a>
+<span class="sourceLineNo">257</span>   * @return -1 if timestamp is less than timerange,<a name="line.257"></a>
+<span class="sourceLineNo">258</span>   * 0 if timestamp is within timerange,<a name="line.258"></a>
+<span class="sourceLineNo">259</span>   * 1 if timestamp is greater than timerange<a name="line.259"></a>
+<span class="sourceLineNo">260</span>   */<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  public int compare(long timestamp) {<a name="line.261"></a>
+<span class="sourceLineNo">262</span>    assert timestamp &gt;= 0;<a name="line.262"></a>
+<span class="sourceLineNo">263</span>    if (this.allTime) {<a name="line.263"></a>
+<span class="sourceLineNo">264</span>      return 0;<a name="line.264"></a>
+<span class="sourceLineNo">265</span>    }<a name="line.265"></a>
+<span class="sourceLineNo">266</span>    if (timestamp &lt; minStamp) {<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      return -1;<a name="line.267"></a>
+<span class="sourceLineNo">268</span>    }<a name="line.268"></a>
+<span class="sourceLineNo">269</span>    return timestamp &gt;= maxStamp? 1: 0;<a name="line.269"></a>
+<span class="sourceLineNo">270</span>  }<a name="line.270"></a>
+<span class="sourceLineNo">271</span><a name="line.271"></a>
+<span class="sourceLineNo">272</span>  @Override<a name="line.272"></a>
+<span class="sourceLineNo">273</span>  public String toString() {<a name="line.273"></a>
+<span class="sourceLineNo">274</span>    StringBuilder sb = new StringBuilder();<a name="line.274"></a>
+<span class="sourceLineNo">275</span>    sb.append("maxStamp=");<a name="line.275"></a>
+<span class="sourceLineNo">276</span>    sb.append(this.maxStamp);<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    sb.append(", minStamp=");<a name="line.277"></a>
+<span class="sourceLineNo">278</span>    sb.append(this.minStamp);<a name="line.278"></a>
+<span class="sourceLineNo">279</span>    return sb.toString();<a name="line.279"></a>
+<span class="sourceLineNo">280</span>  }<a name="line.280"></a>
+<span class="sourceLineNo">281</span>}<a name="line.281"></a>
 
 
 
diff --git a/downloads.html b/downloads.html
index faea0bd..981e458 100644
--- a/downloads.html
+++ b/downloads.html
@@ -394,7 +394,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/export_control.html b/export_control.html
index 06a3823..26da45b 100644
--- a/export_control.html
+++ b/export_control.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/index.html b/index.html
index cd9ccc2..e646bb4 100644
--- a/index.html
+++ b/index.html
@@ -258,7 +258,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/issue-tracking.html b/issue-tracking.html
index 66bf132..1bf08c2 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -152,7 +152,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/mail-lists.html b/mail-lists.html
index 01c873e..43ec028 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -205,7 +205,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/metrics.html b/metrics.html
index e19a511..feccc21 100644
--- a/metrics.html
+++ b/metrics.html
@@ -308,7 +308,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/old_news.html b/old_news.html
index 6bfa3a8..e01331b 100644
--- a/old_news.html
+++ b/old_news.html
@@ -299,7 +299,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugin-management.html b/plugin-management.html
index 794b0c6..25ce240 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -304,7 +304,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/plugins.html b/plugins.html
index 9239126..06cf4ff 100644
--- a/plugins.html
+++ b/plugins.html
@@ -231,7 +231,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index e4ad3ad..62d0bc6 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -618,7 +618,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-info.html b/project-info.html
index a8e541c..56aef18 100644
--- a/project-info.html
+++ b/project-info.html
@@ -193,7 +193,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-reports.html b/project-reports.html
index 140234e..11f4e7c 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -169,7 +169,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/project-summary.html b/project-summary.html
index 7adf9f7..2f30152 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -195,7 +195,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index dfc8527..a20fa9f 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -157,7 +157,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/replication.html b/replication.html
index e969a6a..beb7933 100644
--- a/replication.html
+++ b/replication.html
@@ -152,7 +152,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/resources.html b/resources.html
index 92791be..904c42e 100644
--- a/resources.html
+++ b/resources.html
@@ -180,7 +180,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/source-repository.html b/source-repository.html
index a62bb6c..8872d7b 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -163,7 +163,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/sponsors.html b/sponsors.html
index 0ddad80..1e5c676 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -182,7 +182,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/supportingprojects.html b/supportingprojects.html
index 7bf79c1..7720b82 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -369,7 +369,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/team-list.html b/team-list.html
index df3a8dc..5a94661 100644
--- a/team-list.html
+++ b/team-list.html
@@ -666,7 +666,7 @@
         <div class="row">
             <p>Copyright &copy;2007&#x2013;2019
 <a href="https://www.apache.org/">The Apache Software Foundation</a>.
-All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-16</li>
+All rights reserved.        <li id="publishDate" class="pull-right">Last Published: 2019-08-17</li>
 </p>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide.html b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide.html
index a07686c..b9c7f21 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/client/TestFromClientSide.html
@@ -2926,7 +2926,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndPutWithCompareOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.4907">testCheckAndPutWithCompareOp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.4943">testCheckAndPutWithCompareOp</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2940,7 +2940,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndDelete</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.4992">testCheckAndDelete</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5028">testCheckAndDelete</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2954,7 +2954,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCheckAndDeleteWithCompareOp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5012">testCheckAndDeleteWithCompareOp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5048">testCheckAndDeleteWithCompareOp</a>()
                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -2968,7 +2968,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanMetrics</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5109">testScanMetrics</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5145">testScanMetrics</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test ScanMetrics</div>
 <dl>
@@ -2983,7 +2983,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCacheOnWriteEvictOnClose</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5243">testCacheOnWriteEvictOnClose</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5279">testCacheOnWriteEvictOnClose</a>()
                                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Tests that cache on write works all the way up from the client-side.
 
@@ -3001,7 +3001,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>waitForStoreFileCount</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5345">waitForStoreFileCount</a>(org.apache.hadoop.hbase.regionserver.HStore&nbsp;store,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5381">waitForStoreFileCount</a>(org.apache.hadoop.hbase.regionserver.HStore&nbsp;store,
                                    int&nbsp;count,
                                    int&nbsp;timeout)
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
@@ -3017,7 +3017,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testNonCachedGetRegionLocation</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5360">testNonCachedGetRegionLocation</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5396">testNonCachedGetRegionLocation</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3031,7 +3031,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testGetRegionsInRange</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5407">testGetRegionsInRange</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5443">testGetRegionsInRange</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3045,7 +3045,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>getRegionsInRange</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.HRegionLocation&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5463">getRegionsInRange</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/List.html?is-external=true" title="class or interface in java.util">List</a>&lt;org.apache.hadoop.hbase.HRegionLocation&gt;&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5499">getRegionsInRange</a>(org.apache.hadoop.hbase.TableName&nbsp;tableName,
                                                                         byte[]&nbsp;startKey,
                                                                         byte[]&nbsp;endKey)
                                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -3061,7 +3061,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testJira6912</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5480">testJira6912</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5516">testJira6912</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3075,7 +3075,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testScan_NullQualifier</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5509">testScan_NullQualifier</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5545">testScan_NullQualifier</a>()
                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3089,7 +3089,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testNegativeTimestamp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5539">testNegativeTimestamp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5575">testNegativeTimestamp</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3103,7 +3103,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testRawScanRespectsVersions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5600">testRawScanRespectsVersions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5636">testRawScanRespectsVersions</a>()
                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3117,7 +3117,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testEmptyFilterList</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5673">testEmptyFilterList</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5709">testEmptyFilterList</a>()
                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3131,7 +3131,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSmallScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5713">testSmallScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5749">testSmallScan</a>()
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3145,7 +3145,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSuperSimpleWithReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5752">testSuperSimpleWithReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5788">testSuperSimpleWithReverseScan</a>()
                                     throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3159,7 +3159,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFiltersWithReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5797">testFiltersWithReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5833">testFiltersWithReverseScan</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3173,7 +3173,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testKeyOnlyFilterWithReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5840">testKeyOnlyFilterWithReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5876">testKeyOnlyFilterWithReverseScan</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3187,7 +3187,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSimpleMissingWithReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5881">testSimpleMissingWithReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5917">testSimpleMissingWithReverseScan</a>()
                                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test simple table and non-existent row cases.</div>
 <dl>
@@ -3202,7 +3202,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testNullWithReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5946">testNullWithReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5982">testNullWithReverseScan</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3216,7 +3216,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeletesWithReverseScan</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.5985">testDeletesWithReverseScan</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6021">testDeletesWithReverseScan</a>()
                                 throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3230,7 +3230,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReversedScanUnderMultiRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6170">testReversedScanUnderMultiRegions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6206">testReversedScanUnderMultiRegions</a>()
                                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Tests reversed scan under multi regions</div>
 <dl>
@@ -3245,7 +3245,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testSmallReversedScanUnderMultiRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6231">testSmallReversedScanUnderMultiRegions</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6267">testSmallReversedScanUnderMultiRegions</a>()
                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Tests reversed scan under multi regions</div>
 <dl>
@@ -3260,7 +3260,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>reverseScanTest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6271">reverseScanTest</a>(org.apache.hadoop.hbase.client.Table&nbsp;table,
+<pre>private&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6307">reverseScanTest</a>(org.apache.hadoop.hbase.client.Table&nbsp;table,
                              boolean&nbsp;small)
                       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -3275,7 +3275,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testFilterAllRecords</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6401">testFilterAllRecords</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6437">testFilterAllRecords</a>()
                           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3289,7 +3289,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellSizeLimit</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6415">testCellSizeLimit</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6451">testCellSizeLimit</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3303,7 +3303,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteSpecifiedVersionOfSpecifiedColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6451">testDeleteSpecifiedVersionOfSpecifiedColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6487">testDeleteSpecifiedVersionOfSpecifiedColumn</a>()
                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3317,7 +3317,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testDeleteLatestVersionOfSpecifiedColumn</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6497">testDeleteLatestVersionOfSpecifiedColumn</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6533">testDeleteLatestVersionOfSpecifiedColumn</a>()
                                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3331,7 +3331,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testReadWithFilter</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6560">testReadWithFilter</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6596">testReadWithFilter</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <div class="block">Test for HBASE-17125</div>
 <dl>
@@ -3346,7 +3346,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCellUtilTypeMethods</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6648">testCellUtilTypeMethods</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6684">testCellUtilTypeMethods</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3360,7 +3360,7 @@
 <ul class="blockList">
 <li class="blockList">
 <h4>testCreateTableWithZeroRegionReplicas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6702">testCreateTableWithZeroRegionReplicas</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6738">testCreateTableWithZeroRegionReplicas</a>()
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -3374,7 +3374,7 @@
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testModifyTableWithZeroRegionReplicas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6713">testModifyTableWithZeroRegionReplicas</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html#line.6749">testModifyTableWithZeroRegionReplicas</a>()
                                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html
index 7c58913..57688f4 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html
@@ -4875,1863 +4875,1899 @@
 <span class="sourceLineNo">4867</span>      assertFalse(ok);<a name="line.4867"></a>
 <span class="sourceLineNo">4868</span><a name="line.4868"></a>
 <span class="sourceLineNo">4869</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4869"></a>
-<span class="sourceLineNo">4870</span>              .timeRange(TimeRange.at(ts))<a name="line.4870"></a>
+<span class="sourceLineNo">4870</span>              .timeRange(TimeRange.from(ts + 10000))<a name="line.4870"></a>
 <span class="sourceLineNo">4871</span>              .ifEquals(VALUE)<a name="line.4871"></a>
 <span class="sourceLineNo">4872</span>              .thenPut(put);<a name="line.4872"></a>
-<span class="sourceLineNo">4873</span>      assertTrue(ok);<a name="line.4873"></a>
+<span class="sourceLineNo">4873</span>      assertFalse(ok);<a name="line.4873"></a>
 <span class="sourceLineNo">4874</span><a name="line.4874"></a>
-<span class="sourceLineNo">4875</span>      RowMutations rm = new RowMutations(ROW)<a name="line.4875"></a>
-<span class="sourceLineNo">4876</span>              .add((Mutation) put);<a name="line.4876"></a>
-<span class="sourceLineNo">4877</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4877"></a>
-<span class="sourceLineNo">4878</span>              .timeRange(TimeRange.at(ts + 10000))<a name="line.4878"></a>
-<span class="sourceLineNo">4879</span>              .ifEquals(VALUE)<a name="line.4879"></a>
-<span class="sourceLineNo">4880</span>              .thenMutate(rm);<a name="line.4880"></a>
-<span class="sourceLineNo">4881</span>      assertFalse(ok);<a name="line.4881"></a>
-<span class="sourceLineNo">4882</span><a name="line.4882"></a>
-<span class="sourceLineNo">4883</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4883"></a>
-<span class="sourceLineNo">4884</span>              .timeRange(TimeRange.at(ts))<a name="line.4884"></a>
-<span class="sourceLineNo">4885</span>              .ifEquals(VALUE)<a name="line.4885"></a>
-<span class="sourceLineNo">4886</span>              .thenMutate(rm);<a name="line.4886"></a>
-<span class="sourceLineNo">4887</span>      assertTrue(ok);<a name="line.4887"></a>
-<span class="sourceLineNo">4888</span><a name="line.4888"></a>
-<span class="sourceLineNo">4889</span>      Delete delete = new Delete(ROW)<a name="line.4889"></a>
-<span class="sourceLineNo">4890</span>              .addColumn(FAMILY, QUALIFIER);<a name="line.4890"></a>
-<span class="sourceLineNo">4891</span><a name="line.4891"></a>
-<span class="sourceLineNo">4892</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4892"></a>
-<span class="sourceLineNo">4893</span>              .timeRange(TimeRange.at(ts + 10000))<a name="line.4893"></a>
-<span class="sourceLineNo">4894</span>              .ifEquals(VALUE)<a name="line.4894"></a>
-<span class="sourceLineNo">4895</span>              .thenDelete(delete);<a name="line.4895"></a>
-<span class="sourceLineNo">4896</span>      assertFalse(ok);<a name="line.4896"></a>
-<span class="sourceLineNo">4897</span><a name="line.4897"></a>
-<span class="sourceLineNo">4898</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4898"></a>
-<span class="sourceLineNo">4899</span>              .timeRange(TimeRange.at(ts))<a name="line.4899"></a>
-<span class="sourceLineNo">4900</span>              .ifEquals(VALUE)<a name="line.4900"></a>
-<span class="sourceLineNo">4901</span>              .thenDelete(delete);<a name="line.4901"></a>
-<span class="sourceLineNo">4902</span>      assertTrue(ok);<a name="line.4902"></a>
-<span class="sourceLineNo">4903</span>    }<a name="line.4903"></a>
-<span class="sourceLineNo">4904</span>  }<a name="line.4904"></a>
-<span class="sourceLineNo">4905</span><a name="line.4905"></a>
-<span class="sourceLineNo">4906</span>  @Test<a name="line.4906"></a>
-<span class="sourceLineNo">4907</span>  public void testCheckAndPutWithCompareOp() throws IOException {<a name="line.4907"></a>
-<span class="sourceLineNo">4908</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.4908"></a>
-<span class="sourceLineNo">4909</span>    final byte [] value2 = Bytes.toBytes("bbbb");<a name="line.4909"></a>
-<span class="sourceLineNo">4910</span>    final byte [] value3 = Bytes.toBytes("cccc");<a name="line.4910"></a>
-<span class="sourceLineNo">4911</span>    final byte [] value4 = Bytes.toBytes("dddd");<a name="line.4911"></a>
-<span class="sourceLineNo">4912</span><a name="line.4912"></a>
-<span class="sourceLineNo">4913</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()), FAMILY)) {<a name="line.4913"></a>
-<span class="sourceLineNo">4914</span><a name="line.4914"></a>
-<span class="sourceLineNo">4915</span>      Put put2 = new Put(ROW);<a name="line.4915"></a>
-<span class="sourceLineNo">4916</span>      put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.4916"></a>
-<span class="sourceLineNo">4917</span><a name="line.4917"></a>
-<span class="sourceLineNo">4918</span>      Put put3 = new Put(ROW);<a name="line.4918"></a>
-<span class="sourceLineNo">4919</span>      put3.addColumn(FAMILY, QUALIFIER, value3);<a name="line.4919"></a>
-<span class="sourceLineNo">4920</span><a name="line.4920"></a>
-<span class="sourceLineNo">4921</span>      // row doesn't exist, so using "ifNotExists" should be considered "match".<a name="line.4921"></a>
-<span class="sourceLineNo">4922</span>      boolean ok =<a name="line.4922"></a>
-<span class="sourceLineNo">4923</span>              table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER).ifNotExists().thenPut(put2);<a name="line.4923"></a>
-<span class="sourceLineNo">4924</span>      assertTrue(ok);<a name="line.4924"></a>
-<span class="sourceLineNo">4925</span><a name="line.4925"></a>
-<span class="sourceLineNo">4926</span>      // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL<a name="line.4926"></a>
-<span class="sourceLineNo">4927</span>      // turns out "match"<a name="line.4927"></a>
+<span class="sourceLineNo">4875</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4875"></a>
+<span class="sourceLineNo">4876</span>              .timeRange(TimeRange.between(ts + 10000, ts + 20000))<a name="line.4876"></a>
+<span class="sourceLineNo">4877</span>              .ifEquals(VALUE)<a name="line.4877"></a>
+<span class="sourceLineNo">4878</span>              .thenPut(put);<a name="line.4878"></a>
+<span class="sourceLineNo">4879</span>      assertFalse(ok);<a name="line.4879"></a>
+<span class="sourceLineNo">4880</span><a name="line.4880"></a>
+<span class="sourceLineNo">4881</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4881"></a>
+<span class="sourceLineNo">4882</span>              .timeRange(TimeRange.until(ts))<a name="line.4882"></a>
+<span class="sourceLineNo">4883</span>              .ifEquals(VALUE)<a name="line.4883"></a>
+<span class="sourceLineNo">4884</span>              .thenPut(put);<a name="line.4884"></a>
+<span class="sourceLineNo">4885</span>      assertFalse(ok);<a name="line.4885"></a>
+<span class="sourceLineNo">4886</span><a name="line.4886"></a>
+<span class="sourceLineNo">4887</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4887"></a>
+<span class="sourceLineNo">4888</span>              .timeRange(TimeRange.at(ts))<a name="line.4888"></a>
+<span class="sourceLineNo">4889</span>              .ifEquals(VALUE)<a name="line.4889"></a>
+<span class="sourceLineNo">4890</span>              .thenPut(put);<a name="line.4890"></a>
+<span class="sourceLineNo">4891</span>      assertTrue(ok);<a name="line.4891"></a>
+<span class="sourceLineNo">4892</span><a name="line.4892"></a>
+<span class="sourceLineNo">4893</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4893"></a>
+<span class="sourceLineNo">4894</span>              .timeRange(TimeRange.from(ts))<a name="line.4894"></a>
+<span class="sourceLineNo">4895</span>              .ifEquals(VALUE)<a name="line.4895"></a>
+<span class="sourceLineNo">4896</span>              .thenPut(put);<a name="line.4896"></a>
+<span class="sourceLineNo">4897</span>      assertTrue(ok);<a name="line.4897"></a>
+<span class="sourceLineNo">4898</span><a name="line.4898"></a>
+<span class="sourceLineNo">4899</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4899"></a>
+<span class="sourceLineNo">4900</span>              .timeRange(TimeRange.between(ts, ts + 20000))<a name="line.4900"></a>
+<span class="sourceLineNo">4901</span>              .ifEquals(VALUE)<a name="line.4901"></a>
+<span class="sourceLineNo">4902</span>              .thenPut(put);<a name="line.4902"></a>
+<span class="sourceLineNo">4903</span>      assertTrue(ok);<a name="line.4903"></a>
+<span class="sourceLineNo">4904</span><a name="line.4904"></a>
+<span class="sourceLineNo">4905</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4905"></a>
+<span class="sourceLineNo">4906</span>              .timeRange(TimeRange.until(ts + 10000))<a name="line.4906"></a>
+<span class="sourceLineNo">4907</span>              .ifEquals(VALUE)<a name="line.4907"></a>
+<span class="sourceLineNo">4908</span>              .thenPut(put);<a name="line.4908"></a>
+<span class="sourceLineNo">4909</span>      assertTrue(ok);<a name="line.4909"></a>
+<span class="sourceLineNo">4910</span><a name="line.4910"></a>
+<span class="sourceLineNo">4911</span>      RowMutations rm = new RowMutations(ROW)<a name="line.4911"></a>
+<span class="sourceLineNo">4912</span>              .add((Mutation) put);<a name="line.4912"></a>
+<span class="sourceLineNo">4913</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4913"></a>
+<span class="sourceLineNo">4914</span>              .timeRange(TimeRange.at(ts + 10000))<a name="line.4914"></a>
+<span class="sourceLineNo">4915</span>              .ifEquals(VALUE)<a name="line.4915"></a>
+<span class="sourceLineNo">4916</span>              .thenMutate(rm);<a name="line.4916"></a>
+<span class="sourceLineNo">4917</span>      assertFalse(ok);<a name="line.4917"></a>
+<span class="sourceLineNo">4918</span><a name="line.4918"></a>
+<span class="sourceLineNo">4919</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4919"></a>
+<span class="sourceLineNo">4920</span>              .timeRange(TimeRange.at(ts))<a name="line.4920"></a>
+<span class="sourceLineNo">4921</span>              .ifEquals(VALUE)<a name="line.4921"></a>
+<span class="sourceLineNo">4922</span>              .thenMutate(rm);<a name="line.4922"></a>
+<span class="sourceLineNo">4923</span>      assertTrue(ok);<a name="line.4923"></a>
+<span class="sourceLineNo">4924</span><a name="line.4924"></a>
+<span class="sourceLineNo">4925</span>      Delete delete = new Delete(ROW)<a name="line.4925"></a>
+<span class="sourceLineNo">4926</span>              .addColumn(FAMILY, QUALIFIER);<a name="line.4926"></a>
+<span class="sourceLineNo">4927</span><a name="line.4927"></a>
 <span class="sourceLineNo">4928</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4928"></a>
-<span class="sourceLineNo">4929</span>              .ifMatches(CompareOperator.GREATER, value1).thenPut(put2);<a name="line.4929"></a>
-<span class="sourceLineNo">4930</span>      assertFalse(ok);<a name="line.4930"></a>
-<span class="sourceLineNo">4931</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4931"></a>
-<span class="sourceLineNo">4932</span>              .ifMatches(CompareOperator.EQUAL, value1).thenPut(put2);<a name="line.4932"></a>
-<span class="sourceLineNo">4933</span>      assertFalse(ok);<a name="line.4933"></a>
+<span class="sourceLineNo">4929</span>              .timeRange(TimeRange.at(ts + 10000))<a name="line.4929"></a>
+<span class="sourceLineNo">4930</span>              .ifEquals(VALUE)<a name="line.4930"></a>
+<span class="sourceLineNo">4931</span>              .thenDelete(delete);<a name="line.4931"></a>
+<span class="sourceLineNo">4932</span>      assertFalse(ok);<a name="line.4932"></a>
+<span class="sourceLineNo">4933</span><a name="line.4933"></a>
 <span class="sourceLineNo">4934</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4934"></a>
-<span class="sourceLineNo">4935</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value1).thenPut(put2);<a name="line.4935"></a>
-<span class="sourceLineNo">4936</span>      assertFalse(ok);<a name="line.4936"></a>
-<span class="sourceLineNo">4937</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4937"></a>
-<span class="sourceLineNo">4938</span>              .ifMatches(CompareOperator.LESS, value1).thenPut(put2);<a name="line.4938"></a>
-<span class="sourceLineNo">4939</span>      assertTrue(ok);<a name="line.4939"></a>
-<span class="sourceLineNo">4940</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4940"></a>
-<span class="sourceLineNo">4941</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value1).thenPut(put2);<a name="line.4941"></a>
-<span class="sourceLineNo">4942</span>      assertTrue(ok);<a name="line.4942"></a>
-<span class="sourceLineNo">4943</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4943"></a>
-<span class="sourceLineNo">4944</span>              .ifMatches(CompareOperator.NOT_EQUAL, value1).thenPut(put3);<a name="line.4944"></a>
-<span class="sourceLineNo">4945</span>      assertTrue(ok);<a name="line.4945"></a>
-<span class="sourceLineNo">4946</span><a name="line.4946"></a>
-<span class="sourceLineNo">4947</span>      // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL<a name="line.4947"></a>
-<span class="sourceLineNo">4948</span>      // turns out "match"<a name="line.4948"></a>
-<span class="sourceLineNo">4949</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4949"></a>
-<span class="sourceLineNo">4950</span>              .ifMatches(CompareOperator.LESS, value4).thenPut(put3);<a name="line.4950"></a>
-<span class="sourceLineNo">4951</span>      assertFalse(ok);<a name="line.4951"></a>
-<span class="sourceLineNo">4952</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4952"></a>
-<span class="sourceLineNo">4953</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value4).thenPut(put3);<a name="line.4953"></a>
-<span class="sourceLineNo">4954</span>      assertFalse(ok);<a name="line.4954"></a>
-<span class="sourceLineNo">4955</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4955"></a>
-<span class="sourceLineNo">4956</span>              .ifMatches(CompareOperator.EQUAL, value4).thenPut(put3);<a name="line.4956"></a>
-<span class="sourceLineNo">4957</span>      assertFalse(ok);<a name="line.4957"></a>
-<span class="sourceLineNo">4958</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4958"></a>
-<span class="sourceLineNo">4959</span>              .ifMatches(CompareOperator.GREATER, value4).thenPut(put3);<a name="line.4959"></a>
+<span class="sourceLineNo">4935</span>              .timeRange(TimeRange.at(ts))<a name="line.4935"></a>
+<span class="sourceLineNo">4936</span>              .ifEquals(VALUE)<a name="line.4936"></a>
+<span class="sourceLineNo">4937</span>              .thenDelete(delete);<a name="line.4937"></a>
+<span class="sourceLineNo">4938</span>      assertTrue(ok);<a name="line.4938"></a>
+<span class="sourceLineNo">4939</span>    }<a name="line.4939"></a>
+<span class="sourceLineNo">4940</span>  }<a name="line.4940"></a>
+<span class="sourceLineNo">4941</span><a name="line.4941"></a>
+<span class="sourceLineNo">4942</span>  @Test<a name="line.4942"></a>
+<span class="sourceLineNo">4943</span>  public void testCheckAndPutWithCompareOp() throws IOException {<a name="line.4943"></a>
+<span class="sourceLineNo">4944</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.4944"></a>
+<span class="sourceLineNo">4945</span>    final byte [] value2 = Bytes.toBytes("bbbb");<a name="line.4945"></a>
+<span class="sourceLineNo">4946</span>    final byte [] value3 = Bytes.toBytes("cccc");<a name="line.4946"></a>
+<span class="sourceLineNo">4947</span>    final byte [] value4 = Bytes.toBytes("dddd");<a name="line.4947"></a>
+<span class="sourceLineNo">4948</span><a name="line.4948"></a>
+<span class="sourceLineNo">4949</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()), FAMILY)) {<a name="line.4949"></a>
+<span class="sourceLineNo">4950</span><a name="line.4950"></a>
+<span class="sourceLineNo">4951</span>      Put put2 = new Put(ROW);<a name="line.4951"></a>
+<span class="sourceLineNo">4952</span>      put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.4952"></a>
+<span class="sourceLineNo">4953</span><a name="line.4953"></a>
+<span class="sourceLineNo">4954</span>      Put put3 = new Put(ROW);<a name="line.4954"></a>
+<span class="sourceLineNo">4955</span>      put3.addColumn(FAMILY, QUALIFIER, value3);<a name="line.4955"></a>
+<span class="sourceLineNo">4956</span><a name="line.4956"></a>
+<span class="sourceLineNo">4957</span>      // row doesn't exist, so using "ifNotExists" should be considered "match".<a name="line.4957"></a>
+<span class="sourceLineNo">4958</span>      boolean ok =<a name="line.4958"></a>
+<span class="sourceLineNo">4959</span>              table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER).ifNotExists().thenPut(put2);<a name="line.4959"></a>
 <span class="sourceLineNo">4960</span>      assertTrue(ok);<a name="line.4960"></a>
-<span class="sourceLineNo">4961</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4961"></a>
-<span class="sourceLineNo">4962</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value4).thenPut(put3);<a name="line.4962"></a>
-<span class="sourceLineNo">4963</span>      assertTrue(ok);<a name="line.4963"></a>
+<span class="sourceLineNo">4961</span><a name="line.4961"></a>
+<span class="sourceLineNo">4962</span>      // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL<a name="line.4962"></a>
+<span class="sourceLineNo">4963</span>      // turns out "match"<a name="line.4963"></a>
 <span class="sourceLineNo">4964</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4964"></a>
-<span class="sourceLineNo">4965</span>              .ifMatches(CompareOperator.NOT_EQUAL, value4).thenPut(put2);<a name="line.4965"></a>
-<span class="sourceLineNo">4966</span>      assertTrue(ok);<a name="line.4966"></a>
-<span class="sourceLineNo">4967</span><a name="line.4967"></a>
-<span class="sourceLineNo">4968</span>      // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL<a name="line.4968"></a>
-<span class="sourceLineNo">4969</span>      // turns out "match"<a name="line.4969"></a>
+<span class="sourceLineNo">4965</span>              .ifMatches(CompareOperator.GREATER, value1).thenPut(put2);<a name="line.4965"></a>
+<span class="sourceLineNo">4966</span>      assertFalse(ok);<a name="line.4966"></a>
+<span class="sourceLineNo">4967</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4967"></a>
+<span class="sourceLineNo">4968</span>              .ifMatches(CompareOperator.EQUAL, value1).thenPut(put2);<a name="line.4968"></a>
+<span class="sourceLineNo">4969</span>      assertFalse(ok);<a name="line.4969"></a>
 <span class="sourceLineNo">4970</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4970"></a>
-<span class="sourceLineNo">4971</span>              .ifMatches(CompareOperator.GREATER, value2).thenPut(put2);<a name="line.4971"></a>
+<span class="sourceLineNo">4971</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value1).thenPut(put2);<a name="line.4971"></a>
 <span class="sourceLineNo">4972</span>      assertFalse(ok);<a name="line.4972"></a>
 <span class="sourceLineNo">4973</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4973"></a>
-<span class="sourceLineNo">4974</span>              .ifMatches(CompareOperator.NOT_EQUAL, value2).thenPut(put2);<a name="line.4974"></a>
-<span class="sourceLineNo">4975</span>      assertFalse(ok);<a name="line.4975"></a>
+<span class="sourceLineNo">4974</span>              .ifMatches(CompareOperator.LESS, value1).thenPut(put2);<a name="line.4974"></a>
+<span class="sourceLineNo">4975</span>      assertTrue(ok);<a name="line.4975"></a>
 <span class="sourceLineNo">4976</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4976"></a>
-<span class="sourceLineNo">4977</span>              .ifMatches(CompareOperator.LESS, value2).thenPut(put2);<a name="line.4977"></a>
-<span class="sourceLineNo">4978</span>      assertFalse(ok);<a name="line.4978"></a>
+<span class="sourceLineNo">4977</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value1).thenPut(put2);<a name="line.4977"></a>
+<span class="sourceLineNo">4978</span>      assertTrue(ok);<a name="line.4978"></a>
 <span class="sourceLineNo">4979</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4979"></a>
-<span class="sourceLineNo">4980</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value2).thenPut(put2);<a name="line.4980"></a>
+<span class="sourceLineNo">4980</span>              .ifMatches(CompareOperator.NOT_EQUAL, value1).thenPut(put3);<a name="line.4980"></a>
 <span class="sourceLineNo">4981</span>      assertTrue(ok);<a name="line.4981"></a>
-<span class="sourceLineNo">4982</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4982"></a>
-<span class="sourceLineNo">4983</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value2).thenPut(put2);<a name="line.4983"></a>
-<span class="sourceLineNo">4984</span>      assertTrue(ok);<a name="line.4984"></a>
+<span class="sourceLineNo">4982</span><a name="line.4982"></a>
+<span class="sourceLineNo">4983</span>      // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL<a name="line.4983"></a>
+<span class="sourceLineNo">4984</span>      // turns out "match"<a name="line.4984"></a>
 <span class="sourceLineNo">4985</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4985"></a>
-<span class="sourceLineNo">4986</span>              .ifMatches(CompareOperator.EQUAL, value2).thenPut(put3);<a name="line.4986"></a>
-<span class="sourceLineNo">4987</span>      assertTrue(ok);<a name="line.4987"></a>
-<span class="sourceLineNo">4988</span>    }<a name="line.4988"></a>
-<span class="sourceLineNo">4989</span>  }<a name="line.4989"></a>
-<span class="sourceLineNo">4990</span><a name="line.4990"></a>
-<span class="sourceLineNo">4991</span>  @Test<a name="line.4991"></a>
-<span class="sourceLineNo">4992</span>  public void testCheckAndDelete() throws IOException {<a name="line.4992"></a>
-<span class="sourceLineNo">4993</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.4993"></a>
-<span class="sourceLineNo">4994</span><a name="line.4994"></a>
-<span class="sourceLineNo">4995</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()),<a name="line.4995"></a>
-<span class="sourceLineNo">4996</span>        FAMILY)) {<a name="line.4996"></a>
-<span class="sourceLineNo">4997</span><a name="line.4997"></a>
-<span class="sourceLineNo">4998</span>      Put put = new Put(ROW);<a name="line.4998"></a>
-<span class="sourceLineNo">4999</span>      put.addColumn(FAMILY, QUALIFIER, value1);<a name="line.4999"></a>
-<span class="sourceLineNo">5000</span>      table.put(put);<a name="line.5000"></a>
-<span class="sourceLineNo">5001</span><a name="line.5001"></a>
-<span class="sourceLineNo">5002</span>      Delete delete = new Delete(ROW);<a name="line.5002"></a>
-<span class="sourceLineNo">5003</span>      delete.addColumns(FAMILY, QUALIFIER);<a name="line.5003"></a>
-<span class="sourceLineNo">5004</span><a name="line.5004"></a>
-<span class="sourceLineNo">5005</span>      boolean ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5005"></a>
-<span class="sourceLineNo">5006</span>              .ifEquals(value1).thenDelete(delete);<a name="line.5006"></a>
-<span class="sourceLineNo">5007</span>      assertTrue(ok);<a name="line.5007"></a>
-<span class="sourceLineNo">5008</span>    }<a name="line.5008"></a>
-<span class="sourceLineNo">5009</span>  }<a name="line.5009"></a>
-<span class="sourceLineNo">5010</span><a name="line.5010"></a>
-<span class="sourceLineNo">5011</span>  @Test<a name="line.5011"></a>
-<span class="sourceLineNo">5012</span>  public void testCheckAndDeleteWithCompareOp() throws IOException {<a name="line.5012"></a>
-<span class="sourceLineNo">5013</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.5013"></a>
-<span class="sourceLineNo">5014</span>    final byte [] value2 = Bytes.toBytes("bbbb");<a name="line.5014"></a>
-<span class="sourceLineNo">5015</span>    final byte [] value3 = Bytes.toBytes("cccc");<a name="line.5015"></a>
-<span class="sourceLineNo">5016</span>    final byte [] value4 = Bytes.toBytes("dddd");<a name="line.5016"></a>
-<span class="sourceLineNo">5017</span><a name="line.5017"></a>
-<span class="sourceLineNo">5018</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()),<a name="line.5018"></a>
-<span class="sourceLineNo">5019</span>        FAMILY)) {<a name="line.5019"></a>
-<span class="sourceLineNo">5020</span><a name="line.5020"></a>
-<span class="sourceLineNo">5021</span>      Put put2 = new Put(ROW);<a name="line.5021"></a>
-<span class="sourceLineNo">5022</span>      put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.5022"></a>
-<span class="sourceLineNo">5023</span>      table.put(put2);<a name="line.5023"></a>
-<span class="sourceLineNo">5024</span><a name="line.5024"></a>
-<span class="sourceLineNo">5025</span>      Put put3 = new Put(ROW);<a name="line.5025"></a>
-<span class="sourceLineNo">5026</span>      put3.addColumn(FAMILY, QUALIFIER, value3);<a name="line.5026"></a>
-<span class="sourceLineNo">5027</span><a name="line.5027"></a>
-<span class="sourceLineNo">5028</span>      Delete delete = new Delete(ROW);<a name="line.5028"></a>
-<span class="sourceLineNo">5029</span>      delete.addColumns(FAMILY, QUALIFIER);<a name="line.5029"></a>
+<span class="sourceLineNo">4986</span>              .ifMatches(CompareOperator.LESS, value4).thenPut(put3);<a name="line.4986"></a>
+<span class="sourceLineNo">4987</span>      assertFalse(ok);<a name="line.4987"></a>
+<span class="sourceLineNo">4988</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4988"></a>
+<span class="sourceLineNo">4989</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value4).thenPut(put3);<a name="line.4989"></a>
+<span class="sourceLineNo">4990</span>      assertFalse(ok);<a name="line.4990"></a>
+<span class="sourceLineNo">4991</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4991"></a>
+<span class="sourceLineNo">4992</span>              .ifMatches(CompareOperator.EQUAL, value4).thenPut(put3);<a name="line.4992"></a>
+<span class="sourceLineNo">4993</span>      assertFalse(ok);<a name="line.4993"></a>
+<span class="sourceLineNo">4994</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4994"></a>
+<span class="sourceLineNo">4995</span>              .ifMatches(CompareOperator.GREATER, value4).thenPut(put3);<a name="line.4995"></a>
+<span class="sourceLineNo">4996</span>      assertTrue(ok);<a name="line.4996"></a>
+<span class="sourceLineNo">4997</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.4997"></a>
+<span class="sourceLineNo">4998</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value4).thenPut(put3);<a name="line.4998"></a>
+<span class="sourceLineNo">4999</span>      assertTrue(ok);<a name="line.4999"></a>
+<span class="sourceLineNo">5000</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5000"></a>
+<span class="sourceLineNo">5001</span>              .ifMatches(CompareOperator.NOT_EQUAL, value4).thenPut(put2);<a name="line.5001"></a>
+<span class="sourceLineNo">5002</span>      assertTrue(ok);<a name="line.5002"></a>
+<span class="sourceLineNo">5003</span><a name="line.5003"></a>
+<span class="sourceLineNo">5004</span>      // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL<a name="line.5004"></a>
+<span class="sourceLineNo">5005</span>      // turns out "match"<a name="line.5005"></a>
+<span class="sourceLineNo">5006</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5006"></a>
+<span class="sourceLineNo">5007</span>              .ifMatches(CompareOperator.GREATER, value2).thenPut(put2);<a name="line.5007"></a>
+<span class="sourceLineNo">5008</span>      assertFalse(ok);<a name="line.5008"></a>
+<span class="sourceLineNo">5009</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5009"></a>
+<span class="sourceLineNo">5010</span>              .ifMatches(CompareOperator.NOT_EQUAL, value2).thenPut(put2);<a name="line.5010"></a>
+<span class="sourceLineNo">5011</span>      assertFalse(ok);<a name="line.5011"></a>
+<span class="sourceLineNo">5012</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5012"></a>
+<span class="sourceLineNo">5013</span>              .ifMatches(CompareOperator.LESS, value2).thenPut(put2);<a name="line.5013"></a>
+<span class="sourceLineNo">5014</span>      assertFalse(ok);<a name="line.5014"></a>
+<span class="sourceLineNo">5015</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5015"></a>
+<span class="sourceLineNo">5016</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value2).thenPut(put2);<a name="line.5016"></a>
+<span class="sourceLineNo">5017</span>      assertTrue(ok);<a name="line.5017"></a>
+<span class="sourceLineNo">5018</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5018"></a>
+<span class="sourceLineNo">5019</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value2).thenPut(put2);<a name="line.5019"></a>
+<span class="sourceLineNo">5020</span>      assertTrue(ok);<a name="line.5020"></a>
+<span class="sourceLineNo">5021</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5021"></a>
+<span class="sourceLineNo">5022</span>              .ifMatches(CompareOperator.EQUAL, value2).thenPut(put3);<a name="line.5022"></a>
+<span class="sourceLineNo">5023</span>      assertTrue(ok);<a name="line.5023"></a>
+<span class="sourceLineNo">5024</span>    }<a name="line.5024"></a>
+<span class="sourceLineNo">5025</span>  }<a name="line.5025"></a>
+<span class="sourceLineNo">5026</span><a name="line.5026"></a>
+<span class="sourceLineNo">5027</span>  @Test<a name="line.5027"></a>
+<span class="sourceLineNo">5028</span>  public void testCheckAndDelete() throws IOException {<a name="line.5028"></a>
+<span class="sourceLineNo">5029</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.5029"></a>
 <span class="sourceLineNo">5030</span><a name="line.5030"></a>
-<span class="sourceLineNo">5031</span>      // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL<a name="line.5031"></a>
-<span class="sourceLineNo">5032</span>      // turns out "match"<a name="line.5032"></a>
-<span class="sourceLineNo">5033</span>      boolean ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5033"></a>
-<span class="sourceLineNo">5034</span>              .ifMatches(CompareOperator.GREATER, value1).thenDelete(delete);<a name="line.5034"></a>
-<span class="sourceLineNo">5035</span>      assertFalse(ok);<a name="line.5035"></a>
-<span class="sourceLineNo">5036</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5036"></a>
-<span class="sourceLineNo">5037</span>              .ifMatches(CompareOperator.EQUAL, value1).thenDelete(delete);<a name="line.5037"></a>
-<span class="sourceLineNo">5038</span>      assertFalse(ok);<a name="line.5038"></a>
-<span class="sourceLineNo">5039</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5039"></a>
-<span class="sourceLineNo">5040</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value1).thenDelete(delete);<a name="line.5040"></a>
-<span class="sourceLineNo">5041</span>      assertFalse(ok);<a name="line.5041"></a>
-<span class="sourceLineNo">5042</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5042"></a>
-<span class="sourceLineNo">5043</span>              .ifMatches(CompareOperator.LESS, value1).thenDelete(delete);<a name="line.5043"></a>
-<span class="sourceLineNo">5044</span>      assertTrue(ok);<a name="line.5044"></a>
-<span class="sourceLineNo">5045</span>      table.put(put2);<a name="line.5045"></a>
-<span class="sourceLineNo">5046</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5046"></a>
-<span class="sourceLineNo">5047</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value1).thenDelete(delete);<a name="line.5047"></a>
-<span class="sourceLineNo">5048</span>      assertTrue(ok);<a name="line.5048"></a>
-<span class="sourceLineNo">5049</span>      table.put(put2);<a name="line.5049"></a>
-<span class="sourceLineNo">5050</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5050"></a>
-<span class="sourceLineNo">5051</span>              .ifMatches(CompareOperator.NOT_EQUAL, value1).thenDelete(delete);<a name="line.5051"></a>
-<span class="sourceLineNo">5052</span>      assertTrue(ok);<a name="line.5052"></a>
+<span class="sourceLineNo">5031</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()),<a name="line.5031"></a>
+<span class="sourceLineNo">5032</span>        FAMILY)) {<a name="line.5032"></a>
+<span class="sourceLineNo">5033</span><a name="line.5033"></a>
+<span class="sourceLineNo">5034</span>      Put put = new Put(ROW);<a name="line.5034"></a>
+<span class="sourceLineNo">5035</span>      put.addColumn(FAMILY, QUALIFIER, value1);<a name="line.5035"></a>
+<span class="sourceLineNo">5036</span>      table.put(put);<a name="line.5036"></a>
+<span class="sourceLineNo">5037</span><a name="line.5037"></a>
+<span class="sourceLineNo">5038</span>      Delete delete = new Delete(ROW);<a name="line.5038"></a>
+<span class="sourceLineNo">5039</span>      delete.addColumns(FAMILY, QUALIFIER);<a name="line.5039"></a>
+<span class="sourceLineNo">5040</span><a name="line.5040"></a>
+<span class="sourceLineNo">5041</span>      boolean ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5041"></a>
+<span class="sourceLineNo">5042</span>              .ifEquals(value1).thenDelete(delete);<a name="line.5042"></a>
+<span class="sourceLineNo">5043</span>      assertTrue(ok);<a name="line.5043"></a>
+<span class="sourceLineNo">5044</span>    }<a name="line.5044"></a>
+<span class="sourceLineNo">5045</span>  }<a name="line.5045"></a>
+<span class="sourceLineNo">5046</span><a name="line.5046"></a>
+<span class="sourceLineNo">5047</span>  @Test<a name="line.5047"></a>
+<span class="sourceLineNo">5048</span>  public void testCheckAndDeleteWithCompareOp() throws IOException {<a name="line.5048"></a>
+<span class="sourceLineNo">5049</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.5049"></a>
+<span class="sourceLineNo">5050</span>    final byte [] value2 = Bytes.toBytes("bbbb");<a name="line.5050"></a>
+<span class="sourceLineNo">5051</span>    final byte [] value3 = Bytes.toBytes("cccc");<a name="line.5051"></a>
+<span class="sourceLineNo">5052</span>    final byte [] value4 = Bytes.toBytes("dddd");<a name="line.5052"></a>
 <span class="sourceLineNo">5053</span><a name="line.5053"></a>
-<span class="sourceLineNo">5054</span>      // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL<a name="line.5054"></a>
-<span class="sourceLineNo">5055</span>      // turns out "match"<a name="line.5055"></a>
-<span class="sourceLineNo">5056</span>      table.put(put3);<a name="line.5056"></a>
-<span class="sourceLineNo">5057</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5057"></a>
-<span class="sourceLineNo">5058</span>              .ifMatches(CompareOperator.LESS, value4).thenDelete(delete);<a name="line.5058"></a>
-<span class="sourceLineNo">5059</span>      assertFalse(ok);<a name="line.5059"></a>
-<span class="sourceLineNo">5060</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5060"></a>
-<span class="sourceLineNo">5061</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value4).thenDelete(delete);<a name="line.5061"></a>
-<span class="sourceLineNo">5062</span>      assertFalse(ok);<a name="line.5062"></a>
-<span class="sourceLineNo">5063</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5063"></a>
-<span class="sourceLineNo">5064</span>              .ifMatches(CompareOperator.EQUAL, value4).thenDelete(delete);<a name="line.5064"></a>
-<span class="sourceLineNo">5065</span>      assertFalse(ok);<a name="line.5065"></a>
-<span class="sourceLineNo">5066</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5066"></a>
-<span class="sourceLineNo">5067</span>              .ifMatches(CompareOperator.GREATER, value4).thenDelete(delete);<a name="line.5067"></a>
-<span class="sourceLineNo">5068</span>      assertTrue(ok);<a name="line.5068"></a>
-<span class="sourceLineNo">5069</span>      table.put(put3);<a name="line.5069"></a>
-<span class="sourceLineNo">5070</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5070"></a>
-<span class="sourceLineNo">5071</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value4).thenDelete(delete);<a name="line.5071"></a>
-<span class="sourceLineNo">5072</span>      assertTrue(ok);<a name="line.5072"></a>
-<span class="sourceLineNo">5073</span>      table.put(put3);<a name="line.5073"></a>
-<span class="sourceLineNo">5074</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5074"></a>
-<span class="sourceLineNo">5075</span>              .ifMatches(CompareOperator.NOT_EQUAL, value4).thenDelete(delete);<a name="line.5075"></a>
-<span class="sourceLineNo">5076</span>      assertTrue(ok);<a name="line.5076"></a>
-<span class="sourceLineNo">5077</span><a name="line.5077"></a>
-<span class="sourceLineNo">5078</span>      // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL<a name="line.5078"></a>
-<span class="sourceLineNo">5079</span>      // turns out "match"<a name="line.5079"></a>
-<span class="sourceLineNo">5080</span>      table.put(put2);<a name="line.5080"></a>
-<span class="sourceLineNo">5081</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5081"></a>
-<span class="sourceLineNo">5082</span>              .ifMatches(CompareOperator.GREATER, value2).thenDelete(delete);<a name="line.5082"></a>
-<span class="sourceLineNo">5083</span>      assertFalse(ok);<a name="line.5083"></a>
-<span class="sourceLineNo">5084</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5084"></a>
-<span class="sourceLineNo">5085</span>              .ifMatches(CompareOperator.NOT_EQUAL, value2).thenDelete(delete);<a name="line.5085"></a>
-<span class="sourceLineNo">5086</span>      assertFalse(ok);<a name="line.5086"></a>
-<span class="sourceLineNo">5087</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5087"></a>
-<span class="sourceLineNo">5088</span>              .ifMatches(CompareOperator.LESS, value2).thenDelete(delete);<a name="line.5088"></a>
-<span class="sourceLineNo">5089</span>      assertFalse(ok);<a name="line.5089"></a>
-<span class="sourceLineNo">5090</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5090"></a>
-<span class="sourceLineNo">5091</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value2).thenDelete(delete);<a name="line.5091"></a>
-<span class="sourceLineNo">5092</span>      assertTrue(ok);<a name="line.5092"></a>
-<span class="sourceLineNo">5093</span>      table.put(put2);<a name="line.5093"></a>
-<span class="sourceLineNo">5094</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5094"></a>
-<span class="sourceLineNo">5095</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value2).thenDelete(delete);<a name="line.5095"></a>
-<span class="sourceLineNo">5096</span>      assertTrue(ok);<a name="line.5096"></a>
-<span class="sourceLineNo">5097</span>      table.put(put2);<a name="line.5097"></a>
-<span class="sourceLineNo">5098</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5098"></a>
-<span class="sourceLineNo">5099</span>              .ifMatches(CompareOperator.EQUAL, value2).thenDelete(delete);<a name="line.5099"></a>
-<span class="sourceLineNo">5100</span>      assertTrue(ok);<a name="line.5100"></a>
-<span class="sourceLineNo">5101</span>    }<a name="line.5101"></a>
-<span class="sourceLineNo">5102</span>  }<a name="line.5102"></a>
-<span class="sourceLineNo">5103</span><a name="line.5103"></a>
-<span class="sourceLineNo">5104</span>  /**<a name="line.5104"></a>
-<span class="sourceLineNo">5105</span>  * Test ScanMetrics<a name="line.5105"></a>
-<span class="sourceLineNo">5106</span>  */<a name="line.5106"></a>
-<span class="sourceLineNo">5107</span>  @Test<a name="line.5107"></a>
-<span class="sourceLineNo">5108</span>  @SuppressWarnings ("unused")<a name="line.5108"></a>
-<span class="sourceLineNo">5109</span>  public void testScanMetrics() throws Exception {<a name="line.5109"></a>
-<span class="sourceLineNo">5110</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5110"></a>
-<span class="sourceLineNo">5111</span><a name="line.5111"></a>
-<span class="sourceLineNo">5112</span>    // Set up test table:<a name="line.5112"></a>
-<span class="sourceLineNo">5113</span>    // Create table:<a name="line.5113"></a>
-<span class="sourceLineNo">5114</span>    try (Table ht = TEST_UTIL.createMultiRegionTable(tableName, FAMILY)) {<a name="line.5114"></a>
-<span class="sourceLineNo">5115</span>      int numOfRegions = -1;<a name="line.5115"></a>
-<span class="sourceLineNo">5116</span>      try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5116"></a>
-<span class="sourceLineNo">5117</span>        numOfRegions = r.getStartKeys().length;<a name="line.5117"></a>
-<span class="sourceLineNo">5118</span>      }<a name="line.5118"></a>
-<span class="sourceLineNo">5119</span>      // Create 3 rows in the table, with rowkeys starting with "zzz*" so that<a name="line.5119"></a>
-<span class="sourceLineNo">5120</span>      // scan are forced to hit all the regions.<a name="line.5120"></a>
-<span class="sourceLineNo">5121</span>      Put put1 = new Put(Bytes.toBytes("zzz1"));<a name="line.5121"></a>
-<span class="sourceLineNo">5122</span>      put1.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5122"></a>
-<span class="sourceLineNo">5123</span>      Put put2 = new Put(Bytes.toBytes("zzz2"));<a name="line.5123"></a>
-<span class="sourceLineNo">5124</span>      put2.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5124"></a>
-<span class="sourceLineNo">5125</span>      Put put3 = new Put(Bytes.toBytes("zzz3"));<a name="line.5125"></a>
-<span class="sourceLineNo">5126</span>      put3.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5126"></a>
-<span class="sourceLineNo">5127</span>      ht.put(Arrays.asList(put1, put2, put3));<a name="line.5127"></a>
-<span class="sourceLineNo">5128</span><a name="line.5128"></a>
-<span class="sourceLineNo">5129</span>      Scan scan1 = new Scan();<a name="line.5129"></a>
-<span class="sourceLineNo">5130</span>      int numRecords = 0;<a name="line.5130"></a>
-<span class="sourceLineNo">5131</span>      try (ResultScanner scanner = ht.getScanner(scan1)) {<a name="line.5131"></a>
-<span class="sourceLineNo">5132</span>        for (Result result : scanner) {<a name="line.5132"></a>
-<span class="sourceLineNo">5133</span>          numRecords++;<a name="line.5133"></a>
-<span class="sourceLineNo">5134</span>        }<a name="line.5134"></a>
-<span class="sourceLineNo">5135</span><a name="line.5135"></a>
-<span class="sourceLineNo">5136</span>        LOG.info("test data has " + numRecords + " records.");<a name="line.5136"></a>
-<span class="sourceLineNo">5137</span><a name="line.5137"></a>
-<span class="sourceLineNo">5138</span>        // by default, scan metrics collection is turned off<a name="line.5138"></a>
-<span class="sourceLineNo">5139</span>        assertEquals(null, scanner.getScanMetrics());<a name="line.5139"></a>
-<span class="sourceLineNo">5140</span>      }<a name="line.5140"></a>
-<span class="sourceLineNo">5141</span><a name="line.5141"></a>
-<span class="sourceLineNo">5142</span>      // turn on scan metrics<a name="line.5142"></a>
-<span class="sourceLineNo">5143</span>      Scan scan2 = new Scan();<a name="line.5143"></a>
-<span class="sourceLineNo">5144</span>      scan2.setScanMetricsEnabled(true);<a name="line.5144"></a>
-<span class="sourceLineNo">5145</span>      scan2.setCaching(numRecords + 1);<a name="line.5145"></a>
-<span class="sourceLineNo">5146</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5146"></a>
-<span class="sourceLineNo">5147</span>        for (Result result : scanner.next(numRecords - 1)) {<a name="line.5147"></a>
-<span class="sourceLineNo">5148</span>        }<a name="line.5148"></a>
-<span class="sourceLineNo">5149</span>        scanner.close();<a name="line.5149"></a>
-<span class="sourceLineNo">5150</span>        // closing the scanner will set the metrics.<a name="line.5150"></a>
-<span class="sourceLineNo">5151</span>        assertNotNull(scanner.getScanMetrics());<a name="line.5151"></a>
-<span class="sourceLineNo">5152</span>      }<a name="line.5152"></a>
-<span class="sourceLineNo">5153</span><a name="line.5153"></a>
-<span class="sourceLineNo">5154</span>      // set caching to 1, because metrics are collected in each roundtrip only<a name="line.5154"></a>
-<span class="sourceLineNo">5155</span>      scan2 = new Scan();<a name="line.5155"></a>
-<span class="sourceLineNo">5156</span>      scan2.setScanMetricsEnabled(true);<a name="line.5156"></a>
-<span class="sourceLineNo">5157</span>      scan2.setCaching(1);<a name="line.5157"></a>
-<span class="sourceLineNo">5158</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5158"></a>
-<span class="sourceLineNo">5159</span>        // per HBASE-5717, this should still collect even if you don't run all the way to<a name="line.5159"></a>
-<span class="sourceLineNo">5160</span>        // the end of the scanner. So this is asking for 2 of the 3 rows we inserted.<a name="line.5160"></a>
-<span class="sourceLineNo">5161</span>        for (Result result : scanner.next(numRecords - 1)) {<a name="line.5161"></a>
-<span class="sourceLineNo">5162</span>        }<a name="line.5162"></a>
-<span class="sourceLineNo">5163</span><a name="line.5163"></a>
-<span class="sourceLineNo">5164</span>        ScanMetrics scanMetrics = scanner.getScanMetrics();<a name="line.5164"></a>
-<span class="sourceLineNo">5165</span>        assertEquals("Did not access all the regions in the table", numOfRegions,<a name="line.5165"></a>
-<span class="sourceLineNo">5166</span>                scanMetrics.countOfRegions.get());<a name="line.5166"></a>
-<span class="sourceLineNo">5167</span>      }<a name="line.5167"></a>
-<span class="sourceLineNo">5168</span><a name="line.5168"></a>
-<span class="sourceLineNo">5169</span>      // check byte counters<a name="line.5169"></a>
-<span class="sourceLineNo">5170</span>      scan2 = new Scan();<a name="line.5170"></a>
-<span class="sourceLineNo">5171</span>      scan2.setScanMetricsEnabled(true);<a name="line.5171"></a>
-<span class="sourceLineNo">5172</span>      scan2.setCaching(1);<a name="line.5172"></a>
-<span class="sourceLineNo">5173</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5173"></a>
-<span class="sourceLineNo">5174</span>        int numBytes = 0;<a name="line.5174"></a>
-<span class="sourceLineNo">5175</span>        for (Result result : scanner.next(1)) {<a name="line.5175"></a>
-<span class="sourceLineNo">5176</span>          for (Cell cell : result.listCells()) {<a name="line.5176"></a>
-<span class="sourceLineNo">5177</span>            numBytes += PrivateCellUtil.estimatedSerializedSizeOf(cell);<a name="line.5177"></a>
-<span class="sourceLineNo">5178</span>          }<a name="line.5178"></a>
-<span class="sourceLineNo">5179</span>        }<a name="line.5179"></a>
-<span class="sourceLineNo">5180</span>        scanner.close();<a name="line.5180"></a>
-<span class="sourceLineNo">5181</span>        ScanMetrics scanMetrics = scanner.getScanMetrics();<a name="line.5181"></a>
-<span class="sourceLineNo">5182</span>        assertEquals("Did not count the result bytes", numBytes,<a name="line.5182"></a>
-<span class="sourceLineNo">5183</span>                scanMetrics.countOfBytesInResults.get());<a name="line.5183"></a>
-<span class="sourceLineNo">5184</span>      }<a name="line.5184"></a>
-<span class="sourceLineNo">5185</span><a name="line.5185"></a>
-<span class="sourceLineNo">5186</span>      // check byte counters on a small scan<a name="line.5186"></a>
-<span class="sourceLineNo">5187</span>      scan2 = new Scan();<a name="line.5187"></a>
-<span class="sourceLineNo">5188</span>      scan2.setScanMetricsEnabled(true);<a name="line.5188"></a>
-<span class="sourceLineNo">5189</span>      scan2.setCaching(1);<a name="line.5189"></a>
-<span class="sourceLineNo">5190</span>      scan2.setSmall(true);<a name="line.5190"></a>
-<span class="sourceLineNo">5191</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5191"></a>
-<span class="sourceLineNo">5192</span>        int numBytes = 0;<a name="line.5192"></a>
-<span class="sourceLineNo">5193</span>        for (Result result : scanner.next(1)) {<a name="line.5193"></a>
-<span class="sourceLineNo">5194</span>          for (Cell cell : result.listCells()) {<a name="line.5194"></a>
-<span class="sourceLineNo">5195</span>            numBytes += PrivateCellUtil.estimatedSerializedSizeOf(cell);<a name="line.5195"></a>
-<span class="sourceLineNo">5196</span>          }<a name="line.5196"></a>
-<span class="sourceLineNo">5197</span>        }<a name="line.5197"></a>
-<span class="sourceLineNo">5198</span>        scanner.close();<a name="line.5198"></a>
-<span class="sourceLineNo">5199</span>        ScanMetrics scanMetrics = scanner.getScanMetrics();<a name="line.5199"></a>
-<span class="sourceLineNo">5200</span>        assertEquals("Did not count the result bytes", numBytes,<a name="line.5200"></a>
-<span class="sourceLineNo">5201</span>                scanMetrics.countOfBytesInResults.get());<a name="line.5201"></a>
-<span class="sourceLineNo">5202</span>      }<a name="line.5202"></a>
-<span class="sourceLineNo">5203</span><a name="line.5203"></a>
-<span class="sourceLineNo">5204</span>      // now, test that the metrics are still collected even if you don't call close, but do<a name="line.5204"></a>
-<span class="sourceLineNo">5205</span>      // run past the end of all the records<a name="line.5205"></a>
-<span class="sourceLineNo">5206</span>      /** There seems to be a timing issue here.  Comment out for now. Fix when time.<a name="line.5206"></a>
-<span class="sourceLineNo">5207</span>       Scan scanWithoutClose = new Scan();<a name="line.5207"></a>
-<span class="sourceLineNo">5208</span>       scanWithoutClose.setCaching(1);<a name="line.5208"></a>
-<span class="sourceLineNo">5209</span>       scanWithoutClose.setScanMetricsEnabled(true);<a name="line.5209"></a>
-<span class="sourceLineNo">5210</span>       ResultScanner scannerWithoutClose = ht.getScanner(scanWithoutClose);<a name="line.5210"></a>
-<span class="sourceLineNo">5211</span>       for (Result result : scannerWithoutClose.next(numRecords + 1)) {<a name="line.5211"></a>
-<span class="sourceLineNo">5212</span>       }<a name="line.5212"></a>
-<span class="sourceLineNo">5213</span>       ScanMetrics scanMetricsWithoutClose = getScanMetrics(scanWithoutClose);<a name="line.5213"></a>
-<span class="sourceLineNo">5214</span>       assertEquals("Did not access all the regions in the table", numOfRegions,<a name="line.5214"></a>
-<span class="sourceLineNo">5215</span>       scanMetricsWithoutClose.countOfRegions.get());<a name="line.5215"></a>
-<span class="sourceLineNo">5216</span>       */<a name="line.5216"></a>
-<span class="sourceLineNo">5217</span><a name="line.5217"></a>
-<span class="sourceLineNo">5218</span>      // finally,<a name="line.5218"></a>
-<span class="sourceLineNo">5219</span>      // test that the metrics are collected correctly if you both run past all the records,<a name="line.5219"></a>
-<span class="sourceLineNo">5220</span>      // AND close the scanner<a name="line.5220"></a>
-<span class="sourceLineNo">5221</span>      Scan scanWithClose = new Scan();<a name="line.5221"></a>
-<span class="sourceLineNo">5222</span>      // make sure we can set caching up to the number of a scanned values<a name="line.5222"></a>
-<span class="sourceLineNo">5223</span>      scanWithClose.setCaching(numRecords);<a name="line.5223"></a>
-<span class="sourceLineNo">5224</span>      scanWithClose.setScanMetricsEnabled(true);<a name="line.5224"></a>
-<span class="sourceLineNo">5225</span>      try (ResultScanner scannerWithClose = ht.getScanner(scanWithClose)) {<a name="line.5225"></a>
-<span class="sourceLineNo">5226</span>        for (Result result : scannerWithClose.next(numRecords + 1)) {<a name="line.5226"></a>
-<span class="sourceLineNo">5227</span>        }<a name="line.5227"></a>
-<span class="sourceLineNo">5228</span>        scannerWithClose.close();<a name="line.5228"></a>
-<span class="sourceLineNo">5229</span>        ScanMetrics scanMetricsWithClose = scannerWithClose.getScanMetrics();<a name="line.5229"></a>
-<span class="sourceLineNo">5230</span>        assertEquals("Did not access all the regions in the table", numOfRegions,<a name="line.5230"></a>
-<span class="sourceLineNo">5231</span>                scanMetricsWithClose.countOfRegions.get());<a name="line.5231"></a>
-<span class="sourceLineNo">5232</span>      }<a name="line.5232"></a>
-<span class="sourceLineNo">5233</span>    }<a name="line.5233"></a>
-<span class="sourceLineNo">5234</span>  }<a name="line.5234"></a>
-<span class="sourceLineNo">5235</span><a name="line.5235"></a>
-<span class="sourceLineNo">5236</span>  /**<a name="line.5236"></a>
-<span class="sourceLineNo">5237</span>   * Tests that cache on write works all the way up from the client-side.<a name="line.5237"></a>
-<span class="sourceLineNo">5238</span>   *<a name="line.5238"></a>
-<span class="sourceLineNo">5239</span>   * Performs inserts, flushes, and compactions, verifying changes in the block<a name="line.5239"></a>
-<span class="sourceLineNo">5240</span>   * cache along the way.<a name="line.5240"></a>
-<span class="sourceLineNo">5241</span>   */<a name="line.5241"></a>
-<span class="sourceLineNo">5242</span>  @Test<a name="line.5242"></a>
-<span class="sourceLineNo">5243</span>  public void testCacheOnWriteEvictOnClose() throws Exception {<a name="line.5243"></a>
-<span class="sourceLineNo">5244</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5244"></a>
-<span class="sourceLineNo">5245</span>    byte [] data = Bytes.toBytes("data");<a name="line.5245"></a>
-<span class="sourceLineNo">5246</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5246"></a>
-<span class="sourceLineNo">5247</span>      try (RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5247"></a>
-<span class="sourceLineNo">5248</span>        // get the block cache and region<a name="line.5248"></a>
-<span class="sourceLineNo">5249</span>        String regionName = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.5249"></a>
-<span class="sourceLineNo">5250</span><a name="line.5250"></a>
-<span class="sourceLineNo">5251</span>        HRegion region = TEST_UTIL.getRSForFirstRegionInTable(tableName)<a name="line.5251"></a>
-<span class="sourceLineNo">5252</span>                .getRegion(regionName);<a name="line.5252"></a>
-<span class="sourceLineNo">5253</span>        HStore store = region.getStores().iterator().next();<a name="line.5253"></a>
-<span class="sourceLineNo">5254</span>        CacheConfig cacheConf = store.getCacheConfig();<a name="line.5254"></a>
-<span class="sourceLineNo">5255</span>        cacheConf.setCacheDataOnWrite(true);<a name="line.5255"></a>
-<span class="sourceLineNo">5256</span>        cacheConf.setEvictOnClose(true);<a name="line.5256"></a>
-<span class="sourceLineNo">5257</span>        BlockCache cache = cacheConf.getBlockCache().get();<a name="line.5257"></a>
-<span class="sourceLineNo">5258</span><a name="line.5258"></a>
-<span class="sourceLineNo">5259</span>        // establish baseline stats<a name="line.5259"></a>
-<span class="sourceLineNo">5260</span>        long startBlockCount = cache.getBlockCount();<a name="line.5260"></a>
-<span class="sourceLineNo">5261</span>        long startBlockHits = cache.getStats().getHitCount();<a name="line.5261"></a>
-<span class="sourceLineNo">5262</span>        long startBlockMiss = cache.getStats().getMissCount();<a name="line.5262"></a>
-<span class="sourceLineNo">5263</span><a name="line.5263"></a>
-<span class="sourceLineNo">5264</span>        // wait till baseline is stable, (minimal 500 ms)<a name="line.5264"></a>
-<span class="sourceLineNo">5265</span>        for (int i = 0; i &lt; 5; i++) {<a name="line.5265"></a>
-<span class="sourceLineNo">5266</span>          Thread.sleep(100);<a name="line.5266"></a>
-<span class="sourceLineNo">5267</span>          if (startBlockCount != cache.getBlockCount()<a name="line.5267"></a>
-<span class="sourceLineNo">5268</span>                  || startBlockHits != cache.getStats().getHitCount()<a name="line.5268"></a>
-<span class="sourceLineNo">5269</span>                  || startBlockMiss != cache.getStats().getMissCount()) {<a name="line.5269"></a>
-<span class="sourceLineNo">5270</span>            startBlockCount = cache.getBlockCount();<a name="line.5270"></a>
-<span class="sourceLineNo">5271</span>            startBlockHits = cache.getStats().getHitCount();<a name="line.5271"></a>
-<span class="sourceLineNo">5272</span>            startBlockMiss = cache.getStats().getMissCount();<a name="line.5272"></a>
-<span class="sourceLineNo">5273</span>            i = -1;<a name="line.5273"></a>
-<span class="sourceLineNo">5274</span>          }<a name="line.5274"></a>
-<span class="sourceLineNo">5275</span>        }<a name="line.5275"></a>
-<span class="sourceLineNo">5276</span><a name="line.5276"></a>
-<span class="sourceLineNo">5277</span>        // insert data<a name="line.5277"></a>
-<span class="sourceLineNo">5278</span>        Put put = new Put(ROW);<a name="line.5278"></a>
-<span class="sourceLineNo">5279</span>        put.addColumn(FAMILY, QUALIFIER, data);<a name="line.5279"></a>
-<span class="sourceLineNo">5280</span>        table.put(put);<a name="line.5280"></a>
-<span class="sourceLineNo">5281</span>        assertTrue(Bytes.equals(table.get(new Get(ROW)).value(), data));<a name="line.5281"></a>
-<span class="sourceLineNo">5282</span>        // data was in memstore so don't expect any changes<a name="line.5282"></a>
-<span class="sourceLineNo">5283</span>        assertEquals(startBlockCount, cache.getBlockCount());<a name="line.5283"></a>
-<span class="sourceLineNo">5284</span>        assertEquals(startBlockHits, cache.getStats().getHitCount());<a name="line.5284"></a>
-<span class="sourceLineNo">5285</span>        assertEquals(startBlockMiss, cache.getStats().getMissCount());<a name="line.5285"></a>
-<span class="sourceLineNo">5286</span>        // flush the data<a name="line.5286"></a>
-<span class="sourceLineNo">5287</span>        System.out.println("Flushing cache");<a name="line.5287"></a>
-<span class="sourceLineNo">5288</span>        region.flush(true);<a name="line.5288"></a>
-<span class="sourceLineNo">5289</span>        // expect one more block in cache, no change in hits/misses<a name="line.5289"></a>
-<span class="sourceLineNo">5290</span>        long expectedBlockCount = startBlockCount + 1;<a name="line.5290"></a>
-<span class="sourceLineNo">5291</span>        long expectedBlockHits = startBlockHits;<a name="line.5291"></a>
-<span class="sourceLineNo">5292</span>        long expectedBlockMiss = startBlockMiss;<a name="line.5292"></a>
-<span class="sourceLineNo">5293</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5293"></a>
-<span class="sourceLineNo">5294</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5294"></a>
-<span class="sourceLineNo">5295</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5295"></a>
-<span class="sourceLineNo">5296</span>        // read the data and expect same blocks, one new hit, no misses<a name="line.5296"></a>
-<span class="sourceLineNo">5297</span>        assertTrue(Bytes.equals(table.get(new Get(ROW)).value(), data));<a name="line.5297"></a>
-<span class="sourceLineNo">5298</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5298"></a>
-<span class="sourceLineNo">5299</span>        assertEquals(++expectedBlockHits, cache.getStats().getHitCount());<a name="line.5299"></a>
-<span class="sourceLineNo">5300</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5300"></a>
-<span class="sourceLineNo">5301</span>        // insert a second column, read the row, no new blocks, one new hit<a name="line.5301"></a>
-<span class="sourceLineNo">5302</span>        byte[] QUALIFIER2 = Bytes.add(QUALIFIER, QUALIFIER);<a name="line.5302"></a>
-<span class="sourceLineNo">5303</span>        byte[] data2 = Bytes.add(data, data);<a name="line.5303"></a>
-<span class="sourceLineNo">5304</span>        put = new Put(ROW);<a name="line.5304"></a>
-<span class="sourceLineNo">5305</span>        put.addColumn(FAMILY, QUALIFIER2, data2);<a name="line.5305"></a>
-<span class="sourceLineNo">5306</span>        table.put(put);<a name="line.5306"></a>
-<span class="sourceLineNo">5307</span>        Result r = table.get(new Get(ROW));<a name="line.5307"></a>
-<span class="sourceLineNo">5308</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER), data));<a name="line.5308"></a>
-<span class="sourceLineNo">5309</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER2), data2));<a name="line.5309"></a>
-<span class="sourceLineNo">5310</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5310"></a>
-<span class="sourceLineNo">5311</span>        assertEquals(++expectedBlockHits, cache.getStats().getHitCount());<a name="line.5311"></a>
-<span class="sourceLineNo">5312</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5312"></a>
-<span class="sourceLineNo">5313</span>        // flush, one new block<a name="line.5313"></a>
-<span class="sourceLineNo">5314</span>        System.out.println("Flushing cache");<a name="line.5314"></a>
-<span class="sourceLineNo">5315</span>        region.flush(true);<a name="line.5315"></a>
-<span class="sourceLineNo">5316</span>        assertEquals(++expectedBlockCount, cache.getBlockCount());<a name="line.5316"></a>
-<span class="sourceLineNo">5317</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5317"></a>
-<span class="sourceLineNo">5318</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5318"></a>
-<span class="sourceLineNo">5319</span>        // compact, net minus two blocks, two hits, no misses<a name="line.5319"></a>
-<span class="sourceLineNo">5320</span>        System.out.println("Compacting");<a name="line.5320"></a>
-<span class="sourceLineNo">5321</span>        assertEquals(2, store.getStorefilesCount());<a name="line.5321"></a>
-<span class="sourceLineNo">5322</span>        store.triggerMajorCompaction();<a name="line.5322"></a>
-<span class="sourceLineNo">5323</span>        region.compact(true);<a name="line.5323"></a>
-<span class="sourceLineNo">5324</span>        store.closeAndArchiveCompactedFiles();<a name="line.5324"></a>
-<span class="sourceLineNo">5325</span>        waitForStoreFileCount(store, 1, 10000); // wait 10 seconds max<a name="line.5325"></a>
-<span class="sourceLineNo">5326</span>        assertEquals(1, store.getStorefilesCount());<a name="line.5326"></a>
-<span class="sourceLineNo">5327</span>        expectedBlockCount -= 2; // evicted two blocks, cached none<a name="line.5327"></a>
-<span class="sourceLineNo">5328</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5328"></a>
-<span class="sourceLineNo">5329</span>        expectedBlockHits += 2;<a name="line.5329"></a>
-<span class="sourceLineNo">5330</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5330"></a>
-<span class="sourceLineNo">5331</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5331"></a>
-<span class="sourceLineNo">5332</span>        // read the row, this should be a cache miss because we don't cache data<a name="line.5332"></a>
-<span class="sourceLineNo">5333</span>        // blocks on compaction<a name="line.5333"></a>
-<span class="sourceLineNo">5334</span>        r = table.get(new Get(ROW));<a name="line.5334"></a>
-<span class="sourceLineNo">5335</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER), data));<a name="line.5335"></a>
-<span class="sourceLineNo">5336</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER2), data2));<a name="line.5336"></a>
-<span class="sourceLineNo">5337</span>        expectedBlockCount += 1; // cached one data block<a name="line.5337"></a>
-<span class="sourceLineNo">5338</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5338"></a>
-<span class="sourceLineNo">5339</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5339"></a>
-<span class="sourceLineNo">5340</span>        assertEquals(++expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5340"></a>
-<span class="sourceLineNo">5341</span>      }<a name="line.5341"></a>
-<span class="sourceLineNo">5342</span>    }<a name="line.5342"></a>
-<span class="sourceLineNo">5343</span>  }<a name="line.5343"></a>
-<span class="sourceLineNo">5344</span><a name="line.5344"></a>
-<span class="sourceLineNo">5345</span>  private void waitForStoreFileCount(HStore store, int count, int timeout)<a name="line.5345"></a>
-<span class="sourceLineNo">5346</span>      throws InterruptedException {<a name="line.5346"></a>
-<span class="sourceLineNo">5347</span>    long start = System.currentTimeMillis();<a name="line.5347"></a>
-<span class="sourceLineNo">5348</span>    while (start + timeout &gt; System.currentTimeMillis() &amp;&amp; store.getStorefilesCount() != count) {<a name="line.5348"></a>
-<span class="sourceLineNo">5349</span>      Thread.sleep(100);<a name="line.5349"></a>
-<span class="sourceLineNo">5350</span>    }<a name="line.5350"></a>
-<span class="sourceLineNo">5351</span>    System.out.println("start=" + start + ", now=" + System.currentTimeMillis() + ", cur=" +<a name="line.5351"></a>
-<span class="sourceLineNo">5352</span>        store.getStorefilesCount());<a name="line.5352"></a>
-<span class="sourceLineNo">5353</span>    assertEquals(count, store.getStorefilesCount());<a name="line.5353"></a>
-<span class="sourceLineNo">5354</span>  }<a name="line.5354"></a>
-<span class="sourceLineNo">5355</span><a name="line.5355"></a>
-<span class="sourceLineNo">5356</span>  @Test<a name="line.5356"></a>
-<span class="sourceLineNo">5357</span>  /**<a name="line.5357"></a>
-<span class="sourceLineNo">5358</span>   * Tests the non cached version of getRegionLocator by moving a region.<a name="line.5358"></a>
-<span class="sourceLineNo">5359</span>   */<a name="line.5359"></a>
-<span class="sourceLineNo">5360</span>  public void testNonCachedGetRegionLocation() throws Exception {<a name="line.5360"></a>
-<span class="sourceLineNo">5361</span>    // Test Initialization.<a name="line.5361"></a>
-<span class="sourceLineNo">5362</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5362"></a>
-<span class="sourceLineNo">5363</span>    byte [] family1 = Bytes.toBytes("f1");<a name="line.5363"></a>
-<span class="sourceLineNo">5364</span>    byte [] family2 = Bytes.toBytes("f2");<a name="line.5364"></a>
-<span class="sourceLineNo">5365</span>    try (Table table = TEST_UTIL.createTable(tableName, new byte[][] {family1, family2}, 10);<a name="line.5365"></a>
-<span class="sourceLineNo">5366</span>        Admin admin = TEST_UTIL.getAdmin();<a name="line.5366"></a>
-<span class="sourceLineNo">5367</span>        RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5367"></a>
-<span class="sourceLineNo">5368</span>      List&lt;HRegionLocation&gt; allRegionLocations = locator.getAllRegionLocations();<a name="line.5368"></a>
-<span class="sourceLineNo">5369</span>      assertEquals(1, allRegionLocations.size());<a name="line.5369"></a>
-<span class="sourceLineNo">5370</span>      RegionInfo regionInfo = allRegionLocations.get(0).getRegion();<a name="line.5370"></a>
-<span class="sourceLineNo">5371</span>      ServerName addrBefore = allRegionLocations.get(0).getServerName();<a name="line.5371"></a>
-<span class="sourceLineNo">5372</span>      // Verify region location before move.<a name="line.5372"></a>
-<span class="sourceLineNo">5373</span>      HRegionLocation addrCache = locator.getRegionLocation(regionInfo.getStartKey(), false);<a name="line.5373"></a>
-<span class="sourceLineNo">5374</span>      HRegionLocation addrNoCache = locator.getRegionLocation(regionInfo.getStartKey(),  true);<a name="line.5374"></a>
-<span class="sourceLineNo">5375</span><a name="line.5375"></a>
-<span class="sourceLineNo">5376</span>      assertEquals(addrBefore.getPort(), addrCache.getPort());<a name="line.5376"></a>
-<span class="sourceLineNo">5377</span>      assertEquals(addrBefore.getPort(), addrNoCache.getPort());<a name="line.5377"></a>
-<span class="sourceLineNo">5378</span><a name="line.5378"></a>
-<span class="sourceLineNo">5379</span>      ServerName addrAfter = null;<a name="line.5379"></a>
-<span class="sourceLineNo">5380</span>      // Now move the region to a different server.<a name="line.5380"></a>
-<span class="sourceLineNo">5381</span>      for (int i = 0; i &lt; SLAVES; i++) {<a name="line.5381"></a>
-<span class="sourceLineNo">5382</span>        HRegionServer regionServer = TEST_UTIL.getHBaseCluster().getRegionServer(i);<a name="line.5382"></a>
-<span class="sourceLineNo">5383</span>        ServerName addr = regionServer.getServerName();<a name="line.5383"></a>
-<span class="sourceLineNo">5384</span>        if (addr.getPort() != addrBefore.getPort()) {<a name="line.5384"></a>
-<span class="sourceLineNo">5385</span>          admin.move(regionInfo.getEncodedNameAsBytes(), addr);<a name="line.5385"></a>
-<span class="sourceLineNo">5386</span>          // Wait for the region to move.<a name="line.5386"></a>
-<span class="sourceLineNo">5387</span>          Thread.sleep(5000);<a name="line.5387"></a>
-<span class="sourceLineNo">5388</span>          addrAfter = addr;<a name="line.5388"></a>
-<span class="sourceLineNo">5389</span>          break;<a name="line.5389"></a>
-<span class="sourceLineNo">5390</span>        }<a name="line.5390"></a>
-<span class="sourceLineNo">5391</span>      }<a name="line.5391"></a>
-<span class="sourceLineNo">5392</span><a name="line.5392"></a>
-<span class="sourceLineNo">5393</span>      // Verify the region was moved.<a name="line.5393"></a>
-<span class="sourceLineNo">5394</span>      addrCache = locator.getRegionLocation(regionInfo.getStartKey(), false);<a name="line.5394"></a>
-<span class="sourceLineNo">5395</span>      addrNoCache = locator.getRegionLocation(regionInfo.getStartKey(), true);<a name="line.5395"></a>
-<span class="sourceLineNo">5396</span>      assertNotNull(addrAfter);<a name="line.5396"></a>
-<span class="sourceLineNo">5397</span>      assertTrue(addrAfter.getPort() != addrCache.getPort());<a name="line.5397"></a>
-<span class="sourceLineNo">5398</span>      assertEquals(addrAfter.getPort(), addrNoCache.getPort());<a name="line.5398"></a>
-<span class="sourceLineNo">5399</span>    }<a name="line.5399"></a>
-<span class="sourceLineNo">5400</span>  }<a name="line.5400"></a>
-<span class="sourceLineNo">5401</span><a name="line.5401"></a>
-<span class="sourceLineNo">5402</span>  @Test<a name="line.5402"></a>
-<span class="sourceLineNo">5403</span>  /**<a name="line.5403"></a>
-<span class="sourceLineNo">5404</span>   * Tests getRegionsInRange by creating some regions over which a range of<a name="line.5404"></a>
-<span class="sourceLineNo">5405</span>   * keys spans; then changing the key range.<a name="line.5405"></a>
-<span class="sourceLineNo">5406</span>   */<a name="line.5406"></a>
-<span class="sourceLineNo">5407</span>  public void testGetRegionsInRange() throws Exception {<a name="line.5407"></a>
-<span class="sourceLineNo">5408</span>    // Test Initialization.<a name="line.5408"></a>
-<span class="sourceLineNo">5409</span>    byte [] startKey = Bytes.toBytes("ddc");<a name="line.5409"></a>
-<span class="sourceLineNo">5410</span>    byte [] endKey = Bytes.toBytes("mmm");<a name="line.5410"></a>
-<span class="sourceLineNo">5411</span>    TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5411"></a>
-<span class="sourceLineNo">5412</span>    TEST_UTIL.createMultiRegionTable(tableName, new byte[][] { FAMILY }, 10);<a name="line.5412"></a>
-<span class="sourceLineNo">5413</span><a name="line.5413"></a>
-<span class="sourceLineNo">5414</span>    int numOfRegions = -1;<a name="line.5414"></a>
-<span class="sourceLineNo">5415</span>    try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5415"></a>
-<span class="sourceLineNo">5416</span>      numOfRegions = r.getStartKeys().length;<a name="line.5416"></a>
-<span class="sourceLineNo">5417</span>    }<a name="line.5417"></a>
-<span class="sourceLineNo">5418</span>    assertEquals(26, numOfRegions);<a name="line.5418"></a>
-<span class="sourceLineNo">5419</span><a name="line.5419"></a>
-<span class="sourceLineNo">5420</span>    // Get the regions in this range<a name="line.5420"></a>
-<span class="sourceLineNo">5421</span>    List&lt;HRegionLocation&gt; regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5421"></a>
-<span class="sourceLineNo">5422</span>    assertEquals(10, regionsList.size());<a name="line.5422"></a>
-<span class="sourceLineNo">5423</span><a name="line.5423"></a>
-<span class="sourceLineNo">5424</span>    // Change the start key<a name="line.5424"></a>
-<span class="sourceLineNo">5425</span>    startKey = Bytes.toBytes("fff");<a name="line.5425"></a>
-<span class="sourceLineNo">5426</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5426"></a>
-<span class="sourceLineNo">5427</span>    assertEquals(7, regionsList.size());<a name="line.5427"></a>
+<span class="sourceLineNo">5054</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()),<a name="line.5054"></a>
+<span class="sourceLineNo">5055</span>        FAMILY)) {<a name="line.5055"></a>
+<span class="sourceLineNo">5056</span><a name="line.5056"></a>
+<span class="sourceLineNo">5057</span>      Put put2 = new Put(ROW);<a name="line.5057"></a>
+<span class="sourceLineNo">5058</span>      put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.5058"></a>
+<span class="sourceLineNo">5059</span>      table.put(put2);<a name="line.5059"></a>
+<span class="sourceLineNo">5060</span><a name="line.5060"></a>
+<span class="sourceLineNo">5061</span>      Put put3 = new Put(ROW);<a name="line.5061"></a>
+<span class="sourceLineNo">5062</span>      put3.addColumn(FAMILY, QUALIFIER, value3);<a name="line.5062"></a>
+<span class="sourceLineNo">5063</span><a name="line.5063"></a>
+<span class="sourceLineNo">5064</span>      Delete delete = new Delete(ROW);<a name="line.5064"></a>
+<span class="sourceLineNo">5065</span>      delete.addColumns(FAMILY, QUALIFIER);<a name="line.5065"></a>
+<span class="sourceLineNo">5066</span><a name="line.5066"></a>
+<span class="sourceLineNo">5067</span>      // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL<a name="line.5067"></a>
+<span class="sourceLineNo">5068</span>      // turns out "match"<a name="line.5068"></a>
+<span class="sourceLineNo">5069</span>      boolean ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5069"></a>
+<span class="sourceLineNo">5070</span>              .ifMatches(CompareOperator.GREATER, value1).thenDelete(delete);<a name="line.5070"></a>
+<span class="sourceLineNo">5071</span>      assertFalse(ok);<a name="line.5071"></a>
+<span class="sourceLineNo">5072</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5072"></a>
+<span class="sourceLineNo">5073</span>              .ifMatches(CompareOperator.EQUAL, value1).thenDelete(delete);<a name="line.5073"></a>
+<span class="sourceLineNo">5074</span>      assertFalse(ok);<a name="line.5074"></a>
+<span class="sourceLineNo">5075</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5075"></a>
+<span class="sourceLineNo">5076</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value1).thenDelete(delete);<a name="line.5076"></a>
+<span class="sourceLineNo">5077</span>      assertFalse(ok);<a name="line.5077"></a>
+<span class="sourceLineNo">5078</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5078"></a>
+<span class="sourceLineNo">5079</span>              .ifMatches(CompareOperator.LESS, value1).thenDelete(delete);<a name="line.5079"></a>
+<span class="sourceLineNo">5080</span>      assertTrue(ok);<a name="line.5080"></a>
+<span class="sourceLineNo">5081</span>      table.put(put2);<a name="line.5081"></a>
+<span class="sourceLineNo">5082</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5082"></a>
+<span class="sourceLineNo">5083</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value1).thenDelete(delete);<a name="line.5083"></a>
+<span class="sourceLineNo">5084</span>      assertTrue(ok);<a name="line.5084"></a>
+<span class="sourceLineNo">5085</span>      table.put(put2);<a name="line.5085"></a>
+<span class="sourceLineNo">5086</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5086"></a>
+<span class="sourceLineNo">5087</span>              .ifMatches(CompareOperator.NOT_EQUAL, value1).thenDelete(delete);<a name="line.5087"></a>
+<span class="sourceLineNo">5088</span>      assertTrue(ok);<a name="line.5088"></a>
+<span class="sourceLineNo">5089</span><a name="line.5089"></a>
+<span class="sourceLineNo">5090</span>      // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL<a name="line.5090"></a>
+<span class="sourceLineNo">5091</span>      // turns out "match"<a name="line.5091"></a>
+<span class="sourceLineNo">5092</span>      table.put(put3);<a name="line.5092"></a>
+<span class="sourceLineNo">5093</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5093"></a>
+<span class="sourceLineNo">5094</span>              .ifMatches(CompareOperator.LESS, value4).thenDelete(delete);<a name="line.5094"></a>
+<span class="sourceLineNo">5095</span>      assertFalse(ok);<a name="line.5095"></a>
+<span class="sourceLineNo">5096</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5096"></a>
+<span class="sourceLineNo">5097</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value4).thenDelete(delete);<a name="line.5097"></a>
+<span class="sourceLineNo">5098</span>      assertFalse(ok);<a name="line.5098"></a>
+<span class="sourceLineNo">5099</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5099"></a>
+<span class="sourceLineNo">5100</span>              .ifMatches(CompareOperator.EQUAL, value4).thenDelete(delete);<a name="line.5100"></a>
+<span class="sourceLineNo">5101</span>      assertFalse(ok);<a name="line.5101"></a>
+<span class="sourceLineNo">5102</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5102"></a>
+<span class="sourceLineNo">5103</span>              .ifMatches(CompareOperator.GREATER, value4).thenDelete(delete);<a name="line.5103"></a>
+<span class="sourceLineNo">5104</span>      assertTrue(ok);<a name="line.5104"></a>
+<span class="sourceLineNo">5105</span>      table.put(put3);<a name="line.5105"></a>
+<span class="sourceLineNo">5106</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5106"></a>
+<span class="sourceLineNo">5107</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value4).thenDelete(delete);<a name="line.5107"></a>
+<span class="sourceLineNo">5108</span>      assertTrue(ok);<a name="line.5108"></a>
+<span class="sourceLineNo">5109</span>      table.put(put3);<a name="line.5109"></a>
+<span class="sourceLineNo">5110</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5110"></a>
+<span class="sourceLineNo">5111</span>              .ifMatches(CompareOperator.NOT_EQUAL, value4).thenDelete(delete);<a name="line.5111"></a>
+<span class="sourceLineNo">5112</span>      assertTrue(ok);<a name="line.5112"></a>
+<span class="sourceLineNo">5113</span><a name="line.5113"></a>
+<span class="sourceLineNo">5114</span>      // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL<a name="line.5114"></a>
+<span class="sourceLineNo">5115</span>      // turns out "match"<a name="line.5115"></a>
+<span class="sourceLineNo">5116</span>      table.put(put2);<a name="line.5116"></a>
+<span class="sourceLineNo">5117</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5117"></a>
+<span class="sourceLineNo">5118</span>              .ifMatches(CompareOperator.GREATER, value2).thenDelete(delete);<a name="line.5118"></a>
+<span class="sourceLineNo">5119</span>      assertFalse(ok);<a name="line.5119"></a>
+<span class="sourceLineNo">5120</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5120"></a>
+<span class="sourceLineNo">5121</span>              .ifMatches(CompareOperator.NOT_EQUAL, value2).thenDelete(delete);<a name="line.5121"></a>
+<span class="sourceLineNo">5122</span>      assertFalse(ok);<a name="line.5122"></a>
+<span class="sourceLineNo">5123</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5123"></a>
+<span class="sourceLineNo">5124</span>              .ifMatches(CompareOperator.LESS, value2).thenDelete(delete);<a name="line.5124"></a>
+<span class="sourceLineNo">5125</span>      assertFalse(ok);<a name="line.5125"></a>
+<span class="sourceLineNo">5126</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5126"></a>
+<span class="sourceLineNo">5127</span>              .ifMatches(CompareOperator.GREATER_OR_EQUAL, value2).thenDelete(delete);<a name="line.5127"></a>
+<span class="sourceLineNo">5128</span>      assertTrue(ok);<a name="line.5128"></a>
+<span class="sourceLineNo">5129</span>      table.put(put2);<a name="line.5129"></a>
+<span class="sourceLineNo">5130</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5130"></a>
+<span class="sourceLineNo">5131</span>              .ifMatches(CompareOperator.LESS_OR_EQUAL, value2).thenDelete(delete);<a name="line.5131"></a>
+<span class="sourceLineNo">5132</span>      assertTrue(ok);<a name="line.5132"></a>
+<span class="sourceLineNo">5133</span>      table.put(put2);<a name="line.5133"></a>
+<span class="sourceLineNo">5134</span>      ok = table.checkAndMutate(ROW, FAMILY).qualifier(QUALIFIER)<a name="line.5134"></a>
+<span class="sourceLineNo">5135</span>              .ifMatches(CompareOperator.EQUAL, value2).thenDelete(delete);<a name="line.5135"></a>
+<span class="sourceLineNo">5136</span>      assertTrue(ok);<a name="line.5136"></a>
+<span class="sourceLineNo">5137</span>    }<a name="line.5137"></a>
+<span class="sourceLineNo">5138</span>  }<a name="line.5138"></a>
+<span class="sourceLineNo">5139</span><a name="line.5139"></a>
+<span class="sourceLineNo">5140</span>  /**<a name="line.5140"></a>
+<span class="sourceLineNo">5141</span>  * Test ScanMetrics<a name="line.5141"></a>
+<span class="sourceLineNo">5142</span>  */<a name="line.5142"></a>
+<span class="sourceLineNo">5143</span>  @Test<a name="line.5143"></a>
+<span class="sourceLineNo">5144</span>  @SuppressWarnings ("unused")<a name="line.5144"></a>
+<span class="sourceLineNo">5145</span>  public void testScanMetrics() throws Exception {<a name="line.5145"></a>
+<span class="sourceLineNo">5146</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5146"></a>
+<span class="sourceLineNo">5147</span><a name="line.5147"></a>
+<span class="sourceLineNo">5148</span>    // Set up test table:<a name="line.5148"></a>
+<span class="sourceLineNo">5149</span>    // Create table:<a name="line.5149"></a>
+<span class="sourceLineNo">5150</span>    try (Table ht = TEST_UTIL.createMultiRegionTable(tableName, FAMILY)) {<a name="line.5150"></a>
+<span class="sourceLineNo">5151</span>      int numOfRegions = -1;<a name="line.5151"></a>
+<span class="sourceLineNo">5152</span>      try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5152"></a>
+<span class="sourceLineNo">5153</span>        numOfRegions = r.getStartKeys().length;<a name="line.5153"></a>
+<span class="sourceLineNo">5154</span>      }<a name="line.5154"></a>
+<span class="sourceLineNo">5155</span>      // Create 3 rows in the table, with rowkeys starting with "zzz*" so that<a name="line.5155"></a>
+<span class="sourceLineNo">5156</span>      // scan are forced to hit all the regions.<a name="line.5156"></a>
+<span class="sourceLineNo">5157</span>      Put put1 = new Put(Bytes.toBytes("zzz1"));<a name="line.5157"></a>
+<span class="sourceLineNo">5158</span>      put1.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5158"></a>
+<span class="sourceLineNo">5159</span>      Put put2 = new Put(Bytes.toBytes("zzz2"));<a name="line.5159"></a>
+<span class="sourceLineNo">5160</span>      put2.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5160"></a>
+<span class="sourceLineNo">5161</span>      Put put3 = new Put(Bytes.toBytes("zzz3"));<a name="line.5161"></a>
+<span class="sourceLineNo">5162</span>      put3.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5162"></a>
+<span class="sourceLineNo">5163</span>      ht.put(Arrays.asList(put1, put2, put3));<a name="line.5163"></a>
+<span class="sourceLineNo">5164</span><a name="line.5164"></a>
+<span class="sourceLineNo">5165</span>      Scan scan1 = new Scan();<a name="line.5165"></a>
+<span class="sourceLineNo">5166</span>      int numRecords = 0;<a name="line.5166"></a>
+<span class="sourceLineNo">5167</span>      try (ResultScanner scanner = ht.getScanner(scan1)) {<a name="line.5167"></a>
+<span class="sourceLineNo">5168</span>        for (Result result : scanner) {<a name="line.5168"></a>
+<span class="sourceLineNo">5169</span>          numRecords++;<a name="line.5169"></a>
+<span class="sourceLineNo">5170</span>        }<a name="line.5170"></a>
+<span class="sourceLineNo">5171</span><a name="line.5171"></a>
+<span class="sourceLineNo">5172</span>        LOG.info("test data has " + numRecords + " records.");<a name="line.5172"></a>
+<span class="sourceLineNo">5173</span><a name="line.5173"></a>
+<span class="sourceLineNo">5174</span>        // by default, scan metrics collection is turned off<a name="line.5174"></a>
+<span class="sourceLineNo">5175</span>        assertEquals(null, scanner.getScanMetrics());<a name="line.5175"></a>
+<span class="sourceLineNo">5176</span>      }<a name="line.5176"></a>
+<span class="sourceLineNo">5177</span><a name="line.5177"></a>
+<span class="sourceLineNo">5178</span>      // turn on scan metrics<a name="line.5178"></a>
+<span class="sourceLineNo">5179</span>      Scan scan2 = new Scan();<a name="line.5179"></a>
+<span class="sourceLineNo">5180</span>      scan2.setScanMetricsEnabled(true);<a name="line.5180"></a>
+<span class="sourceLineNo">5181</span>      scan2.setCaching(numRecords + 1);<a name="line.5181"></a>
+<span class="sourceLineNo">5182</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5182"></a>
+<span class="sourceLineNo">5183</span>        for (Result result : scanner.next(numRecords - 1)) {<a name="line.5183"></a>
+<span class="sourceLineNo">5184</span>        }<a name="line.5184"></a>
+<span class="sourceLineNo">5185</span>        scanner.close();<a name="line.5185"></a>
+<span class="sourceLineNo">5186</span>        // closing the scanner will set the metrics.<a name="line.5186"></a>
+<span class="sourceLineNo">5187</span>        assertNotNull(scanner.getScanMetrics());<a name="line.5187"></a>
+<span class="sourceLineNo">5188</span>      }<a name="line.5188"></a>
+<span class="sourceLineNo">5189</span><a name="line.5189"></a>
+<span class="sourceLineNo">5190</span>      // set caching to 1, because metrics are collected in each roundtrip only<a name="line.5190"></a>
+<span class="sourceLineNo">5191</span>      scan2 = new Scan();<a name="line.5191"></a>
+<span class="sourceLineNo">5192</span>      scan2.setScanMetricsEnabled(true);<a name="line.5192"></a>
+<span class="sourceLineNo">5193</span>      scan2.setCaching(1);<a name="line.5193"></a>
+<span class="sourceLineNo">5194</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5194"></a>
+<span class="sourceLineNo">5195</span>        // per HBASE-5717, this should still collect even if you don't run all the way to<a name="line.5195"></a>
+<span class="sourceLineNo">5196</span>        // the end of the scanner. So this is asking for 2 of the 3 rows we inserted.<a name="line.5196"></a>
+<span class="sourceLineNo">5197</span>        for (Result result : scanner.next(numRecords - 1)) {<a name="line.5197"></a>
+<span class="sourceLineNo">5198</span>        }<a name="line.5198"></a>
+<span class="sourceLineNo">5199</span><a name="line.5199"></a>
+<span class="sourceLineNo">5200</span>        ScanMetrics scanMetrics = scanner.getScanMetrics();<a name="line.5200"></a>
+<span class="sourceLineNo">5201</span>        assertEquals("Did not access all the regions in the table", numOfRegions,<a name="line.5201"></a>
+<span class="sourceLineNo">5202</span>                scanMetrics.countOfRegions.get());<a name="line.5202"></a>
+<span class="sourceLineNo">5203</span>      }<a name="line.5203"></a>
+<span class="sourceLineNo">5204</span><a name="line.5204"></a>
+<span class="sourceLineNo">5205</span>      // check byte counters<a name="line.5205"></a>
+<span class="sourceLineNo">5206</span>      scan2 = new Scan();<a name="line.5206"></a>
+<span class="sourceLineNo">5207</span>      scan2.setScanMetricsEnabled(true);<a name="line.5207"></a>
+<span class="sourceLineNo">5208</span>      scan2.setCaching(1);<a name="line.5208"></a>
+<span class="sourceLineNo">5209</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5209"></a>
+<span class="sourceLineNo">5210</span>        int numBytes = 0;<a name="line.5210"></a>
+<span class="sourceLineNo">5211</span>        for (Result result : scanner.next(1)) {<a name="line.5211"></a>
+<span class="sourceLineNo">5212</span>          for (Cell cell : result.listCells()) {<a name="line.5212"></a>
+<span class="sourceLineNo">5213</span>            numBytes += PrivateCellUtil.estimatedSerializedSizeOf(cell);<a name="line.5213"></a>
+<span class="sourceLineNo">5214</span>          }<a name="line.5214"></a>
+<span class="sourceLineNo">5215</span>        }<a name="line.5215"></a>
+<span class="sourceLineNo">5216</span>        scanner.close();<a name="line.5216"></a>
+<span class="sourceLineNo">5217</span>        ScanMetrics scanMetrics = scanner.getScanMetrics();<a name="line.5217"></a>
+<span class="sourceLineNo">5218</span>        assertEquals("Did not count the result bytes", numBytes,<a name="line.5218"></a>
+<span class="sourceLineNo">5219</span>                scanMetrics.countOfBytesInResults.get());<a name="line.5219"></a>
+<span class="sourceLineNo">5220</span>      }<a name="line.5220"></a>
+<span class="sourceLineNo">5221</span><a name="line.5221"></a>
+<span class="sourceLineNo">5222</span>      // check byte counters on a small scan<a name="line.5222"></a>
+<span class="sourceLineNo">5223</span>      scan2 = new Scan();<a name="line.5223"></a>
+<span class="sourceLineNo">5224</span>      scan2.setScanMetricsEnabled(true);<a name="line.5224"></a>
+<span class="sourceLineNo">5225</span>      scan2.setCaching(1);<a name="line.5225"></a>
+<span class="sourceLineNo">5226</span>      scan2.setSmall(true);<a name="line.5226"></a>
+<span class="sourceLineNo">5227</span>      try (ResultScanner scanner = ht.getScanner(scan2)) {<a name="line.5227"></a>
+<span class="sourceLineNo">5228</span>        int numBytes = 0;<a name="line.5228"></a>
+<span class="sourceLineNo">5229</span>        for (Result result : scanner.next(1)) {<a name="line.5229"></a>
+<span class="sourceLineNo">5230</span>          for (Cell cell : result.listCells()) {<a name="line.5230"></a>
+<span class="sourceLineNo">5231</span>            numBytes += PrivateCellUtil.estimatedSerializedSizeOf(cell);<a name="line.5231"></a>
+<span class="sourceLineNo">5232</span>          }<a name="line.5232"></a>
+<span class="sourceLineNo">5233</span>        }<a name="line.5233"></a>
+<span class="sourceLineNo">5234</span>        scanner.close();<a name="line.5234"></a>
+<span class="sourceLineNo">5235</span>        ScanMetrics scanMetrics = scanner.getScanMetrics();<a name="line.5235"></a>
+<span class="sourceLineNo">5236</span>        assertEquals("Did not count the result bytes", numBytes,<a name="line.5236"></a>
+<span class="sourceLineNo">5237</span>                scanMetrics.countOfBytesInResults.get());<a name="line.5237"></a>
+<span class="sourceLineNo">5238</span>      }<a name="line.5238"></a>
+<span class="sourceLineNo">5239</span><a name="line.5239"></a>
+<span class="sourceLineNo">5240</span>      // now, test that the metrics are still collected even if you don't call close, but do<a name="line.5240"></a>
+<span class="sourceLineNo">5241</span>      // run past the end of all the records<a name="line.5241"></a>
+<span class="sourceLineNo">5242</span>      /** There seems to be a timing issue here.  Comment out for now. Fix when time.<a name="line.5242"></a>
+<span class="sourceLineNo">5243</span>       Scan scanWithoutClose = new Scan();<a name="line.5243"></a>
+<span class="sourceLineNo">5244</span>       scanWithoutClose.setCaching(1);<a name="line.5244"></a>
+<span class="sourceLineNo">5245</span>       scanWithoutClose.setScanMetricsEnabled(true);<a name="line.5245"></a>
+<span class="sourceLineNo">5246</span>       ResultScanner scannerWithoutClose = ht.getScanner(scanWithoutClose);<a name="line.5246"></a>
+<span class="sourceLineNo">5247</span>       for (Result result : scannerWithoutClose.next(numRecords + 1)) {<a name="line.5247"></a>
+<span class="sourceLineNo">5248</span>       }<a name="line.5248"></a>
+<span class="sourceLineNo">5249</span>       ScanMetrics scanMetricsWithoutClose = getScanMetrics(scanWithoutClose);<a name="line.5249"></a>
+<span class="sourceLineNo">5250</span>       assertEquals("Did not access all the regions in the table", numOfRegions,<a name="line.5250"></a>
+<span class="sourceLineNo">5251</span>       scanMetricsWithoutClose.countOfRegions.get());<a name="line.5251"></a>
+<span class="sourceLineNo">5252</span>       */<a name="line.5252"></a>
+<span class="sourceLineNo">5253</span><a name="line.5253"></a>
+<span class="sourceLineNo">5254</span>      // finally,<a name="line.5254"></a>
+<span class="sourceLineNo">5255</span>      // test that the metrics are collected correctly if you both run past all the records,<a name="line.5255"></a>
+<span class="sourceLineNo">5256</span>      // AND close the scanner<a name="line.5256"></a>
+<span class="sourceLineNo">5257</span>      Scan scanWithClose = new Scan();<a name="line.5257"></a>
+<span class="sourceLineNo">5258</span>      // make sure we can set caching up to the number of a scanned values<a name="line.5258"></a>
+<span class="sourceLineNo">5259</span>      scanWithClose.setCaching(numRecords);<a name="line.5259"></a>
+<span class="sourceLineNo">5260</span>      scanWithClose.setScanMetricsEnabled(true);<a name="line.5260"></a>
+<span class="sourceLineNo">5261</span>      try (ResultScanner scannerWithClose = ht.getScanner(scanWithClose)) {<a name="line.5261"></a>
+<span class="sourceLineNo">5262</span>        for (Result result : scannerWithClose.next(numRecords + 1)) {<a name="line.5262"></a>
+<span class="sourceLineNo">5263</span>        }<a name="line.5263"></a>
+<span class="sourceLineNo">5264</span>        scannerWithClose.close();<a name="line.5264"></a>
+<span class="sourceLineNo">5265</span>        ScanMetrics scanMetricsWithClose = scannerWithClose.getScanMetrics();<a name="line.5265"></a>
+<span class="sourceLineNo">5266</span>        assertEquals("Did not access all the regions in the table", numOfRegions,<a name="line.5266"></a>
+<span class="sourceLineNo">5267</span>                scanMetricsWithClose.countOfRegions.get());<a name="line.5267"></a>
+<span class="sourceLineNo">5268</span>      }<a name="line.5268"></a>
+<span class="sourceLineNo">5269</span>    }<a name="line.5269"></a>
+<span class="sourceLineNo">5270</span>  }<a name="line.5270"></a>
+<span class="sourceLineNo">5271</span><a name="line.5271"></a>
+<span class="sourceLineNo">5272</span>  /**<a name="line.5272"></a>
+<span class="sourceLineNo">5273</span>   * Tests that cache on write works all the way up from the client-side.<a name="line.5273"></a>
+<span class="sourceLineNo">5274</span>   *<a name="line.5274"></a>
+<span class="sourceLineNo">5275</span>   * Performs inserts, flushes, and compactions, verifying changes in the block<a name="line.5275"></a>
+<span class="sourceLineNo">5276</span>   * cache along the way.<a name="line.5276"></a>
+<span class="sourceLineNo">5277</span>   */<a name="line.5277"></a>
+<span class="sourceLineNo">5278</span>  @Test<a name="line.5278"></a>
+<span class="sourceLineNo">5279</span>  public void testCacheOnWriteEvictOnClose() throws Exception {<a name="line.5279"></a>
+<span class="sourceLineNo">5280</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5280"></a>
+<span class="sourceLineNo">5281</span>    byte [] data = Bytes.toBytes("data");<a name="line.5281"></a>
+<span class="sourceLineNo">5282</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5282"></a>
+<span class="sourceLineNo">5283</span>      try (RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5283"></a>
+<span class="sourceLineNo">5284</span>        // get the block cache and region<a name="line.5284"></a>
+<span class="sourceLineNo">5285</span>        String regionName = locator.getAllRegionLocations().get(0).getRegion().getEncodedName();<a name="line.5285"></a>
+<span class="sourceLineNo">5286</span><a name="line.5286"></a>
+<span class="sourceLineNo">5287</span>        HRegion region = TEST_UTIL.getRSForFirstRegionInTable(tableName)<a name="line.5287"></a>
+<span class="sourceLineNo">5288</span>                .getRegion(regionName);<a name="line.5288"></a>
+<span class="sourceLineNo">5289</span>        HStore store = region.getStores().iterator().next();<a name="line.5289"></a>
+<span class="sourceLineNo">5290</span>        CacheConfig cacheConf = store.getCacheConfig();<a name="line.5290"></a>
+<span class="sourceLineNo">5291</span>        cacheConf.setCacheDataOnWrite(true);<a name="line.5291"></a>
+<span class="sourceLineNo">5292</span>        cacheConf.setEvictOnClose(true);<a name="line.5292"></a>
+<span class="sourceLineNo">5293</span>        BlockCache cache = cacheConf.getBlockCache().get();<a name="line.5293"></a>
+<span class="sourceLineNo">5294</span><a name="line.5294"></a>
+<span class="sourceLineNo">5295</span>        // establish baseline stats<a name="line.5295"></a>
+<span class="sourceLineNo">5296</span>        long startBlockCount = cache.getBlockCount();<a name="line.5296"></a>
+<span class="sourceLineNo">5297</span>        long startBlockHits = cache.getStats().getHitCount();<a name="line.5297"></a>
+<span class="sourceLineNo">5298</span>        long startBlockMiss = cache.getStats().getMissCount();<a name="line.5298"></a>
+<span class="sourceLineNo">5299</span><a name="line.5299"></a>
+<span class="sourceLineNo">5300</span>        // wait till baseline is stable, (minimal 500 ms)<a name="line.5300"></a>
+<span class="sourceLineNo">5301</span>        for (int i = 0; i &lt; 5; i++) {<a name="line.5301"></a>
+<span class="sourceLineNo">5302</span>          Thread.sleep(100);<a name="line.5302"></a>
+<span class="sourceLineNo">5303</span>          if (startBlockCount != cache.getBlockCount()<a name="line.5303"></a>
+<span class="sourceLineNo">5304</span>                  || startBlockHits != cache.getStats().getHitCount()<a name="line.5304"></a>
+<span class="sourceLineNo">5305</span>                  || startBlockMiss != cache.getStats().getMissCount()) {<a name="line.5305"></a>
+<span class="sourceLineNo">5306</span>            startBlockCount = cache.getBlockCount();<a name="line.5306"></a>
+<span class="sourceLineNo">5307</span>            startBlockHits = cache.getStats().getHitCount();<a name="line.5307"></a>
+<span class="sourceLineNo">5308</span>            startBlockMiss = cache.getStats().getMissCount();<a name="line.5308"></a>
+<span class="sourceLineNo">5309</span>            i = -1;<a name="line.5309"></a>
+<span class="sourceLineNo">5310</span>          }<a name="line.5310"></a>
+<span class="sourceLineNo">5311</span>        }<a name="line.5311"></a>
+<span class="sourceLineNo">5312</span><a name="line.5312"></a>
+<span class="sourceLineNo">5313</span>        // insert data<a name="line.5313"></a>
+<span class="sourceLineNo">5314</span>        Put put = new Put(ROW);<a name="line.5314"></a>
+<span class="sourceLineNo">5315</span>        put.addColumn(FAMILY, QUALIFIER, data);<a name="line.5315"></a>
+<span class="sourceLineNo">5316</span>        table.put(put);<a name="line.5316"></a>
+<span class="sourceLineNo">5317</span>        assertTrue(Bytes.equals(table.get(new Get(ROW)).value(), data));<a name="line.5317"></a>
+<span class="sourceLineNo">5318</span>        // data was in memstore so don't expect any changes<a name="line.5318"></a>
+<span class="sourceLineNo">5319</span>        assertEquals(startBlockCount, cache.getBlockCount());<a name="line.5319"></a>
+<span class="sourceLineNo">5320</span>        assertEquals(startBlockHits, cache.getStats().getHitCount());<a name="line.5320"></a>
+<span class="sourceLineNo">5321</span>        assertEquals(startBlockMiss, cache.getStats().getMissCount());<a name="line.5321"></a>
+<span class="sourceLineNo">5322</span>        // flush the data<a name="line.5322"></a>
+<span class="sourceLineNo">5323</span>        System.out.println("Flushing cache");<a name="line.5323"></a>
+<span class="sourceLineNo">5324</span>        region.flush(true);<a name="line.5324"></a>
+<span class="sourceLineNo">5325</span>        // expect one more block in cache, no change in hits/misses<a name="line.5325"></a>
+<span class="sourceLineNo">5326</span>        long expectedBlockCount = startBlockCount + 1;<a name="line.5326"></a>
+<span class="sourceLineNo">5327</span>        long expectedBlockHits = startBlockHits;<a name="line.5327"></a>
+<span class="sourceLineNo">5328</span>        long expectedBlockMiss = startBlockMiss;<a name="line.5328"></a>
+<span class="sourceLineNo">5329</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5329"></a>
+<span class="sourceLineNo">5330</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5330"></a>
+<span class="sourceLineNo">5331</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5331"></a>
+<span class="sourceLineNo">5332</span>        // read the data and expect same blocks, one new hit, no misses<a name="line.5332"></a>
+<span class="sourceLineNo">5333</span>        assertTrue(Bytes.equals(table.get(new Get(ROW)).value(), data));<a name="line.5333"></a>
+<span class="sourceLineNo">5334</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5334"></a>
+<span class="sourceLineNo">5335</span>        assertEquals(++expectedBlockHits, cache.getStats().getHitCount());<a name="line.5335"></a>
+<span class="sourceLineNo">5336</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5336"></a>
+<span class="sourceLineNo">5337</span>        // insert a second column, read the row, no new blocks, one new hit<a name="line.5337"></a>
+<span class="sourceLineNo">5338</span>        byte[] QUALIFIER2 = Bytes.add(QUALIFIER, QUALIFIER);<a name="line.5338"></a>
+<span class="sourceLineNo">5339</span>        byte[] data2 = Bytes.add(data, data);<a name="line.5339"></a>
+<span class="sourceLineNo">5340</span>        put = new Put(ROW);<a name="line.5340"></a>
+<span class="sourceLineNo">5341</span>        put.addColumn(FAMILY, QUALIFIER2, data2);<a name="line.5341"></a>
+<span class="sourceLineNo">5342</span>        table.put(put);<a name="line.5342"></a>
+<span class="sourceLineNo">5343</span>        Result r = table.get(new Get(ROW));<a name="line.5343"></a>
+<span class="sourceLineNo">5344</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER), data));<a name="line.5344"></a>
+<span class="sourceLineNo">5345</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER2), data2));<a name="line.5345"></a>
+<span class="sourceLineNo">5346</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5346"></a>
+<span class="sourceLineNo">5347</span>        assertEquals(++expectedBlockHits, cache.getStats().getHitCount());<a name="line.5347"></a>
+<span class="sourceLineNo">5348</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5348"></a>
+<span class="sourceLineNo">5349</span>        // flush, one new block<a name="line.5349"></a>
+<span class="sourceLineNo">5350</span>        System.out.println("Flushing cache");<a name="line.5350"></a>
+<span class="sourceLineNo">5351</span>        region.flush(true);<a name="line.5351"></a>
+<span class="sourceLineNo">5352</span>        assertEquals(++expectedBlockCount, cache.getBlockCount());<a name="line.5352"></a>
+<span class="sourceLineNo">5353</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5353"></a>
+<span class="sourceLineNo">5354</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5354"></a>
+<span class="sourceLineNo">5355</span>        // compact, net minus two blocks, two hits, no misses<a name="line.5355"></a>
+<span class="sourceLineNo">5356</span>        System.out.println("Compacting");<a name="line.5356"></a>
+<span class="sourceLineNo">5357</span>        assertEquals(2, store.getStorefilesCount());<a name="line.5357"></a>
+<span class="sourceLineNo">5358</span>        store.triggerMajorCompaction();<a name="line.5358"></a>
+<span class="sourceLineNo">5359</span>        region.compact(true);<a name="line.5359"></a>
+<span class="sourceLineNo">5360</span>        store.closeAndArchiveCompactedFiles();<a name="line.5360"></a>
+<span class="sourceLineNo">5361</span>        waitForStoreFileCount(store, 1, 10000); // wait 10 seconds max<a name="line.5361"></a>
+<span class="sourceLineNo">5362</span>        assertEquals(1, store.getStorefilesCount());<a name="line.5362"></a>
+<span class="sourceLineNo">5363</span>        expectedBlockCount -= 2; // evicted two blocks, cached none<a name="line.5363"></a>
+<span class="sourceLineNo">5364</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5364"></a>
+<span class="sourceLineNo">5365</span>        expectedBlockHits += 2;<a name="line.5365"></a>
+<span class="sourceLineNo">5366</span>        assertEquals(expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5366"></a>
+<span class="sourceLineNo">5367</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5367"></a>
+<span class="sourceLineNo">5368</span>        // read the row, this should be a cache miss because we don't cache data<a name="line.5368"></a>
+<span class="sourceLineNo">5369</span>        // blocks on compaction<a name="line.5369"></a>
+<span class="sourceLineNo">5370</span>        r = table.get(new Get(ROW));<a name="line.5370"></a>
+<span class="sourceLineNo">5371</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER), data));<a name="line.5371"></a>
+<span class="sourceLineNo">5372</span>        assertTrue(Bytes.equals(r.getValue(FAMILY, QUALIFIER2), data2));<a name="line.5372"></a>
+<span class="sourceLineNo">5373</span>        expectedBlockCount += 1; // cached one data block<a name="line.5373"></a>
+<span class="sourceLineNo">5374</span>        assertEquals(expectedBlockCount, cache.getBlockCount());<a name="line.5374"></a>
+<span class="sourceLineNo">5375</span>        assertEquals(expectedBlockHits, cache.getStats().getHitCount());<a name="line.5375"></a>
+<span class="sourceLineNo">5376</span>        assertEquals(++expectedBlockMiss, cache.getStats().getMissCount());<a name="line.5376"></a>
+<span class="sourceLineNo">5377</span>      }<a name="line.5377"></a>
+<span class="sourceLineNo">5378</span>    }<a name="line.5378"></a>
+<span class="sourceLineNo">5379</span>  }<a name="line.5379"></a>
+<span class="sourceLineNo">5380</span><a name="line.5380"></a>
+<span class="sourceLineNo">5381</span>  private void waitForStoreFileCount(HStore store, int count, int timeout)<a name="line.5381"></a>
+<span class="sourceLineNo">5382</span>      throws InterruptedException {<a name="line.5382"></a>
+<span class="sourceLineNo">5383</span>    long start = System.currentTimeMillis();<a name="line.5383"></a>
+<span class="sourceLineNo">5384</span>    while (start + timeout &gt; System.currentTimeMillis() &amp;&amp; store.getStorefilesCount() != count) {<a name="line.5384"></a>
+<span class="sourceLineNo">5385</span>      Thread.sleep(100);<a name="line.5385"></a>
+<span class="sourceLineNo">5386</span>    }<a name="line.5386"></a>
+<span class="sourceLineNo">5387</span>    System.out.println("start=" + start + ", now=" + System.currentTimeMillis() + ", cur=" +<a name="line.5387"></a>
+<span class="sourceLineNo">5388</span>        store.getStorefilesCount());<a name="line.5388"></a>
+<span class="sourceLineNo">5389</span>    assertEquals(count, store.getStorefilesCount());<a name="line.5389"></a>
+<span class="sourceLineNo">5390</span>  }<a name="line.5390"></a>
+<span class="sourceLineNo">5391</span><a name="line.5391"></a>
+<span class="sourceLineNo">5392</span>  @Test<a name="line.5392"></a>
+<span class="sourceLineNo">5393</span>  /**<a name="line.5393"></a>
+<span class="sourceLineNo">5394</span>   * Tests the non cached version of getRegionLocator by moving a region.<a name="line.5394"></a>
+<span class="sourceLineNo">5395</span>   */<a name="line.5395"></a>
+<span class="sourceLineNo">5396</span>  public void testNonCachedGetRegionLocation() throws Exception {<a name="line.5396"></a>
+<span class="sourceLineNo">5397</span>    // Test Initialization.<a name="line.5397"></a>
+<span class="sourceLineNo">5398</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5398"></a>
+<span class="sourceLineNo">5399</span>    byte [] family1 = Bytes.toBytes("f1");<a name="line.5399"></a>
+<span class="sourceLineNo">5400</span>    byte [] family2 = Bytes.toBytes("f2");<a name="line.5400"></a>
+<span class="sourceLineNo">5401</span>    try (Table table = TEST_UTIL.createTable(tableName, new byte[][] {family1, family2}, 10);<a name="line.5401"></a>
+<span class="sourceLineNo">5402</span>        Admin admin = TEST_UTIL.getAdmin();<a name="line.5402"></a>
+<span class="sourceLineNo">5403</span>        RegionLocator locator = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5403"></a>
+<span class="sourceLineNo">5404</span>      List&lt;HRegionLocation&gt; allRegionLocations = locator.getAllRegionLocations();<a name="line.5404"></a>
+<span class="sourceLineNo">5405</span>      assertEquals(1, allRegionLocations.size());<a name="line.5405"></a>
+<span class="sourceLineNo">5406</span>      RegionInfo regionInfo = allRegionLocations.get(0).getRegion();<a name="line.5406"></a>
+<span class="sourceLineNo">5407</span>      ServerName addrBefore = allRegionLocations.get(0).getServerName();<a name="line.5407"></a>
+<span class="sourceLineNo">5408</span>      // Verify region location before move.<a name="line.5408"></a>
+<span class="sourceLineNo">5409</span>      HRegionLocation addrCache = locator.getRegionLocation(regionInfo.getStartKey(), false);<a name="line.5409"></a>
+<span class="sourceLineNo">5410</span>      HRegionLocation addrNoCache = locator.getRegionLocation(regionInfo.getStartKey(),  true);<a name="line.5410"></a>
+<span class="sourceLineNo">5411</span><a name="line.5411"></a>
+<span class="sourceLineNo">5412</span>      assertEquals(addrBefore.getPort(), addrCache.getPort());<a name="line.5412"></a>
+<span class="sourceLineNo">5413</span>      assertEquals(addrBefore.getPort(), addrNoCache.getPort());<a name="line.5413"></a>
+<span class="sourceLineNo">5414</span><a name="line.5414"></a>
+<span class="sourceLineNo">5415</span>      ServerName addrAfter = null;<a name="line.5415"></a>
+<span class="sourceLineNo">5416</span>      // Now move the region to a different server.<a name="line.5416"></a>
+<span class="sourceLineNo">5417</span>      for (int i = 0; i &lt; SLAVES; i++) {<a name="line.5417"></a>
+<span class="sourceLineNo">5418</span>        HRegionServer regionServer = TEST_UTIL.getHBaseCluster().getRegionServer(i);<a name="line.5418"></a>
+<span class="sourceLineNo">5419</span>        ServerName addr = regionServer.getServerName();<a name="line.5419"></a>
+<span class="sourceLineNo">5420</span>        if (addr.getPort() != addrBefore.getPort()) {<a name="line.5420"></a>
+<span class="sourceLineNo">5421</span>          admin.move(regionInfo.getEncodedNameAsBytes(), addr);<a name="line.5421"></a>
+<span class="sourceLineNo">5422</span>          // Wait for the region to move.<a name="line.5422"></a>
+<span class="sourceLineNo">5423</span>          Thread.sleep(5000);<a name="line.5423"></a>
+<span class="sourceLineNo">5424</span>          addrAfter = addr;<a name="line.5424"></a>
+<span class="sourceLineNo">5425</span>          break;<a name="line.5425"></a>
+<span class="sourceLineNo">5426</span>        }<a name="line.5426"></a>
+<span class="sourceLineNo">5427</span>      }<a name="line.5427"></a>
 <span class="sourceLineNo">5428</span><a name="line.5428"></a>
-<span class="sourceLineNo">5429</span>    // Change the end key<a name="line.5429"></a>
-<span class="sourceLineNo">5430</span>    endKey = Bytes.toBytes("nnn");<a name="line.5430"></a>
-<span class="sourceLineNo">5431</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5431"></a>
-<span class="sourceLineNo">5432</span>    assertEquals(8, regionsList.size());<a name="line.5432"></a>
-<span class="sourceLineNo">5433</span><a name="line.5433"></a>
-<span class="sourceLineNo">5434</span>    // Empty start key<a name="line.5434"></a>
-<span class="sourceLineNo">5435</span>    regionsList = getRegionsInRange(tableName, HConstants.EMPTY_START_ROW, endKey);<a name="line.5435"></a>
-<span class="sourceLineNo">5436</span>    assertEquals(13, regionsList.size());<a name="line.5436"></a>
+<span class="sourceLineNo">5429</span>      // Verify the region was moved.<a name="line.5429"></a>
+<span class="sourceLineNo">5430</span>      addrCache = locator.getRegionLocation(regionInfo.getStartKey(), false);<a name="line.5430"></a>
+<span class="sourceLineNo">5431</span>      addrNoCache = locator.getRegionLocation(regionInfo.getStartKey(), true);<a name="line.5431"></a>
+<span class="sourceLineNo">5432</span>      assertNotNull(addrAfter);<a name="line.5432"></a>
+<span class="sourceLineNo">5433</span>      assertTrue(addrAfter.getPort() != addrCache.getPort());<a name="line.5433"></a>
+<span class="sourceLineNo">5434</span>      assertEquals(addrAfter.getPort(), addrNoCache.getPort());<a name="line.5434"></a>
+<span class="sourceLineNo">5435</span>    }<a name="line.5435"></a>
+<span class="sourceLineNo">5436</span>  }<a name="line.5436"></a>
 <span class="sourceLineNo">5437</span><a name="line.5437"></a>
-<span class="sourceLineNo">5438</span>    // Empty end key<a name="line.5438"></a>
-<span class="sourceLineNo">5439</span>    regionsList = getRegionsInRange(tableName, startKey, HConstants.EMPTY_END_ROW);<a name="line.5439"></a>
-<span class="sourceLineNo">5440</span>    assertEquals(21, regionsList.size());<a name="line.5440"></a>
-<span class="sourceLineNo">5441</span><a name="line.5441"></a>
-<span class="sourceLineNo">5442</span>    // Both start and end keys empty<a name="line.5442"></a>
-<span class="sourceLineNo">5443</span>    regionsList = getRegionsInRange(tableName, HConstants.EMPTY_START_ROW,<a name="line.5443"></a>
-<span class="sourceLineNo">5444</span>        HConstants.EMPTY_END_ROW);<a name="line.5444"></a>
-<span class="sourceLineNo">5445</span>    assertEquals(26, regionsList.size());<a name="line.5445"></a>
-<span class="sourceLineNo">5446</span><a name="line.5446"></a>
-<span class="sourceLineNo">5447</span>    // Change the end key to somewhere in the last block<a name="line.5447"></a>
-<span class="sourceLineNo">5448</span>    endKey = Bytes.toBytes("zzz1");<a name="line.5448"></a>
-<span class="sourceLineNo">5449</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5449"></a>
-<span class="sourceLineNo">5450</span>    assertEquals(21, regionsList.size());<a name="line.5450"></a>
-<span class="sourceLineNo">5451</span><a name="line.5451"></a>
-<span class="sourceLineNo">5452</span>    // Change the start key to somewhere in the first block<a name="line.5452"></a>
-<span class="sourceLineNo">5453</span>    startKey = Bytes.toBytes("aac");<a name="line.5453"></a>
-<span class="sourceLineNo">5454</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5454"></a>
-<span class="sourceLineNo">5455</span>    assertEquals(26, regionsList.size());<a name="line.5455"></a>
-<span class="sourceLineNo">5456</span><a name="line.5456"></a>
-<span class="sourceLineNo">5457</span>    // Make start and end key the same<a name="line.5457"></a>
-<span class="sourceLineNo">5458</span>    startKey = endKey = Bytes.toBytes("ccc");<a name="line.5458"></a>
-<span class="sourceLineNo">5459</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5459"></a>
-<span class="sourceLineNo">5460</span>    assertEquals(1, regionsList.size());<a name="line.5460"></a>
-<span class="sourceLineNo">5461</span>  }<a name="line.5461"></a>
-<span class="sourceLineNo">5462</span><a name="line.5462"></a>
-<span class="sourceLineNo">5463</span>  private List&lt;HRegionLocation&gt; getRegionsInRange(TableName tableName, byte[] startKey,<a name="line.5463"></a>
-<span class="sourceLineNo">5464</span>      byte[] endKey) throws IOException {<a name="line.5464"></a>
-<span class="sourceLineNo">5465</span>    List&lt;HRegionLocation&gt; regionsInRange = new ArrayList&lt;&gt;();<a name="line.5465"></a>
-<span class="sourceLineNo">5466</span>    byte[] currentKey = startKey;<a name="line.5466"></a>
-<span class="sourceLineNo">5467</span>    final boolean endKeyIsEndOfTable = Bytes.equals(endKey, HConstants.EMPTY_END_ROW);<a name="line.5467"></a>
-<span class="sourceLineNo">5468</span>    try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5468"></a>
-<span class="sourceLineNo">5469</span>      do {<a name="line.5469"></a>
-<span class="sourceLineNo">5470</span>        HRegionLocation regionLocation = r.getRegionLocation(currentKey);<a name="line.5470"></a>
-<span class="sourceLineNo">5471</span>        regionsInRange.add(regionLocation);<a name="line.5471"></a>
-<span class="sourceLineNo">5472</span>        currentKey = regionLocation.getRegion().getEndKey();<a name="line.5472"></a>
-<span class="sourceLineNo">5473</span>      } while (!Bytes.equals(currentKey, HConstants.EMPTY_END_ROW)<a name="line.5473"></a>
-<span class="sourceLineNo">5474</span>          &amp;&amp; (endKeyIsEndOfTable || Bytes.compareTo(currentKey, endKey) &lt; 0));<a name="line.5474"></a>
-<span class="sourceLineNo">5475</span>      return regionsInRange;<a name="line.5475"></a>
-<span class="sourceLineNo">5476</span>    }<a name="line.5476"></a>
-<span class="sourceLineNo">5477</span>  }<a name="line.5477"></a>
-<span class="sourceLineNo">5478</span><a name="line.5478"></a>
-<span class="sourceLineNo">5479</span>  @Test<a name="line.5479"></a>
-<span class="sourceLineNo">5480</span>  public void testJira6912() throws Exception {<a name="line.5480"></a>
-<span class="sourceLineNo">5481</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5481"></a>
-<span class="sourceLineNo">5482</span>    try (Table foo = TEST_UTIL.createTable(tableName, new byte[][] {FAMILY}, 10)) {<a name="line.5482"></a>
-<span class="sourceLineNo">5483</span><a name="line.5483"></a>
-<span class="sourceLineNo">5484</span>      List&lt;Put&gt; puts = new ArrayList&lt;Put&gt;();<a name="line.5484"></a>
-<span class="sourceLineNo">5485</span>      for (int i = 0; i != 100; i++) {<a name="line.5485"></a>
-<span class="sourceLineNo">5486</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.5486"></a>
-<span class="sourceLineNo">5487</span>        put.addColumn(FAMILY, FAMILY, Bytes.toBytes(i));<a name="line.5487"></a>
-<span class="sourceLineNo">5488</span>        puts.add(put);<a name="line.5488"></a>
-<span class="sourceLineNo">5489</span>      }<a name="line.5489"></a>
-<span class="sourceLineNo">5490</span>      foo.put(puts);<a name="line.5490"></a>
-<span class="sourceLineNo">5491</span>      // If i comment this out it works<a name="line.5491"></a>
-<span class="sourceLineNo">5492</span>      TEST_UTIL.flush();<a name="line.5492"></a>
-<span class="sourceLineNo">5493</span><a name="line.5493"></a>
-<span class="sourceLineNo">5494</span>      Scan scan = new Scan();<a name="line.5494"></a>
-<span class="sourceLineNo">5495</span>      scan.setStartRow(Bytes.toBytes(1));<a name="line.5495"></a>
-<span class="sourceLineNo">5496</span>      scan.setStopRow(Bytes.toBytes(3));<a name="line.5496"></a>
-<span class="sourceLineNo">5497</span>      scan.addColumn(FAMILY, FAMILY);<a name="line.5497"></a>
-<span class="sourceLineNo">5498</span>      scan.setFilter(new RowFilter(CompareOperator.NOT_EQUAL,<a name="line.5498"></a>
-<span class="sourceLineNo">5499</span>              new BinaryComparator(Bytes.toBytes(1))));<a name="line.5499"></a>
-<span class="sourceLineNo">5500</span><a name="line.5500"></a>
-<span class="sourceLineNo">5501</span>      try (ResultScanner scanner = foo.getScanner(scan)) {<a name="line.5501"></a>
-<span class="sourceLineNo">5502</span>        Result[] bar = scanner.next(100);<a name="line.5502"></a>
-<span class="sourceLineNo">5503</span>        assertEquals(1, bar.length);<a name="line.5503"></a>
-<span class="sourceLineNo">5504</span>      }<a name="line.5504"></a>
-<span class="sourceLineNo">5505</span>    }<a name="line.5505"></a>
-<span class="sourceLineNo">5506</span>  }<a name="line.5506"></a>
-<span class="sourceLineNo">5507</span><a name="line.5507"></a>
-<span class="sourceLineNo">5508</span>  @Test<a name="line.5508"></a>
-<span class="sourceLineNo">5509</span>  public void testScan_NullQualifier() throws IOException {<a name="line.5509"></a>
-<span class="sourceLineNo">5510</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()), FAMILY)) {<a name="line.5510"></a>
-<span class="sourceLineNo">5511</span>      Put put = new Put(ROW);<a name="line.5511"></a>
-<span class="sourceLineNo">5512</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5512"></a>
-<span class="sourceLineNo">5513</span>      table.put(put);<a name="line.5513"></a>
+<span class="sourceLineNo">5438</span>  @Test<a name="line.5438"></a>
+<span class="sourceLineNo">5439</span>  /**<a name="line.5439"></a>
+<span class="sourceLineNo">5440</span>   * Tests getRegionsInRange by creating some regions over which a range of<a name="line.5440"></a>
+<span class="sourceLineNo">5441</span>   * keys spans; then changing the key range.<a name="line.5441"></a>
+<span class="sourceLineNo">5442</span>   */<a name="line.5442"></a>
+<span class="sourceLineNo">5443</span>  public void testGetRegionsInRange() throws Exception {<a name="line.5443"></a>
+<span class="sourceLineNo">5444</span>    // Test Initialization.<a name="line.5444"></a>
+<span class="sourceLineNo">5445</span>    byte [] startKey = Bytes.toBytes("ddc");<a name="line.5445"></a>
+<span class="sourceLineNo">5446</span>    byte [] endKey = Bytes.toBytes("mmm");<a name="line.5446"></a>
+<span class="sourceLineNo">5447</span>    TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5447"></a>
+<span class="sourceLineNo">5448</span>    TEST_UTIL.createMultiRegionTable(tableName, new byte[][] { FAMILY }, 10);<a name="line.5448"></a>
+<span class="sourceLineNo">5449</span><a name="line.5449"></a>
+<span class="sourceLineNo">5450</span>    int numOfRegions = -1;<a name="line.5450"></a>
+<span class="sourceLineNo">5451</span>    try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5451"></a>
+<span class="sourceLineNo">5452</span>      numOfRegions = r.getStartKeys().length;<a name="line.5452"></a>
+<span class="sourceLineNo">5453</span>    }<a name="line.5453"></a>
+<span class="sourceLineNo">5454</span>    assertEquals(26, numOfRegions);<a name="line.5454"></a>
+<span class="sourceLineNo">5455</span><a name="line.5455"></a>
+<span class="sourceLineNo">5456</span>    // Get the regions in this range<a name="line.5456"></a>
+<span class="sourceLineNo">5457</span>    List&lt;HRegionLocation&gt; regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5457"></a>
+<span class="sourceLineNo">5458</span>    assertEquals(10, regionsList.size());<a name="line.5458"></a>
+<span class="sourceLineNo">5459</span><a name="line.5459"></a>
+<span class="sourceLineNo">5460</span>    // Change the start key<a name="line.5460"></a>
+<span class="sourceLineNo">5461</span>    startKey = Bytes.toBytes("fff");<a name="line.5461"></a>
+<span class="sourceLineNo">5462</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5462"></a>
+<span class="sourceLineNo">5463</span>    assertEquals(7, regionsList.size());<a name="line.5463"></a>
+<span class="sourceLineNo">5464</span><a name="line.5464"></a>
+<span class="sourceLineNo">5465</span>    // Change the end key<a name="line.5465"></a>
+<span class="sourceLineNo">5466</span>    endKey = Bytes.toBytes("nnn");<a name="line.5466"></a>
+<span class="sourceLineNo">5467</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5467"></a>
+<span class="sourceLineNo">5468</span>    assertEquals(8, regionsList.size());<a name="line.5468"></a>
+<span class="sourceLineNo">5469</span><a name="line.5469"></a>
+<span class="sourceLineNo">5470</span>    // Empty start key<a name="line.5470"></a>
+<span class="sourceLineNo">5471</span>    regionsList = getRegionsInRange(tableName, HConstants.EMPTY_START_ROW, endKey);<a name="line.5471"></a>
+<span class="sourceLineNo">5472</span>    assertEquals(13, regionsList.size());<a name="line.5472"></a>
+<span class="sourceLineNo">5473</span><a name="line.5473"></a>
+<span class="sourceLineNo">5474</span>    // Empty end key<a name="line.5474"></a>
+<span class="sourceLineNo">5475</span>    regionsList = getRegionsInRange(tableName, startKey, HConstants.EMPTY_END_ROW);<a name="line.5475"></a>
+<span class="sourceLineNo">5476</span>    assertEquals(21, regionsList.size());<a name="line.5476"></a>
+<span class="sourceLineNo">5477</span><a name="line.5477"></a>
+<span class="sourceLineNo">5478</span>    // Both start and end keys empty<a name="line.5478"></a>
+<span class="sourceLineNo">5479</span>    regionsList = getRegionsInRange(tableName, HConstants.EMPTY_START_ROW,<a name="line.5479"></a>
+<span class="sourceLineNo">5480</span>        HConstants.EMPTY_END_ROW);<a name="line.5480"></a>
+<span class="sourceLineNo">5481</span>    assertEquals(26, regionsList.size());<a name="line.5481"></a>
+<span class="sourceLineNo">5482</span><a name="line.5482"></a>
+<span class="sourceLineNo">5483</span>    // Change the end key to somewhere in the last block<a name="line.5483"></a>
+<span class="sourceLineNo">5484</span>    endKey = Bytes.toBytes("zzz1");<a name="line.5484"></a>
+<span class="sourceLineNo">5485</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5485"></a>
+<span class="sourceLineNo">5486</span>    assertEquals(21, regionsList.size());<a name="line.5486"></a>
+<span class="sourceLineNo">5487</span><a name="line.5487"></a>
+<span class="sourceLineNo">5488</span>    // Change the start key to somewhere in the first block<a name="line.5488"></a>
+<span class="sourceLineNo">5489</span>    startKey = Bytes.toBytes("aac");<a name="line.5489"></a>
+<span class="sourceLineNo">5490</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5490"></a>
+<span class="sourceLineNo">5491</span>    assertEquals(26, regionsList.size());<a name="line.5491"></a>
+<span class="sourceLineNo">5492</span><a name="line.5492"></a>
+<span class="sourceLineNo">5493</span>    // Make start and end key the same<a name="line.5493"></a>
+<span class="sourceLineNo">5494</span>    startKey = endKey = Bytes.toBytes("ccc");<a name="line.5494"></a>
+<span class="sourceLineNo">5495</span>    regionsList = getRegionsInRange(tableName, startKey, endKey);<a name="line.5495"></a>
+<span class="sourceLineNo">5496</span>    assertEquals(1, regionsList.size());<a name="line.5496"></a>
+<span class="sourceLineNo">5497</span>  }<a name="line.5497"></a>
+<span class="sourceLineNo">5498</span><a name="line.5498"></a>
+<span class="sourceLineNo">5499</span>  private List&lt;HRegionLocation&gt; getRegionsInRange(TableName tableName, byte[] startKey,<a name="line.5499"></a>
+<span class="sourceLineNo">5500</span>      byte[] endKey) throws IOException {<a name="line.5500"></a>
+<span class="sourceLineNo">5501</span>    List&lt;HRegionLocation&gt; regionsInRange = new ArrayList&lt;&gt;();<a name="line.5501"></a>
+<span class="sourceLineNo">5502</span>    byte[] currentKey = startKey;<a name="line.5502"></a>
+<span class="sourceLineNo">5503</span>    final boolean endKeyIsEndOfTable = Bytes.equals(endKey, HConstants.EMPTY_END_ROW);<a name="line.5503"></a>
+<span class="sourceLineNo">5504</span>    try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.5504"></a>
+<span class="sourceLineNo">5505</span>      do {<a name="line.5505"></a>
+<span class="sourceLineNo">5506</span>        HRegionLocation regionLocation = r.getRegionLocation(currentKey);<a name="line.5506"></a>
+<span class="sourceLineNo">5507</span>        regionsInRange.add(regionLocation);<a name="line.5507"></a>
+<span class="sourceLineNo">5508</span>        currentKey = regionLocation.getRegion().getEndKey();<a name="line.5508"></a>
+<span class="sourceLineNo">5509</span>      } while (!Bytes.equals(currentKey, HConstants.EMPTY_END_ROW)<a name="line.5509"></a>
+<span class="sourceLineNo">5510</span>          &amp;&amp; (endKeyIsEndOfTable || Bytes.compareTo(currentKey, endKey) &lt; 0));<a name="line.5510"></a>
+<span class="sourceLineNo">5511</span>      return regionsInRange;<a name="line.5511"></a>
+<span class="sourceLineNo">5512</span>    }<a name="line.5512"></a>
+<span class="sourceLineNo">5513</span>  }<a name="line.5513"></a>
 <span class="sourceLineNo">5514</span><a name="line.5514"></a>
-<span class="sourceLineNo">5515</span>      put = new Put(ROW);<a name="line.5515"></a>
-<span class="sourceLineNo">5516</span>      put.addColumn(FAMILY, null, VALUE);<a name="line.5516"></a>
-<span class="sourceLineNo">5517</span>      table.put(put);<a name="line.5517"></a>
-<span class="sourceLineNo">5518</span>      LOG.info("Row put");<a name="line.5518"></a>
+<span class="sourceLineNo">5515</span>  @Test<a name="line.5515"></a>
+<span class="sourceLineNo">5516</span>  public void testJira6912() throws Exception {<a name="line.5516"></a>
+<span class="sourceLineNo">5517</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5517"></a>
+<span class="sourceLineNo">5518</span>    try (Table foo = TEST_UTIL.createTable(tableName, new byte[][] {FAMILY}, 10)) {<a name="line.5518"></a>
 <span class="sourceLineNo">5519</span><a name="line.5519"></a>
-<span class="sourceLineNo">5520</span>      Scan scan = new Scan();<a name="line.5520"></a>
-<span class="sourceLineNo">5521</span>      scan.addColumn(FAMILY, null);<a name="line.5521"></a>
-<span class="sourceLineNo">5522</span><a name="line.5522"></a>
-<span class="sourceLineNo">5523</span>      ResultScanner scanner = table.getScanner(scan);<a name="line.5523"></a>
-<span class="sourceLineNo">5524</span>      Result[] bar = scanner.next(100);<a name="line.5524"></a>
-<span class="sourceLineNo">5525</span>      assertEquals(1, bar.length);<a name="line.5525"></a>
-<span class="sourceLineNo">5526</span>      assertEquals(1, bar[0].size());<a name="line.5526"></a>
-<span class="sourceLineNo">5527</span><a name="line.5527"></a>
-<span class="sourceLineNo">5528</span>      scan = new Scan();<a name="line.5528"></a>
-<span class="sourceLineNo">5529</span>      scan.addFamily(FAMILY);<a name="line.5529"></a>
-<span class="sourceLineNo">5530</span><a name="line.5530"></a>
-<span class="sourceLineNo">5531</span>      scanner = table.getScanner(scan);<a name="line.5531"></a>
-<span class="sourceLineNo">5532</span>      bar = scanner.next(100);<a name="line.5532"></a>
-<span class="sourceLineNo">5533</span>      assertEquals(1, bar.length);<a name="line.5533"></a>
-<span class="sourceLineNo">5534</span>      assertEquals(2, bar[0].size());<a name="line.5534"></a>
-<span class="sourceLineNo">5535</span>    }<a name="line.5535"></a>
-<span class="sourceLineNo">5536</span>  }<a name="line.5536"></a>
-<span class="sourceLineNo">5537</span><a name="line.5537"></a>
-<span class="sourceLineNo">5538</span>  @Test<a name="line.5538"></a>
-<span class="sourceLineNo">5539</span>  public void testNegativeTimestamp() throws IOException {<a name="line.5539"></a>
-<span class="sourceLineNo">5540</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()), FAMILY)) {<a name="line.5540"></a>
-<span class="sourceLineNo">5541</span><a name="line.5541"></a>
-<span class="sourceLineNo">5542</span>      try {<a name="line.5542"></a>
-<span class="sourceLineNo">5543</span>        Put put = new Put(ROW, -1);<a name="line.5543"></a>
-<span class="sourceLineNo">5544</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5544"></a>
-<span class="sourceLineNo">5545</span>        table.put(put);<a name="line.5545"></a>
-<span class="sourceLineNo">5546</span>        fail("Negative timestamps should not have been allowed");<a name="line.5546"></a>
-<span class="sourceLineNo">5547</span>      } catch (IllegalArgumentException ex) {<a name="line.5547"></a>
-<span class="sourceLineNo">5548</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5548"></a>
-<span class="sourceLineNo">5549</span>      }<a name="line.5549"></a>
+<span class="sourceLineNo">5520</span>      List&lt;Put&gt; puts = new ArrayList&lt;Put&gt;();<a name="line.5520"></a>
+<span class="sourceLineNo">5521</span>      for (int i = 0; i != 100; i++) {<a name="line.5521"></a>
+<span class="sourceLineNo">5522</span>        Put put = new Put(Bytes.toBytes(i));<a name="line.5522"></a>
+<span class="sourceLineNo">5523</span>        put.addColumn(FAMILY, FAMILY, Bytes.toBytes(i));<a name="line.5523"></a>
+<span class="sourceLineNo">5524</span>        puts.add(put);<a name="line.5524"></a>
+<span class="sourceLineNo">5525</span>      }<a name="line.5525"></a>
+<span class="sourceLineNo">5526</span>      foo.put(puts);<a name="line.5526"></a>
+<span class="sourceLineNo">5527</span>      // If i comment this out it works<a name="line.5527"></a>
+<span class="sourceLineNo">5528</span>      TEST_UTIL.flush();<a name="line.5528"></a>
+<span class="sourceLineNo">5529</span><a name="line.5529"></a>
+<span class="sourceLineNo">5530</span>      Scan scan = new Scan();<a name="line.5530"></a>
+<span class="sourceLineNo">5531</span>      scan.setStartRow(Bytes.toBytes(1));<a name="line.5531"></a>
+<span class="sourceLineNo">5532</span>      scan.setStopRow(Bytes.toBytes(3));<a name="line.5532"></a>
+<span class="sourceLineNo">5533</span>      scan.addColumn(FAMILY, FAMILY);<a name="line.5533"></a>
+<span class="sourceLineNo">5534</span>      scan.setFilter(new RowFilter(CompareOperator.NOT_EQUAL,<a name="line.5534"></a>
+<span class="sourceLineNo">5535</span>              new BinaryComparator(Bytes.toBytes(1))));<a name="line.5535"></a>
+<span class="sourceLineNo">5536</span><a name="line.5536"></a>
+<span class="sourceLineNo">5537</span>      try (ResultScanner scanner = foo.getScanner(scan)) {<a name="line.5537"></a>
+<span class="sourceLineNo">5538</span>        Result[] bar = scanner.next(100);<a name="line.5538"></a>
+<span class="sourceLineNo">5539</span>        assertEquals(1, bar.length);<a name="line.5539"></a>
+<span class="sourceLineNo">5540</span>      }<a name="line.5540"></a>
+<span class="sourceLineNo">5541</span>    }<a name="line.5541"></a>
+<span class="sourceLineNo">5542</span>  }<a name="line.5542"></a>
+<span class="sourceLineNo">5543</span><a name="line.5543"></a>
+<span class="sourceLineNo">5544</span>  @Test<a name="line.5544"></a>
+<span class="sourceLineNo">5545</span>  public void testScan_NullQualifier() throws IOException {<a name="line.5545"></a>
+<span class="sourceLineNo">5546</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()), FAMILY)) {<a name="line.5546"></a>
+<span class="sourceLineNo">5547</span>      Put put = new Put(ROW);<a name="line.5547"></a>
+<span class="sourceLineNo">5548</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5548"></a>
+<span class="sourceLineNo">5549</span>      table.put(put);<a name="line.5549"></a>
 <span class="sourceLineNo">5550</span><a name="line.5550"></a>
-<span class="sourceLineNo">5551</span>      try {<a name="line.5551"></a>
-<span class="sourceLineNo">5552</span>        Put put = new Put(ROW);<a name="line.5552"></a>
-<span class="sourceLineNo">5553</span>        long ts = -1;<a name="line.5553"></a>
-<span class="sourceLineNo">5554</span>        put.addColumn(FAMILY, QUALIFIER, ts, VALUE);<a name="line.5554"></a>
-<span class="sourceLineNo">5555</span>        table.put(put);<a name="line.5555"></a>
-<span class="sourceLineNo">5556</span>        fail("Negative timestamps should not have been allowed");<a name="line.5556"></a>
-<span class="sourceLineNo">5557</span>      } catch (IllegalArgumentException ex) {<a name="line.5557"></a>
-<span class="sourceLineNo">5558</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5558"></a>
-<span class="sourceLineNo">5559</span>      }<a name="line.5559"></a>
-<span class="sourceLineNo">5560</span><a name="line.5560"></a>
-<span class="sourceLineNo">5561</span>      try {<a name="line.5561"></a>
-<span class="sourceLineNo">5562</span>        Delete delete = new Delete(ROW, -1);<a name="line.5562"></a>
-<span class="sourceLineNo">5563</span>        table.delete(delete);<a name="line.5563"></a>
-<span class="sourceLineNo">5564</span>        fail("Negative timestamps should not have been allowed");<a name="line.5564"></a>
-<span class="sourceLineNo">5565</span>      } catch (IllegalArgumentException ex) {<a name="line.5565"></a>
-<span class="sourceLineNo">5566</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5566"></a>
-<span class="sourceLineNo">5567</span>      }<a name="line.5567"></a>
-<span class="sourceLineNo">5568</span><a name="line.5568"></a>
-<span class="sourceLineNo">5569</span>      try {<a name="line.5569"></a>
-<span class="sourceLineNo">5570</span>        Delete delete = new Delete(ROW);<a name="line.5570"></a>
-<span class="sourceLineNo">5571</span>        delete.addFamily(FAMILY, -1);<a name="line.5571"></a>
-<span class="sourceLineNo">5572</span>        table.delete(delete);<a name="line.5572"></a>
-<span class="sourceLineNo">5573</span>        fail("Negative timestamps should not have been allowed");<a name="line.5573"></a>
-<span class="sourceLineNo">5574</span>      } catch (IllegalArgumentException ex) {<a name="line.5574"></a>
-<span class="sourceLineNo">5575</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5575"></a>
-<span class="sourceLineNo">5576</span>      }<a name="line.5576"></a>
+<span class="sourceLineNo">5551</span>      put = new Put(ROW);<a name="line.5551"></a>
+<span class="sourceLineNo">5552</span>      put.addColumn(FAMILY, null, VALUE);<a name="line.5552"></a>
+<span class="sourceLineNo">5553</span>      table.put(put);<a name="line.5553"></a>
+<span class="sourceLineNo">5554</span>      LOG.info("Row put");<a name="line.5554"></a>
+<span class="sourceLineNo">5555</span><a name="line.5555"></a>
+<span class="sourceLineNo">5556</span>      Scan scan = new Scan();<a name="line.5556"></a>
+<span class="sourceLineNo">5557</span>      scan.addColumn(FAMILY, null);<a name="line.5557"></a>
+<span class="sourceLineNo">5558</span><a name="line.5558"></a>
+<span class="sourceLineNo">5559</span>      ResultScanner scanner = table.getScanner(scan);<a name="line.5559"></a>
+<span class="sourceLineNo">5560</span>      Result[] bar = scanner.next(100);<a name="line.5560"></a>
+<span class="sourceLineNo">5561</span>      assertEquals(1, bar.length);<a name="line.5561"></a>
+<span class="sourceLineNo">5562</span>      assertEquals(1, bar[0].size());<a name="line.5562"></a>
+<span class="sourceLineNo">5563</span><a name="line.5563"></a>
+<span class="sourceLineNo">5564</span>      scan = new Scan();<a name="line.5564"></a>
+<span class="sourceLineNo">5565</span>      scan.addFamily(FAMILY);<a name="line.5565"></a>
+<span class="sourceLineNo">5566</span><a name="line.5566"></a>
+<span class="sourceLineNo">5567</span>      scanner = table.getScanner(scan);<a name="line.5567"></a>
+<span class="sourceLineNo">5568</span>      bar = scanner.next(100);<a name="line.5568"></a>
+<span class="sourceLineNo">5569</span>      assertEquals(1, bar.length);<a name="line.5569"></a>
+<span class="sourceLineNo">5570</span>      assertEquals(2, bar[0].size());<a name="line.5570"></a>
+<span class="sourceLineNo">5571</span>    }<a name="line.5571"></a>
+<span class="sourceLineNo">5572</span>  }<a name="line.5572"></a>
+<span class="sourceLineNo">5573</span><a name="line.5573"></a>
+<span class="sourceLineNo">5574</span>  @Test<a name="line.5574"></a>
+<span class="sourceLineNo">5575</span>  public void testNegativeTimestamp() throws IOException {<a name="line.5575"></a>
+<span class="sourceLineNo">5576</span>    try (Table table = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName()), FAMILY)) {<a name="line.5576"></a>
 <span class="sourceLineNo">5577</span><a name="line.5577"></a>
 <span class="sourceLineNo">5578</span>      try {<a name="line.5578"></a>
-<span class="sourceLineNo">5579</span>        Scan scan = new Scan();<a name="line.5579"></a>
-<span class="sourceLineNo">5580</span>        scan.setTimeRange(-1, 1);<a name="line.5580"></a>
-<span class="sourceLineNo">5581</span>        table.getScanner(scan);<a name="line.5581"></a>
+<span class="sourceLineNo">5579</span>        Put put = new Put(ROW, -1);<a name="line.5579"></a>
+<span class="sourceLineNo">5580</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5580"></a>
+<span class="sourceLineNo">5581</span>        table.put(put);<a name="line.5581"></a>
 <span class="sourceLineNo">5582</span>        fail("Negative timestamps should not have been allowed");<a name="line.5582"></a>
 <span class="sourceLineNo">5583</span>      } catch (IllegalArgumentException ex) {<a name="line.5583"></a>
 <span class="sourceLineNo">5584</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5584"></a>
 <span class="sourceLineNo">5585</span>      }<a name="line.5585"></a>
 <span class="sourceLineNo">5586</span><a name="line.5586"></a>
-<span class="sourceLineNo">5587</span>      // KeyValue should allow negative timestamps for backwards compat. Otherwise, if the user<a name="line.5587"></a>
-<span class="sourceLineNo">5588</span>      // already has negative timestamps in cluster data, HBase won't be able to handle that<a name="line.5588"></a>
-<span class="sourceLineNo">5589</span>      try {<a name="line.5589"></a>
-<span class="sourceLineNo">5590</span>        new KeyValue(Bytes.toBytes(42), Bytes.toBytes(42), Bytes.toBytes(42), -1,<a name="line.5590"></a>
-<span class="sourceLineNo">5591</span>                Bytes.toBytes(42));<a name="line.5591"></a>
-<span class="sourceLineNo">5592</span>      } catch (IllegalArgumentException ex) {<a name="line.5592"></a>
-<span class="sourceLineNo">5593</span>        fail("KeyValue SHOULD allow negative timestamps");<a name="line.5593"></a>
-<span class="sourceLineNo">5594</span>      }<a name="line.5594"></a>
-<span class="sourceLineNo">5595</span><a name="line.5595"></a>
-<span class="sourceLineNo">5596</span>    }<a name="line.5596"></a>
-<span class="sourceLineNo">5597</span>  }<a name="line.5597"></a>
-<span class="sourceLineNo">5598</span><a name="line.5598"></a>
-<span class="sourceLineNo">5599</span>  @Test<a name="line.5599"></a>
-<span class="sourceLineNo">5600</span>  public void testRawScanRespectsVersions() throws Exception {<a name="line.5600"></a>
-<span class="sourceLineNo">5601</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5601"></a>
-<span class="sourceLineNo">5602</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5602"></a>
-<span class="sourceLineNo">5603</span>      byte[] row = Bytes.toBytes("row");<a name="line.5603"></a>
+<span class="sourceLineNo">5587</span>      try {<a name="line.5587"></a>
+<span class="sourceLineNo">5588</span>        Put put = new Put(ROW);<a name="line.5588"></a>
+<span class="sourceLineNo">5589</span>        long ts = -1;<a name="line.5589"></a>
+<span class="sourceLineNo">5590</span>        put.addColumn(FAMILY, QUALIFIER, ts, VALUE);<a name="line.5590"></a>
+<span class="sourceLineNo">5591</span>        table.put(put);<a name="line.5591"></a>
+<span class="sourceLineNo">5592</span>        fail("Negative timestamps should not have been allowed");<a name="line.5592"></a>
+<span class="sourceLineNo">5593</span>      } catch (IllegalArgumentException ex) {<a name="line.5593"></a>
+<span class="sourceLineNo">5594</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5594"></a>
+<span class="sourceLineNo">5595</span>      }<a name="line.5595"></a>
+<span class="sourceLineNo">5596</span><a name="line.5596"></a>
+<span class="sourceLineNo">5597</span>      try {<a name="line.5597"></a>
+<span class="sourceLineNo">5598</span>        Delete delete = new Delete(ROW, -1);<a name="line.5598"></a>
+<span class="sourceLineNo">5599</span>        table.delete(delete);<a name="line.5599"></a>
+<span class="sourceLineNo">5600</span>        fail("Negative timestamps should not have been allowed");<a name="line.5600"></a>
+<span class="sourceLineNo">5601</span>      } catch (IllegalArgumentException ex) {<a name="line.5601"></a>
+<span class="sourceLineNo">5602</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5602"></a>
+<span class="sourceLineNo">5603</span>      }<a name="line.5603"></a>
 <span class="sourceLineNo">5604</span><a name="line.5604"></a>
-<span class="sourceLineNo">5605</span>      // put the same row 4 times, with different values<a name="line.5605"></a>
-<span class="sourceLineNo">5606</span>      Put p = new Put(row);<a name="line.5606"></a>
-<span class="sourceLineNo">5607</span>      p.addColumn(FAMILY, QUALIFIER, 10, VALUE);<a name="line.5607"></a>
-<span class="sourceLineNo">5608</span>      table.put(p);<a name="line.5608"></a>
-<span class="sourceLineNo">5609</span>      p = new Put(row);<a name="line.5609"></a>
-<span class="sourceLineNo">5610</span>      p.addColumn(FAMILY, QUALIFIER, 11, ArrayUtils.add(VALUE, (byte) 2));<a name="line.5610"></a>
-<span class="sourceLineNo">5611</span>      table.put(p);<a name="line.5611"></a>
-<span class="sourceLineNo">5612</span><a name="line.5612"></a>
-<span class="sourceLineNo">5613</span>      p = new Put(row);<a name="line.5613"></a>
-<span class="sourceLineNo">5614</span>      p.addColumn(FAMILY, QUALIFIER, 12, ArrayUtils.add(VALUE, (byte) 3));<a name="line.5614"></a>
-<span class="sourceLineNo">5615</span>      table.put(p);<a name="line.5615"></a>
-<span class="sourceLineNo">5616</span><a name="line.5616"></a>
-<span class="sourceLineNo">5617</span>      p = new Put(row);<a name="line.5617"></a>
-<span class="sourceLineNo">5618</span>      p.addColumn(FAMILY, QUALIFIER, 13, ArrayUtils.add(VALUE, (byte) 4));<a name="line.5618"></a>
-<span class="sourceLineNo">5619</span>      table.put(p);<a name="line.5619"></a>
-<span class="sourceLineNo">5620</span><a name="line.5620"></a>
-<span class="sourceLineNo">5621</span>      int versions = 4;<a name="line.5621"></a>
-<span class="sourceLineNo">5622</span>      Scan s = new Scan(row);<a name="line.5622"></a>
-<span class="sourceLineNo">5623</span>      // get all the possible versions<a name="line.5623"></a>
-<span class="sourceLineNo">5624</span>      s.setMaxVersions();<a name="line.5624"></a>
-<span class="sourceLineNo">5625</span>      s.setRaw(true);<a name="line.5625"></a>
-<span class="sourceLineNo">5626</span><a name="line.5626"></a>
-<span class="sourceLineNo">5627</span>      try (ResultScanner scanner = table.getScanner(s)) {<a name="line.5627"></a>
-<span class="sourceLineNo">5628</span>        int count = 0;<a name="line.5628"></a>
-<span class="sourceLineNo">5629</span>        for (Result r : scanner) {<a name="line.5629"></a>
-<span class="sourceLineNo">5630</span>          assertEquals("Found an unexpected number of results for the row!", versions,<a name="line.5630"></a>
-<span class="sourceLineNo">5631</span>                  r.listCells().size());<a name="line.5631"></a>
-<span class="sourceLineNo">5632</span>          count++;<a name="line.5632"></a>
-<span class="sourceLineNo">5633</span>        }<a name="line.5633"></a>
-<span class="sourceLineNo">5634</span>        assertEquals("Found more than a single row when raw scanning the table with a single row!",<a name="line.5634"></a>
-<span class="sourceLineNo">5635</span>                1, count);<a name="line.5635"></a>
-<span class="sourceLineNo">5636</span>      }<a name="line.5636"></a>
-<span class="sourceLineNo">5637</span><a name="line.5637"></a>
-<span class="sourceLineNo">5638</span>      // then if we decrease the number of versions, but keep the scan raw, we should see exactly<a name="line.5638"></a>
-<span class="sourceLineNo">5639</span>      // that number of versions<a name="line.5639"></a>
-<span class="sourceLineNo">5640</span>      versions = 2;<a name="line.5640"></a>
-<span class="sourceLineNo">5641</span>      s.setMaxVersions(versions);<a name="line.5641"></a>
-<span class="sourceLineNo">5642</span>      try (ResultScanner scanner = table.getScanner(s)) {<a name="line.5642"></a>
-<span class="sourceLineNo">5643</span>        int count = 0;<a name="line.5643"></a>
-<span class="sourceLineNo">5644</span>        for (Result r : scanner) {<a name="line.5644"></a>
-<span class="sourceLineNo">5645</span>          assertEquals("Found an unexpected number of results for the row!", versions,<a name="line.5645"></a>
-<span class="sourceLineNo">5646</span>                  r.listCells().size());<a name="line.5646"></a>
-<span class="sourceLineNo">5647</span>          count++;<a name="line.5647"></a>
-<span class="sourceLineNo">5648</span>        }<a name="line.5648"></a>
-<span class="sourceLineNo">5649</span>        assertEquals("Found more than a single row when raw scanning the table with a single row!",<a name="line.5649"></a>
-<span class="sourceLineNo">5650</span>                1, count);<a name="line.5650"></a>
-<span class="sourceLineNo">5651</span>      }<a name="line.5651"></a>
+<span class="sourceLineNo">5605</span>      try {<a name="line.5605"></a>
+<span class="sourceLineNo">5606</span>        Delete delete = new Delete(ROW);<a name="line.5606"></a>
+<span class="sourceLineNo">5607</span>        delete.addFamily(FAMILY, -1);<a name="line.5607"></a>
+<span class="sourceLineNo">5608</span>        table.delete(delete);<a name="line.5608"></a>
+<span class="sourceLineNo">5609</span>        fail("Negative timestamps should not have been allowed");<a name="line.5609"></a>
+<span class="sourceLineNo">5610</span>      } catch (IllegalArgumentException ex) {<a name="line.5610"></a>
+<span class="sourceLineNo">5611</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5611"></a>
+<span class="sourceLineNo">5612</span>      }<a name="line.5612"></a>
+<span class="sourceLineNo">5613</span><a name="line.5613"></a>
+<span class="sourceLineNo">5614</span>      try {<a name="line.5614"></a>
+<span class="sourceLineNo">5615</span>        Scan scan = new Scan();<a name="line.5615"></a>
+<span class="sourceLineNo">5616</span>        scan.setTimeRange(-1, 1);<a name="line.5616"></a>
+<span class="sourceLineNo">5617</span>        table.getScanner(scan);<a name="line.5617"></a>
+<span class="sourceLineNo">5618</span>        fail("Negative timestamps should not have been allowed");<a name="line.5618"></a>
+<span class="sourceLineNo">5619</span>      } catch (IllegalArgumentException ex) {<a name="line.5619"></a>
+<span class="sourceLineNo">5620</span>        assertTrue(ex.getMessage().contains("negative"));<a name="line.5620"></a>
+<span class="sourceLineNo">5621</span>      }<a name="line.5621"></a>
+<span class="sourceLineNo">5622</span><a name="line.5622"></a>
+<span class="sourceLineNo">5623</span>      // KeyValue should allow negative timestamps for backwards compat. Otherwise, if the user<a name="line.5623"></a>
+<span class="sourceLineNo">5624</span>      // already has negative timestamps in cluster data, HBase won't be able to handle that<a name="line.5624"></a>
+<span class="sourceLineNo">5625</span>      try {<a name="line.5625"></a>
+<span class="sourceLineNo">5626</span>        new KeyValue(Bytes.toBytes(42), Bytes.toBytes(42), Bytes.toBytes(42), -1,<a name="line.5626"></a>
+<span class="sourceLineNo">5627</span>                Bytes.toBytes(42));<a name="line.5627"></a>
+<span class="sourceLineNo">5628</span>      } catch (IllegalArgumentException ex) {<a name="line.5628"></a>
+<span class="sourceLineNo">5629</span>        fail("KeyValue SHOULD allow negative timestamps");<a name="line.5629"></a>
+<span class="sourceLineNo">5630</span>      }<a name="line.5630"></a>
+<span class="sourceLineNo">5631</span><a name="line.5631"></a>
+<span class="sourceLineNo">5632</span>    }<a name="line.5632"></a>
+<span class="sourceLineNo">5633</span>  }<a name="line.5633"></a>
+<span class="sourceLineNo">5634</span><a name="line.5634"></a>
+<span class="sourceLineNo">5635</span>  @Test<a name="line.5635"></a>
+<span class="sourceLineNo">5636</span>  public void testRawScanRespectsVersions() throws Exception {<a name="line.5636"></a>
+<span class="sourceLineNo">5637</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5637"></a>
+<span class="sourceLineNo">5638</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5638"></a>
+<span class="sourceLineNo">5639</span>      byte[] row = Bytes.toBytes("row");<a name="line.5639"></a>
+<span class="sourceLineNo">5640</span><a name="line.5640"></a>
+<span class="sourceLineNo">5641</span>      // put the same row 4 times, with different values<a name="line.5641"></a>
+<span class="sourceLineNo">5642</span>      Put p = new Put(row);<a name="line.5642"></a>
+<span class="sourceLineNo">5643</span>      p.addColumn(FAMILY, QUALIFIER, 10, VALUE);<a name="line.5643"></a>
+<span class="sourceLineNo">5644</span>      table.put(p);<a name="line.5644"></a>
+<span class="sourceLineNo">5645</span>      p = new Put(row);<a name="line.5645"></a>
+<span class="sourceLineNo">5646</span>      p.addColumn(FAMILY, QUALIFIER, 11, ArrayUtils.add(VALUE, (byte) 2));<a name="line.5646"></a>
+<span class="sourceLineNo">5647</span>      table.put(p);<a name="line.5647"></a>
+<span class="sourceLineNo">5648</span><a name="line.5648"></a>
+<span class="sourceLineNo">5649</span>      p = new Put(row);<a name="line.5649"></a>
+<span class="sourceLineNo">5650</span>      p.addColumn(FAMILY, QUALIFIER, 12, ArrayUtils.add(VALUE, (byte) 3));<a name="line.5650"></a>
+<span class="sourceLineNo">5651</span>      table.put(p);<a name="line.5651"></a>
 <span class="sourceLineNo">5652</span><a name="line.5652"></a>
-<span class="sourceLineNo">5653</span>      // finally, if we turn off raw scanning, but max out the number of versions, we should go back<a name="line.5653"></a>
-<span class="sourceLineNo">5654</span>      // to seeing just three<a name="line.5654"></a>
-<span class="sourceLineNo">5655</span>      versions = 3;<a name="line.5655"></a>
-<span class="sourceLineNo">5656</span>      s.setMaxVersions(versions);<a name="line.5656"></a>
-<span class="sourceLineNo">5657</span>      try (ResultScanner scanner = table.getScanner(s)) {<a name="line.5657"></a>
-<span class="sourceLineNo">5658</span>        int count = 0;<a name="line.5658"></a>
-<span class="sourceLineNo">5659</span>        for (Result r : scanner) {<a name="line.5659"></a>
-<span class="sourceLineNo">5660</span>          assertEquals("Found an unexpected number of results for the row!", versions,<a name="line.5660"></a>
-<span class="sourceLineNo">5661</span>                  r.listCells().size());<a name="line.5661"></a>
-<span class="sourceLineNo">5662</span>          count++;<a name="line.5662"></a>
-<span class="sourceLineNo">5663</span>        }<a name="line.5663"></a>
-<span class="sourceLineNo">5664</span>        assertEquals("Found more than a single row when raw scanning the table with a single row!",<a name="line.5664"></a>
-<span class="sourceLineNo">5665</span>                1, count);<a name="line.5665"></a>
-<span class="sourceLineNo">5666</span>      }<a name="line.5666"></a>
-<span class="sourceLineNo">5667</span><a name="line.5667"></a>
-<span class="sourceLineNo">5668</span>    }<a name="line.5668"></a>
-<span class="sourceLineNo">5669</span>    TEST_UTIL.deleteTable(tableName);<a name="line.5669"></a>
-<span class="sourceLineNo">5670</span>  }<a name="line.5670"></a>
-<span class="sourceLineNo">5671</span><a name="line.5671"></a>
-<span class="sourceLineNo">5672</span>  @Test<a name="line.5672"></a>
-<span class="sourceLineNo">5673</span>  public void testEmptyFilterList() throws Exception {<a name="line.5673"></a>
-<span class="sourceLineNo">5674</span>    // Test Initialization.<a name="line.5674"></a>
-<span class="sourceLineNo">5675</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5675"></a>
-<span class="sourceLineNo">5676</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5676"></a>
-<span class="sourceLineNo">5677</span><a name="line.5677"></a>
-<span class="sourceLineNo">5678</span>      // Insert one row each region<a name="line.5678"></a>
-<span class="sourceLineNo">5679</span>      Put put = new Put(Bytes.toBytes("row"));<a name="line.5679"></a>
-<span class="sourceLineNo">5680</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5680"></a>
-<span class="sourceLineNo">5681</span>      table.put(put);<a name="line.5681"></a>
-<span class="sourceLineNo">5682</span><a name="line.5682"></a>
-<span class="sourceLineNo">5683</span>      List&lt;Result&gt; scanResults = new LinkedList&lt;&gt;();<a name="line.5683"></a>
-<span class="sourceLineNo">5684</span>      Scan scan = new Scan();<a name="line.5684"></a>
-<span class="sourceLineNo">5685</span>      scan.setFilter(new FilterList());<a name="line.5685"></a>
-<span class="sourceLineNo">5686</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.5686"></a>
-<span class="sourceLineNo">5687</span>        for (Result r : scanner) {<a name="line.5687"></a>
-<span class="sourceLineNo">5688</span>          scanResults.add(r);<a name="line.5688"></a>
-<span class="sourceLineNo">5689</span>        }<a name="line.5689"></a>
-<span class="sourceLineNo">5690</span>      }<a name="line.5690"></a>
-<span class="sourceLineNo">5691</span>      assertEquals(1, scanResults.size());<a name="line.5691"></a>
-<span class="sourceLineNo">5692</span>      Get g = new Get(Bytes.toBytes("row"));<a name="line.5692"></a>
-<span class="sourceLineNo">5693</span>      g.setFilter(new FilterList());<a name="line.5693"></a>
-<span class="sourceLineNo">5694</span>      Result getResult = table.get(g);<a name="line.5694"></a>
-<span class="sourceLineNo">5695</span>      Result scanResult = scanResults.get(0);<a name="line.5695"></a>
-<span class="sourceLineNo">5696</span>      assertEquals(scanResult.rawCells().length, getResult.rawCells().length);<a name="line.5696"></a>
-<span class="sourceLineNo">5697</span>      for (int i = 0; i != scanResult.rawCells().length; ++i) {<a name="line.5697"></a>
-<span class="sourceLineNo">5698</span>        Cell scanCell = scanResult.rawCells()[i];<a name="line.5698"></a>
-<span class="sourceLineNo">5699</span>        Cell getCell = getResult.rawCells()[i];<a name="line.5699"></a>
-<span class="sourceLineNo">5700</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneRow(scanCell),<a name="line.5700"></a>
-<span class="sourceLineNo">5701</span>                CellUtil.cloneRow(getCell)));<a name="line.5701"></a>
-<span class="sourceLineNo">5702</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneFamily(scanCell),<a name="line.5702"></a>
-<span class="sourceLineNo">5703</span>                CellUtil.cloneFamily(getCell)));<a name="line.5703"></a>
-<span class="sourceLineNo">5704</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneQualifier(scanCell),<a name="line.5704"></a>
-<span class="sourceLineNo">5705</span>                CellUtil.cloneQualifier(getCell)));<a name="line.5705"></a>
-<span class="sourceLineNo">5706</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(scanCell),<a name="line.5706"></a>
-<span class="sourceLineNo">5707</span>                CellUtil.cloneValue(getCell)));<a name="line.5707"></a>
-<span class="sourceLineNo">5708</span>      }<a name="line.5708"></a>
-<span class="sourceLineNo">5709</span>    }<a name="line.5709"></a>
-<span class="sourceLineNo">5710</span>  }<a name="line.5710"></a>
-<span class="sourceLineNo">5711</span><a name="line.5711"></a>
-<span class="sourceLineNo">5712</span>  @Test<a name="line.5712"></a>
-<span class="sourceLineNo">5713</span>  public void testSmallScan() throws Exception {<a name="line.5713"></a>
-<span class="sourceLineNo">5714</span>    // Test Initialization.<a name="line.5714"></a>
-<span class="sourceLineNo">5715</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5715"></a>
-<span class="sourceLineNo">5716</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5716"></a>
-<span class="sourceLineNo">5717</span><a name="line.5717"></a>
-<span class="sourceLineNo">5718</span>      // Insert one row each region<a name="line.5718"></a>
-<span class="sourceLineNo">5719</span>      int insertNum = 10;<a name="line.5719"></a>
-<span class="sourceLineNo">5720</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.5720"></a>
-<span class="sourceLineNo">5721</span>        Put put = new Put(Bytes.toBytes("row" + String.format("%03d", i)));<a name="line.5721"></a>
-<span class="sourceLineNo">5722</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5722"></a>
-<span class="sourceLineNo">5723</span>        table.put(put);<a name="line.5723"></a>
-<span class="sourceLineNo">5724</span>      }<a name="line.5724"></a>
-<span class="sourceLineNo">5725</span><a name="line.5725"></a>
-<span class="sourceLineNo">5726</span>      // normal scan<a name="line.5726"></a>
-<span class="sourceLineNo">5727</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.5727"></a>
-<span class="sourceLineNo">5728</span>        int count = 0;<a name="line.5728"></a>
-<span class="sourceLineNo">5729</span>        for (Result r : scanner) {<a name="line.5729"></a>
-<span class="sourceLineNo">5730</span>          assertTrue(!r.isEmpty());<a name="line.5730"></a>
-<span class="sourceLineNo">5731</span>          count++;<a name="line.5731"></a>
-<span class="sourceLineNo">5732</span>        }<a name="line.5732"></a>
-<span class="sourceLineNo">5733</span>        assertEquals(insertNum, count);<a name="line.5733"></a>
-<span class="sourceLineNo">5734</span>      }<a name="line.5734"></a>
-<span class="sourceLineNo">5735</span><a name="line.5735"></a>
-<span class="sourceLineNo">5736</span>      // small scan<a name="line.5736"></a>
-<span class="sourceLineNo">5737</span>      Scan scan = new Scan(HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW);<a name="line.5737"></a>
-<span class="sourceLineNo">5738</span>      scan.setSmall(true);<a name="line.5738"></a>
-<span class="sourceLineNo">5739</span>      scan.setCaching(2);<a name="line.5739"></a>
-<span class="sourceLineNo">5740</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.5740"></a>
-<span class="sourceLineNo">5741</span>        int count = 0;<a name="line.5741"></a>
-<span class="sourceLineNo">5742</span>        for (Result r : scanner) {<a name="line.5742"></a>
-<span class="sourceLineNo">5743</span>          assertTrue(!r.isEmpty());<a name="line.5743"></a>
-<span class="sourceLineNo">5744</span>          count++;<a name="line.5744"></a>
-<span class="sourceLineNo">5745</span>        }<a name="line.5745"></a>
-<span class="sourceLineNo">5746</span>        assertEquals(insertNum, count);<a name="line.5746"></a>
-<span class="sourceLineNo">5747</span>      }<a name="line.5747"></a>
-<span class="sourceLineNo">5748</span>    }<a name="line.5748"></a>
-<span class="sourceLineNo">5749</span>  }<a name="line.5749"></a>
-<span class="sourceLineNo">5750</span><a name="line.5750"></a>
-<span class="sourceLineNo">5751</span>  @Test<a name="line.5751"></a>
-<span class="sourceLineNo">5752</span>  public void testSuperSimpleWithReverseScan() throws Exception {<a name="line.5752"></a>
-<span class="sourceLineNo">5753</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5753"></a>
-<span class="sourceLineNo">5754</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5754"></a>
-<span class="sourceLineNo">5755</span>      Put put = new Put(Bytes.toBytes("0-b11111-0000000000000000000"));<a name="line.5755"></a>
-<span class="sourceLineNo">5756</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5756"></a>
-<span class="sourceLineNo">5757</span>      ht.put(put);<a name="line.5757"></a>
-<span class="sourceLineNo">5758</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000002"));<a name="line.5758"></a>
-<span class="sourceLineNo">5759</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5759"></a>
-<span class="sourceLineNo">5760</span>      ht.put(put);<a name="line.5760"></a>
-<span class="sourceLineNo">5761</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000004"));<a name="line.5761"></a>
-<span class="sourceLineNo">5762</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5762"></a>
-<span class="sourceLineNo">5763</span>      ht.put(put);<a name="line.5763"></a>
-<span class="sourceLineNo">5764</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000006"));<a name="line.5764"></a>
-<span class="sourceLineNo">5765</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5765"></a>
-<span class="sourceLineNo">5766</span>      ht.put(put);<a name="line.5766"></a>
-<span class="sourceLineNo">5767</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000008"));<a name="line.5767"></a>
-<span class="sourceLineNo">5768</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5768"></a>
-<span class="sourceLineNo">5769</span>      ht.put(put);<a name="line.5769"></a>
-<span class="sourceLineNo">5770</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000001"));<a name="line.5770"></a>
-<span class="sourceLineNo">5771</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5771"></a>
-<span class="sourceLineNo">5772</span>      ht.put(put);<a name="line.5772"></a>
-<span class="sourceLineNo">5773</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000003"));<a name="line.5773"></a>
-<span class="sourceLineNo">5774</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5774"></a>
-<span class="sourceLineNo">5775</span>      ht.put(put);<a name="line.5775"></a>
-<span class="sourceLineNo">5776</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000005"));<a name="line.5776"></a>
-<span class="sourceLineNo">5777</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5777"></a>
-<span class="sourceLineNo">5778</span>      ht.put(put);<a name="line.5778"></a>
-<span class="sourceLineNo">5779</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000007"));<a name="line.5779"></a>
-<span class="sourceLineNo">5780</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5780"></a>
-<span class="sourceLineNo">5781</span>      ht.put(put);<a name="line.5781"></a>
-<span class="sourceLineNo">5782</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000009"));<a name="line.5782"></a>
-<span class="sourceLineNo">5783</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5783"></a>
-<span class="sourceLineNo">5784</span>      ht.put(put);<a name="line.5784"></a>
-<span class="sourceLineNo">5785</span>      Scan scan = new Scan(Bytes.toBytes("0-b11111-9223372036854775807"),<a name="line.5785"></a>
-<span class="sourceLineNo">5786</span>              Bytes.toBytes("0-b11111-0000000000000000000"));<a name="line.5786"></a>
-<span class="sourceLineNo">5787</span>      scan.setReversed(true);<a name="line.5787"></a>
-<span class="sourceLineNo">5788</span>      try (ResultScanner scanner = ht.getScanner(scan)) {<a name="line.5788"></a>
-<span class="sourceLineNo">5789</span>        Result result = scanner.next();<a name="line.5789"></a>
-<span class="sourceLineNo">5790</span>        assertTrue(Bytes.equals(result.getRow(),<a name="line.5790"></a>
-<span class="sourceLineNo">5791</span>                Bytes.toBytes("0-b11111-0000000000000000008")));<a name="line.5791"></a>
-<span class="sourceLineNo">5792</span>      }<a name="line.5792"></a>
-<span class="sourceLineNo">5793</span>    }<a name="line.5793"></a>
-<span class="sourceLineNo">5794</span>  }<a name="line.5794"></a>
-<span class="sourceLineNo">5795</span><a name="line.5795"></a>
-<span class="sourceLineNo">5796</span>  @Test<a name="line.5796"></a>
-<span class="sourceLineNo">5797</span>  public void testFiltersWithReverseScan() throws Exception {<a name="line.5797"></a>
-<span class="sourceLineNo">5798</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5798"></a>
-<span class="sourceLineNo">5799</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5799"></a>
-<span class="sourceLineNo">5800</span>      byte[][] ROWS = makeN(ROW, 10);<a name="line.5800"></a>
-<span class="sourceLineNo">5801</span>      byte[][] QUALIFIERS = {Bytes.toBytes("col0-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5801"></a>
-<span class="sourceLineNo">5802</span>              Bytes.toBytes("col1-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5802"></a>
-<span class="sourceLineNo">5803</span>              Bytes.toBytes("col2-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5803"></a>
-<span class="sourceLineNo">5804</span>              Bytes.toBytes("col3-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5804"></a>
-<span class="sourceLineNo">5805</span>              Bytes.toBytes("col4-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5805"></a>
-<span class="sourceLineNo">5806</span>              Bytes.toBytes("col5-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5806"></a>
-<span class="sourceLineNo">5807</span>              Bytes.toBytes("col6-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5807"></a>
-<span class="sourceLineNo">5808</span>              Bytes.toBytes("col7-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5808"></a>
-<span class="sourceLineNo">5809</span>              Bytes.toBytes("col8-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5809"></a>
-<span class="sourceLineNo">5810</span>              Bytes.toBytes("col9-&lt;d2v1&gt;-&lt;d3v2&gt;")};<a name="line.5810"></a>
-<span class="sourceLineNo">5811</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.5811"></a>
-<span class="sourceLineNo">5812</span>        Put put = new Put(ROWS[i]);<a name="line.5812"></a>
-<span class="sourceLineNo">5813</span>        put.addColumn(FAMILY, QUALIFIERS[i], VALUE);<a name="line.5813"></a>
-<span class="sourceLineNo">5814</span>        ht.put(put);<a name="line.5814"></a>
-<span class="sourceLineNo">5815</span>      }<a name="line.5815"></a>
-<span class="sourceLineNo">5816</span>      Scan scan = new Scan();<a name="line.5816"></a>
-<span class="sourceLineNo">5817</span>      scan.setReversed(true);<a name="line.5817"></a>
-<span class="sourceLineNo">5818</span>      scan.addFamily(FAMILY);<a name="line.5818"></a>
-<span class="sourceLineNo">5819</span>      Filter filter = new QualifierFilter(CompareOperator.EQUAL,<a name="line.5819"></a>
-<span class="sourceLineNo">5820</span>              new RegexStringComparator("col[1-5]"));<a name="line.5820"></a>
-<span class="sourceLineNo">5821</span>      scan.setFilter(filter);<a name="line.5821"></a>
-<span class="sourceLineNo">5822</span>      try (ResultScanner scanner = ht.getScanner(scan)) {<a name="line.5822"></a>
-<span class="sourceLineNo">5823</span>        int expectedIndex = 5;<a name="line.5823"></a>
-<span class="sourceLineNo">5824</span>        for (Result result : scanner) {<a name="line.5824"></a>
-<span class="sourceLineNo">5825</span>          assertEquals(1, result.size());<a name="line.5825"></a>
-<span class="sourceLineNo">5826</span>          Cell c = result.rawCells()[0];<a name="line.5826"></a>
-<span class="sourceLineNo">5827</span>          assertTrue(Bytes.equals(c.getRowArray(), c.getRowOffset(), c.getRowLength(),<a name="line.5827"></a>
-<span class="sourceLineNo">5828</span>                  ROWS[expectedIndex], 0, ROWS[expectedIndex].length));<a name="line.5828"></a>
-<span class="sourceLineNo">5829</span>          assertTrue(Bytes.equals(c.getQualifierArray(), c.getQualifierOffset(),<a name="line.5829"></a>
-<span class="sourceLineNo">5830</span>                  c.getQualifierLength(), QUALIFIERS[expectedIndex], 0,<a name="line.5830"></a>
-<span class="sourceLineNo">5831</span>                  QUALIFIERS[expectedIndex].length));<a name="line.5831"></a>
-<span class="sourceLineNo">5832</span>          expectedIndex--;<a name="line.5832"></a>
-<span class="sourceLineNo">5833</span>        }<a name="line.5833"></a>
-<span class="sourceLineNo">5834</span>        assertEquals(0, expectedIndex);<a name="line.5834"></a>
-<span class="sourceLineNo">5835</span>      }<a name="line.5835"></a>
-<span class="sourceLineNo">5836</span>    }<a name="line.5836"></a>
-<span class="sourceLineNo">5837</span>  }<a name="line.5837"></a>
-<span class="sourceLineNo">5838</span><a name="line.5838"></a>
-<span class="sourceLineNo">5839</span>  @Test<a name="line.5839"></a>
-<span class="sourceLineNo">5840</span>  public void testKeyOnlyFilterWithReverseScan() throws Exception {<a name="line.5840"></a>
-<span class="sourceLineNo">5841</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5841"></a>
-<span class="sourceLineNo">5842</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5842"></a>
-<span class="sourceLineNo">5843</span>      byte[][] ROWS = makeN(ROW, 10);<a name="line.5843"></a>
-<span class="sourceLineNo">5844</span>      byte[][] QUALIFIERS = {Bytes.toBytes("col0-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5844"></a>
-<span class="sourceLineNo">5845</span>              Bytes.toBytes("col1-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5845"></a>
-<span class="sourceLineNo">5846</span>              Bytes.toBytes("col2-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5846"></a>
-<span class="sourceLineNo">5847</span>              Bytes.toBytes("col3-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5847"></a>
-<span class="sourceLineNo">5848</span>              Bytes.toBytes("col4-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5848"></a>
-<span class="sourceLineNo">5849</span>              Bytes.toBytes("col5-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5849"></a>
-<span class="sourceLineNo">5850</span>              Bytes.toBytes("col6-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5850"></a>
-<span class="sourceLineNo">5851</span>              Bytes.toBytes("col7-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5851"></a>
-<span class="sourceLineNo">5852</span>              Bytes.toBytes("col8-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5852"></a>
-<span class="sourceLineNo">5853</span>              Bytes.toBytes("col9-&lt;d2v1&gt;-&lt;d3v2&gt;")};<a name="line.5853"></a>
-<span class="sourceLineNo">5854</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.5854"></a>
-<span class="sourceLineNo">5855</span>        Put put = new Put(ROWS[i]);<a name="line.5855"></a>
-<span class="sourceLineNo">5856</span>        put.addColumn(FAMILY, QUALIFIERS[i], VALUE);<a name="line.5856"></a>
-<span class="sourceLineNo">5857</span>        ht.put(put);<a name="line.5857"></a>
-<span class="sourceLineNo">5858</span>      }<a name="line.5858"></a>
-<span class="sourceLineNo">5859</span>      Scan scan = new Scan();<a name="line.5859"></a>
-<span class="sourceLineNo">5860</span>      scan.setReversed(true);<a name="line.5860"></a>
-<span class="sourceLineNo">5861</span>      scan.addFamily(FAMILY);<a name="line.5861"></a>
-<span class="sourceLineNo">5862</span>      Filter filter = new KeyOnlyFilter(true);<a name="line.5862"></a>
-<span class="sourceLineNo">5863</span>      scan.setFilter(filter);<a name="line.5863"></a>
-<span class="sourceLineNo">5864</span>      try (ResultScanner scanner = ht.getScanner(scan)) {<a name="line.5864"></a>
-<span class="sourceLineNo">5865</span>        int count = 0;<a name="line.5865"></a>
-<span class="sourceLineNo">5866</span>        for (Result result : ht.getScanner(scan)) {<a name="line.5866"></a>
-<span class="sourceLineNo">5867</span>          assertEquals(1, result.size());<a name="line.5867"></a>
-<span class="sourceLineNo">5868</span>          assertEquals(Bytes.SIZEOF_INT, result.rawCells()[0].getValueLength());<a name="line.5868"></a>
-<span class="sourceLineNo">5869</span>          assertEquals(VALUE.length, Bytes.toInt(CellUtil.cloneValue(result.rawCells()[0])));<a name="line.5869"></a>
-<span class="sourceLineNo">5870</span>          count++;<a name="line.5870"></a>
-<span class="sourceLineNo">5871</span>        }<a name="line.5871"></a>
-<span class="sourceLineNo">5872</span>        assertEquals(10, count);<a name="line.5872"></a>
-<span class="sourceLineNo">5873</span>      }<a name="line.5873"></a>
-<span class="sourceLineNo">5874</span>    }<a name="line.5874"></a>
-<span class="sourceLineNo">5875</span>  }<a name="line.5875"></a>
-<span class="sourceLineNo">5876</span><a name="line.5876"></a>
-<span class="sourceLineNo">5877</span>  /**<a name="line.5877"></a>
-<span class="sourceLineNo">5878</span>   * Test simple table and non-existent row cases.<a name="line.5878"></a>
-<span class="sourceLineNo">5879</span>   */<a name="line.5879"></a>
-<span class="sourceLineNo">5880</span>  @Test<a name="line.5880"></a>
-<span class="sourceLineNo">5881</span>  public void testSimpleMissingWithReverseScan() throws Exception {<a name="line.5881"></a>
-<span class="sourceLineNo">5882</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5882"></a>
-<span class="sourceLineNo">5883</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5883"></a>
-<span class="sourceLineNo">5884</span>      byte[][] ROWS = makeN(ROW, 4);<a name="line.5884"></a>
-<span class="sourceLineNo">5885</span><a name="line.5885"></a>
-<span class="sourceLineNo">5886</span>      // Try to get a row on an empty table<a name="line.5886"></a>
-<span class="sourceLineNo">5887</span>      Scan scan = new Scan();<a name="line.5887"></a>
-<span class="sourceLineNo">5888</span>      scan.setReversed(true);<a name="line.5888"></a>
-<span class="sourceLineNo">5889</span>      Result result = getSingleScanResult(ht, scan);<a name="line.5889"></a>
-<span class="sourceLineNo">5890</span>      assertNullResult(result);<a name="line.5890"></a>
-<span class="sourceLineNo">5891</span><a name="line.5891"></a>
-<span class="sourceLineNo">5892</span>      scan = new Scan(ROWS[0]);<a name="line.5892"></a>
-<span class="sourceLineNo">5893</span>      scan.setReversed(true);<a name="line.5893"></a>
-<span class="sourceLineNo">5894</span>      result = getSingleScanResult(ht, scan);<a name="line.5894"></a>
-<span class="sourceLineNo">5895</span>      assertNullResult(result);<a name="line.5895"></a>
-<span class="sourceLineNo">5896</span><a name="line.5896"></a>
-<span class="sourceLineNo">5897</span>      scan = new Scan(ROWS[0], ROWS[1]);<a name="line.5897"></a>
-<span class="sourceLineNo">5898</span>      scan.setReversed(true);<a name="line.5898"></a>
-<span class="sourceLineNo">5899</span>      result = getSingleScanResult(ht, scan);<a name="line.5899"></a>
-<span class="sourceLineNo">5900</span>      assertNullResult(result);<a name="line.5900"></a>
-<span class="sourceLineNo">5901</span><a name="line.5901"></a>
-<span class="sourceLineNo">5902</span>      scan = new Scan();<a name="line.5902"></a>
-<span class="sourceLineNo">5903</span>      scan.setReversed(true);<a name="line.5903"></a>
-<span class="sourceLineNo">5904</span>      scan.addFamily(FAMILY);<a name="line.5904"></a>
-<span class="sourceLineNo">5905</span>      result = getSingleScanResult(ht, scan);<a name="line.5905"></a>
-<span class="sourceLineNo">5906</span>      assertNullResult(result);<a name="line.5906"></a>
-<span class="sourceLineNo">5907</span><a name="line.5907"></a>
-<span class="sourceLineNo">5908</span>      scan = new Scan();<a name="line.5908"></a>
-<span class="sourceLineNo">5909</span>      scan.setReversed(true);<a name="line.5909"></a>
-<span class="sourceLineNo">5910</span>      scan.addColumn(FAMILY, QUALIFIER);<a name="line.5910"></a>
-<span class="sourceLineNo">5911</span>      result = getSingleScanResult(ht, scan);<a name="line.5911"></a>
-<span class="sourceLineNo">5912</span>      assertNullResult(result);<a name="line.5912"></a>
-<span class="sourceLineNo">5913</span><a name="line.5913"></a>
-<span class="sourceLineNo">5914</span>      // Insert a row<a name="line.5914"></a>
-<span class="sourceLineNo">5915</span><a name="line.5915"></a>
-<span class="sourceLineNo">5916</span>      Put put = new Put(ROWS[2]);<a name="line.5916"></a>
-<span class="sourceLineNo">5917</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5917"></a>
-<span class="sourceLineNo">5918</span>      ht.put(put);<a name="line.5918"></a>
-<span class="sourceLineNo">5919</span><a name="line.5919"></a>
-<span class="sourceLineNo">5920</span>      // Make sure we can scan the row<a name="line.5920"></a>
-<span class="sourceLineNo">5921</span>      scan = new Scan();<a name="line.5921"></a>
-<span class="sourceLineNo">5922</span>      scan.setReversed(true);<a name="line.5922"></a>
-<span class="sourceLineNo">5923</span>      result = getSingleScanResult(ht, scan);<a name="line.5923"></a>
-<span class="sourceLineNo">5924</span>      assertSingleResult(result, ROWS[2], FAMILY, QUALIFIER, VALUE);<a name="line.5924"></a>
-<span class="sourceLineNo">5925</span><a name="line.5925"></a>
-<span class="sourceLineNo">5926</span>      scan = new Scan(ROWS[3], ROWS[0]);<a name="line.5926"></a>
-<span class="sourceLineNo">5927</span>      scan.setReversed(true);<a name="line.5927"></a>
-<span class="sourceLineNo">5928</span>      result = getSingleScanResult(ht, scan);<a name="line.5928"></a>
-<span class="sourceLineNo">5929</span>      assertSingleResult(result, ROWS[2], FAMILY, QUALIFIER, VALUE);<a name="line.5929"></a>
-<span class="sourceLineNo">5930</span><a name="line.5930"></a>
-<span class="sourceLineNo">5931</span>      scan = new Scan(ROWS[2], ROWS[1]);<a name="line.5931"></a>
-<span class="sourceLineNo">5932</span>      scan.setReversed(true);<a name="line.5932"></a>
-<span class="sourceLineNo">5933</span>      result = getSingleScanResult(ht, scan);<a name="line.5933"></a>
-<span class="sourceLineNo">5934</span>      assertSingleResult(result, ROWS[2], FAMILY, QUALIFIER, VALUE);<a name="line.5934"></a>
-<span class="sourceLineNo">5935</span><a name="line.5935"></a>
-<span class="sourceLineNo">5936</span>      // Try to scan empty rows around it<a name="line.5936"></a>
-<span class="sourceLineNo">5937</span>      // Introduced MemStore#shouldSeekForReverseScan to fix the following<a name="line.5937"></a>
-<span class="sourceLineNo">5938</span>      scan = new Scan(ROWS[1]);<a name="line.5938"></a>
+<span class="sourceLineNo">5653</span>      p = new Put(row);<a name="line.5653"></a>
+<span class="sourceLineNo">5654</span>      p.addColumn(FAMILY, QUALIFIER, 13, ArrayUtils.add(VALUE, (byte) 4));<a name="line.5654"></a>
+<span class="sourceLineNo">5655</span>      table.put(p);<a name="line.5655"></a>
+<span class="sourceLineNo">5656</span><a name="line.5656"></a>
+<span class="sourceLineNo">5657</span>      int versions = 4;<a name="line.5657"></a>
+<span class="sourceLineNo">5658</span>      Scan s = new Scan(row);<a name="line.5658"></a>
+<span class="sourceLineNo">5659</span>      // get all the possible versions<a name="line.5659"></a>
+<span class="sourceLineNo">5660</span>      s.setMaxVersions();<a name="line.5660"></a>
+<span class="sourceLineNo">5661</span>      s.setRaw(true);<a name="line.5661"></a>
+<span class="sourceLineNo">5662</span><a name="line.5662"></a>
+<span class="sourceLineNo">5663</span>      try (ResultScanner scanner = table.getScanner(s)) {<a name="line.5663"></a>
+<span class="sourceLineNo">5664</span>        int count = 0;<a name="line.5664"></a>
+<span class="sourceLineNo">5665</span>        for (Result r : scanner) {<a name="line.5665"></a>
+<span class="sourceLineNo">5666</span>          assertEquals("Found an unexpected number of results for the row!", versions,<a name="line.5666"></a>
+<span class="sourceLineNo">5667</span>                  r.listCells().size());<a name="line.5667"></a>
+<span class="sourceLineNo">5668</span>          count++;<a name="line.5668"></a>
+<span class="sourceLineNo">5669</span>        }<a name="line.5669"></a>
+<span class="sourceLineNo">5670</span>        assertEquals("Found more than a single row when raw scanning the table with a single row!",<a name="line.5670"></a>
+<span class="sourceLineNo">5671</span>                1, count);<a name="line.5671"></a>
+<span class="sourceLineNo">5672</span>      }<a name="line.5672"></a>
+<span class="sourceLineNo">5673</span><a name="line.5673"></a>
+<span class="sourceLineNo">5674</span>      // then if we decrease the number of versions, but keep the scan raw, we should see exactly<a name="line.5674"></a>
+<span class="sourceLineNo">5675</span>      // that number of versions<a name="line.5675"></a>
+<span class="sourceLineNo">5676</span>      versions = 2;<a name="line.5676"></a>
+<span class="sourceLineNo">5677</span>      s.setMaxVersions(versions);<a name="line.5677"></a>
+<span class="sourceLineNo">5678</span>      try (ResultScanner scanner = table.getScanner(s)) {<a name="line.5678"></a>
+<span class="sourceLineNo">5679</span>        int count = 0;<a name="line.5679"></a>
+<span class="sourceLineNo">5680</span>        for (Result r : scanner) {<a name="line.5680"></a>
+<span class="sourceLineNo">5681</span>          assertEquals("Found an unexpected number of results for the row!", versions,<a name="line.5681"></a>
+<span class="sourceLineNo">5682</span>                  r.listCells().size());<a name="line.5682"></a>
+<span class="sourceLineNo">5683</span>          count++;<a name="line.5683"></a>
+<span class="sourceLineNo">5684</span>        }<a name="line.5684"></a>
+<span class="sourceLineNo">5685</span>        assertEquals("Found more than a single row when raw scanning the table with a single row!",<a name="line.5685"></a>
+<span class="sourceLineNo">5686</span>                1, count);<a name="line.5686"></a>
+<span class="sourceLineNo">5687</span>      }<a name="line.5687"></a>
+<span class="sourceLineNo">5688</span><a name="line.5688"></a>
+<span class="sourceLineNo">5689</span>      // finally, if we turn off raw scanning, but max out the number of versions, we should go back<a name="line.5689"></a>
+<span class="sourceLineNo">5690</span>      // to seeing just three<a name="line.5690"></a>
+<span class="sourceLineNo">5691</span>      versions = 3;<a name="line.5691"></a>
+<span class="sourceLineNo">5692</span>      s.setMaxVersions(versions);<a name="line.5692"></a>
+<span class="sourceLineNo">5693</span>      try (ResultScanner scanner = table.getScanner(s)) {<a name="line.5693"></a>
+<span class="sourceLineNo">5694</span>        int count = 0;<a name="line.5694"></a>
+<span class="sourceLineNo">5695</span>        for (Result r : scanner) {<a name="line.5695"></a>
+<span class="sourceLineNo">5696</span>          assertEquals("Found an unexpected number of results for the row!", versions,<a name="line.5696"></a>
+<span class="sourceLineNo">5697</span>                  r.listCells().size());<a name="line.5697"></a>
+<span class="sourceLineNo">5698</span>          count++;<a name="line.5698"></a>
+<span class="sourceLineNo">5699</span>        }<a name="line.5699"></a>
+<span class="sourceLineNo">5700</span>        assertEquals("Found more than a single row when raw scanning the table with a single row!",<a name="line.5700"></a>
+<span class="sourceLineNo">5701</span>                1, count);<a name="line.5701"></a>
+<span class="sourceLineNo">5702</span>      }<a name="line.5702"></a>
+<span class="sourceLineNo">5703</span><a name="line.5703"></a>
+<span class="sourceLineNo">5704</span>    }<a name="line.5704"></a>
+<span class="sourceLineNo">5705</span>    TEST_UTIL.deleteTable(tableName);<a name="line.5705"></a>
+<span class="sourceLineNo">5706</span>  }<a name="line.5706"></a>
+<span class="sourceLineNo">5707</span><a name="line.5707"></a>
+<span class="sourceLineNo">5708</span>  @Test<a name="line.5708"></a>
+<span class="sourceLineNo">5709</span>  public void testEmptyFilterList() throws Exception {<a name="line.5709"></a>
+<span class="sourceLineNo">5710</span>    // Test Initialization.<a name="line.5710"></a>
+<span class="sourceLineNo">5711</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5711"></a>
+<span class="sourceLineNo">5712</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5712"></a>
+<span class="sourceLineNo">5713</span><a name="line.5713"></a>
+<span class="sourceLineNo">5714</span>      // Insert one row each region<a name="line.5714"></a>
+<span class="sourceLineNo">5715</span>      Put put = new Put(Bytes.toBytes("row"));<a name="line.5715"></a>
+<span class="sourceLineNo">5716</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5716"></a>
+<span class="sourceLineNo">5717</span>      table.put(put);<a name="line.5717"></a>
+<span class="sourceLineNo">5718</span><a name="line.5718"></a>
+<span class="sourceLineNo">5719</span>      List&lt;Result&gt; scanResults = new LinkedList&lt;&gt;();<a name="line.5719"></a>
+<span class="sourceLineNo">5720</span>      Scan scan = new Scan();<a name="line.5720"></a>
+<span class="sourceLineNo">5721</span>      scan.setFilter(new FilterList());<a name="line.5721"></a>
+<span class="sourceLineNo">5722</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.5722"></a>
+<span class="sourceLineNo">5723</span>        for (Result r : scanner) {<a name="line.5723"></a>
+<span class="sourceLineNo">5724</span>          scanResults.add(r);<a name="line.5724"></a>
+<span class="sourceLineNo">5725</span>        }<a name="line.5725"></a>
+<span class="sourceLineNo">5726</span>      }<a name="line.5726"></a>
+<span class="sourceLineNo">5727</span>      assertEquals(1, scanResults.size());<a name="line.5727"></a>
+<span class="sourceLineNo">5728</span>      Get g = new Get(Bytes.toBytes("row"));<a name="line.5728"></a>
+<span class="sourceLineNo">5729</span>      g.setFilter(new FilterList());<a name="line.5729"></a>
+<span class="sourceLineNo">5730</span>      Result getResult = table.get(g);<a name="line.5730"></a>
+<span class="sourceLineNo">5731</span>      Result scanResult = scanResults.get(0);<a name="line.5731"></a>
+<span class="sourceLineNo">5732</span>      assertEquals(scanResult.rawCells().length, getResult.rawCells().length);<a name="line.5732"></a>
+<span class="sourceLineNo">5733</span>      for (int i = 0; i != scanResult.rawCells().length; ++i) {<a name="line.5733"></a>
+<span class="sourceLineNo">5734</span>        Cell scanCell = scanResult.rawCells()[i];<a name="line.5734"></a>
+<span class="sourceLineNo">5735</span>        Cell getCell = getResult.rawCells()[i];<a name="line.5735"></a>
+<span class="sourceLineNo">5736</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneRow(scanCell),<a name="line.5736"></a>
+<span class="sourceLineNo">5737</span>                CellUtil.cloneRow(getCell)));<a name="line.5737"></a>
+<span class="sourceLineNo">5738</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneFamily(scanCell),<a name="line.5738"></a>
+<span class="sourceLineNo">5739</span>                CellUtil.cloneFamily(getCell)));<a name="line.5739"></a>
+<span class="sourceLineNo">5740</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneQualifier(scanCell),<a name="line.5740"></a>
+<span class="sourceLineNo">5741</span>                CellUtil.cloneQualifier(getCell)));<a name="line.5741"></a>
+<span class="sourceLineNo">5742</span>        assertEquals(0, Bytes.compareTo(CellUtil.cloneValue(scanCell),<a name="line.5742"></a>
+<span class="sourceLineNo">5743</span>                CellUtil.cloneValue(getCell)));<a name="line.5743"></a>
+<span class="sourceLineNo">5744</span>      }<a name="line.5744"></a>
+<span class="sourceLineNo">5745</span>    }<a name="line.5745"></a>
+<span class="sourceLineNo">5746</span>  }<a name="line.5746"></a>
+<span class="sourceLineNo">5747</span><a name="line.5747"></a>
+<span class="sourceLineNo">5748</span>  @Test<a name="line.5748"></a>
+<span class="sourceLineNo">5749</span>  public void testSmallScan() throws Exception {<a name="line.5749"></a>
+<span class="sourceLineNo">5750</span>    // Test Initialization.<a name="line.5750"></a>
+<span class="sourceLineNo">5751</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5751"></a>
+<span class="sourceLineNo">5752</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5752"></a>
+<span class="sourceLineNo">5753</span><a name="line.5753"></a>
+<span class="sourceLineNo">5754</span>      // Insert one row each region<a name="line.5754"></a>
+<span class="sourceLineNo">5755</span>      int insertNum = 10;<a name="line.5755"></a>
+<span class="sourceLineNo">5756</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.5756"></a>
+<span class="sourceLineNo">5757</span>        Put put = new Put(Bytes.toBytes("row" + String.format("%03d", i)));<a name="line.5757"></a>
+<span class="sourceLineNo">5758</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5758"></a>
+<span class="sourceLineNo">5759</span>        table.put(put);<a name="line.5759"></a>
+<span class="sourceLineNo">5760</span>      }<a name="line.5760"></a>
+<span class="sourceLineNo">5761</span><a name="line.5761"></a>
+<span class="sourceLineNo">5762</span>      // normal scan<a name="line.5762"></a>
+<span class="sourceLineNo">5763</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.5763"></a>
+<span class="sourceLineNo">5764</span>        int count = 0;<a name="line.5764"></a>
+<span class="sourceLineNo">5765</span>        for (Result r : scanner) {<a name="line.5765"></a>
+<span class="sourceLineNo">5766</span>          assertTrue(!r.isEmpty());<a name="line.5766"></a>
+<span class="sourceLineNo">5767</span>          count++;<a name="line.5767"></a>
+<span class="sourceLineNo">5768</span>        }<a name="line.5768"></a>
+<span class="sourceLineNo">5769</span>        assertEquals(insertNum, count);<a name="line.5769"></a>
+<span class="sourceLineNo">5770</span>      }<a name="line.5770"></a>
+<span class="sourceLineNo">5771</span><a name="line.5771"></a>
+<span class="sourceLineNo">5772</span>      // small scan<a name="line.5772"></a>
+<span class="sourceLineNo">5773</span>      Scan scan = new Scan(HConstants.EMPTY_START_ROW, HConstants.EMPTY_END_ROW);<a name="line.5773"></a>
+<span class="sourceLineNo">5774</span>      scan.setSmall(true);<a name="line.5774"></a>
+<span class="sourceLineNo">5775</span>      scan.setCaching(2);<a name="line.5775"></a>
+<span class="sourceLineNo">5776</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.5776"></a>
+<span class="sourceLineNo">5777</span>        int count = 0;<a name="line.5777"></a>
+<span class="sourceLineNo">5778</span>        for (Result r : scanner) {<a name="line.5778"></a>
+<span class="sourceLineNo">5779</span>          assertTrue(!r.isEmpty());<a name="line.5779"></a>
+<span class="sourceLineNo">5780</span>          count++;<a name="line.5780"></a>
+<span class="sourceLineNo">5781</span>        }<a name="line.5781"></a>
+<span class="sourceLineNo">5782</span>        assertEquals(insertNum, count);<a name="line.5782"></a>
+<span class="sourceLineNo">5783</span>      }<a name="line.5783"></a>
+<span class="sourceLineNo">5784</span>    }<a name="line.5784"></a>
+<span class="sourceLineNo">5785</span>  }<a name="line.5785"></a>
+<span class="sourceLineNo">5786</span><a name="line.5786"></a>
+<span class="sourceLineNo">5787</span>  @Test<a name="line.5787"></a>
+<span class="sourceLineNo">5788</span>  public void testSuperSimpleWithReverseScan() throws Exception {<a name="line.5788"></a>
+<span class="sourceLineNo">5789</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5789"></a>
+<span class="sourceLineNo">5790</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5790"></a>
+<span class="sourceLineNo">5791</span>      Put put = new Put(Bytes.toBytes("0-b11111-0000000000000000000"));<a name="line.5791"></a>
+<span class="sourceLineNo">5792</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5792"></a>
+<span class="sourceLineNo">5793</span>      ht.put(put);<a name="line.5793"></a>
+<span class="sourceLineNo">5794</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000002"));<a name="line.5794"></a>
+<span class="sourceLineNo">5795</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5795"></a>
+<span class="sourceLineNo">5796</span>      ht.put(put);<a name="line.5796"></a>
+<span class="sourceLineNo">5797</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000004"));<a name="line.5797"></a>
+<span class="sourceLineNo">5798</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5798"></a>
+<span class="sourceLineNo">5799</span>      ht.put(put);<a name="line.5799"></a>
+<span class="sourceLineNo">5800</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000006"));<a name="line.5800"></a>
+<span class="sourceLineNo">5801</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5801"></a>
+<span class="sourceLineNo">5802</span>      ht.put(put);<a name="line.5802"></a>
+<span class="sourceLineNo">5803</span>      put = new Put(Bytes.toBytes("0-b11111-0000000000000000008"));<a name="line.5803"></a>
+<span class="sourceLineNo">5804</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5804"></a>
+<span class="sourceLineNo">5805</span>      ht.put(put);<a name="line.5805"></a>
+<span class="sourceLineNo">5806</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000001"));<a name="line.5806"></a>
+<span class="sourceLineNo">5807</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5807"></a>
+<span class="sourceLineNo">5808</span>      ht.put(put);<a name="line.5808"></a>
+<span class="sourceLineNo">5809</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000003"));<a name="line.5809"></a>
+<span class="sourceLineNo">5810</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5810"></a>
+<span class="sourceLineNo">5811</span>      ht.put(put);<a name="line.5811"></a>
+<span class="sourceLineNo">5812</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000005"));<a name="line.5812"></a>
+<span class="sourceLineNo">5813</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5813"></a>
+<span class="sourceLineNo">5814</span>      ht.put(put);<a name="line.5814"></a>
+<span class="sourceLineNo">5815</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000007"));<a name="line.5815"></a>
+<span class="sourceLineNo">5816</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5816"></a>
+<span class="sourceLineNo">5817</span>      ht.put(put);<a name="line.5817"></a>
+<span class="sourceLineNo">5818</span>      put = new Put(Bytes.toBytes("0-b22222-0000000000000000009"));<a name="line.5818"></a>
+<span class="sourceLineNo">5819</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5819"></a>
+<span class="sourceLineNo">5820</span>      ht.put(put);<a name="line.5820"></a>
+<span class="sourceLineNo">5821</span>      Scan scan = new Scan(Bytes.toBytes("0-b11111-9223372036854775807"),<a name="line.5821"></a>
+<span class="sourceLineNo">5822</span>              Bytes.toBytes("0-b11111-0000000000000000000"));<a name="line.5822"></a>
+<span class="sourceLineNo">5823</span>      scan.setReversed(true);<a name="line.5823"></a>
+<span class="sourceLineNo">5824</span>      try (ResultScanner scanner = ht.getScanner(scan)) {<a name="line.5824"></a>
+<span class="sourceLineNo">5825</span>        Result result = scanner.next();<a name="line.5825"></a>
+<span class="sourceLineNo">5826</span>        assertTrue(Bytes.equals(result.getRow(),<a name="line.5826"></a>
+<span class="sourceLineNo">5827</span>                Bytes.toBytes("0-b11111-0000000000000000008")));<a name="line.5827"></a>
+<span class="sourceLineNo">5828</span>      }<a name="line.5828"></a>
+<span class="sourceLineNo">5829</span>    }<a name="line.5829"></a>
+<span class="sourceLineNo">5830</span>  }<a name="line.5830"></a>
+<span class="sourceLineNo">5831</span><a name="line.5831"></a>
+<span class="sourceLineNo">5832</span>  @Test<a name="line.5832"></a>
+<span class="sourceLineNo">5833</span>  public void testFiltersWithReverseScan() throws Exception {<a name="line.5833"></a>
+<span class="sourceLineNo">5834</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5834"></a>
+<span class="sourceLineNo">5835</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5835"></a>
+<span class="sourceLineNo">5836</span>      byte[][] ROWS = makeN(ROW, 10);<a name="line.5836"></a>
+<span class="sourceLineNo">5837</span>      byte[][] QUALIFIERS = {Bytes.toBytes("col0-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5837"></a>
+<span class="sourceLineNo">5838</span>              Bytes.toBytes("col1-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5838"></a>
+<span class="sourceLineNo">5839</span>              Bytes.toBytes("col2-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5839"></a>
+<span class="sourceLineNo">5840</span>              Bytes.toBytes("col3-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5840"></a>
+<span class="sourceLineNo">5841</span>              Bytes.toBytes("col4-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5841"></a>
+<span class="sourceLineNo">5842</span>              Bytes.toBytes("col5-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5842"></a>
+<span class="sourceLineNo">5843</span>              Bytes.toBytes("col6-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5843"></a>
+<span class="sourceLineNo">5844</span>              Bytes.toBytes("col7-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5844"></a>
+<span class="sourceLineNo">5845</span>              Bytes.toBytes("col8-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5845"></a>
+<span class="sourceLineNo">5846</span>              Bytes.toBytes("col9-&lt;d2v1&gt;-&lt;d3v2&gt;")};<a name="line.5846"></a>
+<span class="sourceLineNo">5847</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.5847"></a>
+<span class="sourceLineNo">5848</span>        Put put = new Put(ROWS[i]);<a name="line.5848"></a>
+<span class="sourceLineNo">5849</span>        put.addColumn(FAMILY, QUALIFIERS[i], VALUE);<a name="line.5849"></a>
+<span class="sourceLineNo">5850</span>        ht.put(put);<a name="line.5850"></a>
+<span class="sourceLineNo">5851</span>      }<a name="line.5851"></a>
+<span class="sourceLineNo">5852</span>      Scan scan = new Scan();<a name="line.5852"></a>
+<span class="sourceLineNo">5853</span>      scan.setReversed(true);<a name="line.5853"></a>
+<span class="sourceLineNo">5854</span>      scan.addFamily(FAMILY);<a name="line.5854"></a>
+<span class="sourceLineNo">5855</span>      Filter filter = new QualifierFilter(CompareOperator.EQUAL,<a name="line.5855"></a>
+<span class="sourceLineNo">5856</span>              new RegexStringComparator("col[1-5]"));<a name="line.5856"></a>
+<span class="sourceLineNo">5857</span>      scan.setFilter(filter);<a name="line.5857"></a>
+<span class="sourceLineNo">5858</span>      try (ResultScanner scanner = ht.getScanner(scan)) {<a name="line.5858"></a>
+<span class="sourceLineNo">5859</span>        int expectedIndex = 5;<a name="line.5859"></a>
+<span class="sourceLineNo">5860</span>        for (Result result : scanner) {<a name="line.5860"></a>
+<span class="sourceLineNo">5861</span>          assertEquals(1, result.size());<a name="line.5861"></a>
+<span class="sourceLineNo">5862</span>          Cell c = result.rawCells()[0];<a name="line.5862"></a>
+<span class="sourceLineNo">5863</span>          assertTrue(Bytes.equals(c.getRowArray(), c.getRowOffset(), c.getRowLength(),<a name="line.5863"></a>
+<span class="sourceLineNo">5864</span>                  ROWS[expectedIndex], 0, ROWS[expectedIndex].length));<a name="line.5864"></a>
+<span class="sourceLineNo">5865</span>          assertTrue(Bytes.equals(c.getQualifierArray(), c.getQualifierOffset(),<a name="line.5865"></a>
+<span class="sourceLineNo">5866</span>                  c.getQualifierLength(), QUALIFIERS[expectedIndex], 0,<a name="line.5866"></a>
+<span class="sourceLineNo">5867</span>                  QUALIFIERS[expectedIndex].length));<a name="line.5867"></a>
+<span class="sourceLineNo">5868</span>          expectedIndex--;<a name="line.5868"></a>
+<span class="sourceLineNo">5869</span>        }<a name="line.5869"></a>
+<span class="sourceLineNo">5870</span>        assertEquals(0, expectedIndex);<a name="line.5870"></a>
+<span class="sourceLineNo">5871</span>      }<a name="line.5871"></a>
+<span class="sourceLineNo">5872</span>    }<a name="line.5872"></a>
+<span class="sourceLineNo">5873</span>  }<a name="line.5873"></a>
+<span class="sourceLineNo">5874</span><a name="line.5874"></a>
+<span class="sourceLineNo">5875</span>  @Test<a name="line.5875"></a>
+<span class="sourceLineNo">5876</span>  public void testKeyOnlyFilterWithReverseScan() throws Exception {<a name="line.5876"></a>
+<span class="sourceLineNo">5877</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5877"></a>
+<span class="sourceLineNo">5878</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5878"></a>
+<span class="sourceLineNo">5879</span>      byte[][] ROWS = makeN(ROW, 10);<a name="line.5879"></a>
+<span class="sourceLineNo">5880</span>      byte[][] QUALIFIERS = {Bytes.toBytes("col0-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5880"></a>
+<span class="sourceLineNo">5881</span>              Bytes.toBytes("col1-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5881"></a>
+<span class="sourceLineNo">5882</span>              Bytes.toBytes("col2-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5882"></a>
+<span class="sourceLineNo">5883</span>              Bytes.toBytes("col3-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5883"></a>
+<span class="sourceLineNo">5884</span>              Bytes.toBytes("col4-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5884"></a>
+<span class="sourceLineNo">5885</span>              Bytes.toBytes("col5-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5885"></a>
+<span class="sourceLineNo">5886</span>              Bytes.toBytes("col6-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5886"></a>
+<span class="sourceLineNo">5887</span>              Bytes.toBytes("col7-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5887"></a>
+<span class="sourceLineNo">5888</span>              Bytes.toBytes("col8-&lt;d2v1&gt;-&lt;d3v2&gt;"),<a name="line.5888"></a>
+<span class="sourceLineNo">5889</span>              Bytes.toBytes("col9-&lt;d2v1&gt;-&lt;d3v2&gt;")};<a name="line.5889"></a>
+<span class="sourceLineNo">5890</span>      for (int i = 0; i &lt; 10; i++) {<a name="line.5890"></a>
+<span class="sourceLineNo">5891</span>        Put put = new Put(ROWS[i]);<a name="line.5891"></a>
+<span class="sourceLineNo">5892</span>        put.addColumn(FAMILY, QUALIFIERS[i], VALUE);<a name="line.5892"></a>
+<span class="sourceLineNo">5893</span>        ht.put(put);<a name="line.5893"></a>
+<span class="sourceLineNo">5894</span>      }<a name="line.5894"></a>
+<span class="sourceLineNo">5895</span>      Scan scan = new Scan();<a name="line.5895"></a>
+<span class="sourceLineNo">5896</span>      scan.setReversed(true);<a name="line.5896"></a>
+<span class="sourceLineNo">5897</span>      scan.addFamily(FAMILY);<a name="line.5897"></a>
+<span class="sourceLineNo">5898</span>      Filter filter = new KeyOnlyFilter(true);<a name="line.5898"></a>
+<span class="sourceLineNo">5899</span>      scan.setFilter(filter);<a name="line.5899"></a>
+<span class="sourceLineNo">5900</span>      try (ResultScanner scanner = ht.getScanner(scan)) {<a name="line.5900"></a>
+<span class="sourceLineNo">5901</span>        int count = 0;<a name="line.5901"></a>
+<span class="sourceLineNo">5902</span>        for (Result result : ht.getScanner(scan)) {<a name="line.5902"></a>
+<span class="sourceLineNo">5903</span>          assertEquals(1, result.size());<a name="line.5903"></a>
+<span class="sourceLineNo">5904</span>          assertEquals(Bytes.SIZEOF_INT, result.rawCells()[0].getValueLength());<a name="line.5904"></a>
+<span class="sourceLineNo">5905</span>          assertEquals(VALUE.length, Bytes.toInt(CellUtil.cloneValue(result.rawCells()[0])));<a name="line.5905"></a>
+<span class="sourceLineNo">5906</span>          count++;<a name="line.5906"></a>
+<span class="sourceLineNo">5907</span>        }<a name="line.5907"></a>
+<span class="sourceLineNo">5908</span>        assertEquals(10, count);<a name="line.5908"></a>
+<span class="sourceLineNo">5909</span>      }<a name="line.5909"></a>
+<span class="sourceLineNo">5910</span>    }<a name="line.5910"></a>
+<span class="sourceLineNo">5911</span>  }<a name="line.5911"></a>
+<span class="sourceLineNo">5912</span><a name="line.5912"></a>
+<span class="sourceLineNo">5913</span>  /**<a name="line.5913"></a>
+<span class="sourceLineNo">5914</span>   * Test simple table and non-existent row cases.<a name="line.5914"></a>
+<span class="sourceLineNo">5915</span>   */<a name="line.5915"></a>
+<span class="sourceLineNo">5916</span>  @Test<a name="line.5916"></a>
+<span class="sourceLineNo">5917</span>  public void testSimpleMissingWithReverseScan() throws Exception {<a name="line.5917"></a>
+<span class="sourceLineNo">5918</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5918"></a>
+<span class="sourceLineNo">5919</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5919"></a>
+<span class="sourceLineNo">5920</span>      byte[][] ROWS = makeN(ROW, 4);<a name="line.5920"></a>
+<span class="sourceLineNo">5921</span><a name="line.5921"></a>
+<span class="sourceLineNo">5922</span>      // Try to get a row on an empty table<a name="line.5922"></a>
+<span class="sourceLineNo">5923</span>      Scan scan = new Scan();<a name="line.5923"></a>
+<span class="sourceLineNo">5924</span>      scan.setReversed(true);<a name="line.5924"></a>
+<span class="sourceLineNo">5925</span>      Result result = getSingleScanResult(ht, scan);<a name="line.5925"></a>
+<span class="sourceLineNo">5926</span>      assertNullResult(result);<a name="line.5926"></a>
+<span class="sourceLineNo">5927</span><a name="line.5927"></a>
+<span class="sourceLineNo">5928</span>      scan = new Scan(ROWS[0]);<a name="line.5928"></a>
+<span class="sourceLineNo">5929</span>      scan.setReversed(true);<a name="line.5929"></a>
+<span class="sourceLineNo">5930</span>      result = getSingleScanResult(ht, scan);<a name="line.5930"></a>
+<span class="sourceLineNo">5931</span>      assertNullResult(result);<a name="line.5931"></a>
+<span class="sourceLineNo">5932</span><a name="line.5932"></a>
+<span class="sourceLineNo">5933</span>      scan = new Scan(ROWS[0], ROWS[1]);<a name="line.5933"></a>
+<span class="sourceLineNo">5934</span>      scan.setReversed(true);<a name="line.5934"></a>
+<span class="sourceLineNo">5935</span>      result = getSingleScanResult(ht, scan);<a name="line.5935"></a>
+<span class="sourceLineNo">5936</span>      assertNullResult(result);<a name="line.5936"></a>
+<span class="sourceLineNo">5937</span><a name="line.5937"></a>
+<span class="sourceLineNo">5938</span>      scan = new Scan();<a name="line.5938"></a>
 <span class="sourceLineNo">5939</span>      scan.setReversed(true);<a name="line.5939"></a>
-<span class="sourceLineNo">5940</span>      result = getSingleScanResult(ht, scan);<a name="line.5940"></a>
-<span class="sourceLineNo">5941</span>      assertNullResult(result);<a name="line.5941"></a>
-<span class="sourceLineNo">5942</span>    }<a name="line.5942"></a>
-<span class="sourceLineNo">5943</span>  }<a name="line.5943"></a>
-<span class="sourceLineNo">5944</span><a name="line.5944"></a>
-<span class="sourceLineNo">5945</span>  @Test<a name="line.5945"></a>
-<span class="sourceLineNo">5946</span>  public void testNullWithReverseScan() throws Exception {<a name="line.5946"></a>
-<span class="sourceLineNo">5947</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5947"></a>
-<span class="sourceLineNo">5948</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5948"></a>
-<span class="sourceLineNo">5949</span>      // Null qualifier (should work)<a name="line.5949"></a>
-<span class="sourceLineNo">5950</span>      Put put = new Put(ROW);<a name="line.5950"></a>
-<span class="sourceLineNo">5951</span>      put.addColumn(FAMILY, null, VALUE);<a name="line.5951"></a>
-<span class="sourceLineNo">5952</span>      ht.put(put);<a name="line.5952"></a>
-<span class="sourceLineNo">5953</span>      scanTestNull(ht, ROW, FAMILY, VALUE, true);<a name="line.5953"></a>
-<span class="sourceLineNo">5954</span>      Delete delete = new Delete(ROW);<a name="line.5954"></a>
-<span class="sourceLineNo">5955</span>      delete.addColumns(FAMILY, null);<a name="line.5955"></a>
-<span class="sourceLineNo">5956</span>      ht.delete(delete);<a name="line.5956"></a>
-<span class="sourceLineNo">5957</span>    }<a name="line.5957"></a>
-<span class="sourceLineNo">5958</span><a name="line.5958"></a>
-<span class="sourceLineNo">5959</span>    // Use a new table<a name="line.5959"></a>
-<span class="sourceLineNo">5960</span>    try (Table ht = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName() + "2"), FAMILY)) {<a name="line.5960"></a>
-<span class="sourceLineNo">5961</span>      // Empty qualifier, byte[0] instead of null (should work)<a name="line.5961"></a>
-<span class="sourceLineNo">5962</span>      Put put = new Put(ROW);<a name="line.5962"></a>
-<span class="sourceLineNo">5963</span>      put.addColumn(FAMILY, HConstants.EMPTY_BYTE_ARRAY, VALUE);<a name="line.5963"></a>
-<span class="sourceLineNo">5964</span>      ht.put(put);<a name="line.5964"></a>
-<span class="sourceLineNo">5965</span>      scanTestNull(ht, ROW, FAMILY, VALUE, true);<a name="line.5965"></a>
-<span class="sourceLineNo">5966</span>      TEST_UTIL.flush();<a name="line.5966"></a>
-<span class="sourceLineNo">5967</span>      scanTestNull(ht, ROW, FAMILY, VALUE, true);<a name="line.5967"></a>
-<span class="sourceLineNo">5968</span>      Delete delete = new Delete(ROW);<a name="line.5968"></a>
-<span class="sourceLineNo">5969</span>      delete.addColumns(FAMILY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.5969"></a>
-<span class="sourceLineNo">5970</span>      ht.delete(delete);<a name="line.5970"></a>
-<span class="sourceLineNo">5971</span>      // Null value<a name="line.5971"></a>
-<span class="sourceLineNo">5972</span>      put = new Put(ROW);<a name="line.5972"></a>
-<span class="sourceLineNo">5973</span>      put.addColumn(FAMILY, QUALIFIER, null);<a name="line.5973"></a>
-<span class="sourceLineNo">5974</span>      ht.put(put);<a name="line.5974"></a>
-<span class="sourceLineNo">5975</span>      Scan scan = new Scan();<a name="line.5975"></a>
-<span class="sourceLineNo">5976</span>      scan.setReversed(true);<a name="line.5976"></a>
-<span class="sourceLineNo">5977</span>      scan.addColumn(FAMILY, QUALIFIER);<a name="line.5977"></a>
-<span class="sourceLineNo">5978</span>      Result result = getSingleScanResult(ht, scan);<a name="line.5978"></a>
-<span class="sourceLineNo">5979</span>      assertSingleResult(result, ROW, FAMILY, QUALIFIER, null);<a name="line.5979"></a>
-<span class="sourceLineNo">5980</span>    }<a name="line.5980"></a>
-<span class="sourceLineNo">5981</span>  }<a name="line.5981"></a>
-<span class="sourceLineNo">5982</span><a name="line.5982"></a>
-<span class="sourceLineNo">5983</span>  @Test<a name="line.5983"></a>
-<span class="sourceLineNo">5984</span>  @SuppressWarnings("checkstyle:MethodLength")<a name="line.5984"></a>
-<span class="sourceLineNo">5985</span>  public void testDeletesWithReverseScan() throws Exception {<a name="line.5985"></a>
-<span class="sourceLineNo">5986</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5986"></a>
-<span class="sourceLineNo">5987</span>    byte[][] ROWS = makeNAscii(ROW, 6);<a name="line.5987"></a>
-<span class="sourceLineNo">5988</span>    byte[][] FAMILIES = makeNAscii(FAMILY, 3);<a name="line.5988"></a>
-<span class="sourceLineNo">5989</span>    byte[][] VALUES = makeN(VALUE, 5);<a name="line.5989"></a>
-<span class="sourceLineNo">5990</span>    long[] ts = { 1000, 2000, 3000, 4000, 5000 };<a name="line.5990"></a>
-<span class="sourceLineNo">5991</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILIES, 3)) {<a name="line.5991"></a>
-<span class="sourceLineNo">5992</span><a name="line.5992"></a>
-<span class="sourceLineNo">5993</span>      Put put = new Put(ROW);<a name="line.5993"></a>
-<span class="sourceLineNo">5994</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[0], VALUES[0]);<a name="line.5994"></a>
-<span class="sourceLineNo">5995</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[1], VALUES[1]);<a name="line.5995"></a>
-<span class="sourceLineNo">5996</span>      ht.put(put);<a name="line.5996"></a>
-<span class="sourceLineNo">5997</span><a name="line.5997"></a>
-<span class="sourceLineNo">5998</span>      Delete delete = new Delete(ROW);<a name="line.5998"></a>
-<span class="sourceLineNo">5999</span>      delete.addFamily(FAMILIES[0], ts[0]);<a name="line.5999"></a>
-<span class="sourceLineNo">6000</span>      ht.delete(delete);<a name="line.6000"></a>
-<span class="sourceLineNo">6001</span><a name="line.6001"></a>
-<span class="sourceLineNo">6002</span>      Scan scan = new Scan(ROW);<a name="line.6002"></a>
-<span class="sourceLineNo">6003</span>      scan.setReversed(true);<a name="line.6003"></a>
-<span class="sourceLineNo">6004</span>      scan.addFamily(FAMILIES[0]);<a name="line.6004"></a>
-<span class="sourceLineNo">6005</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6005"></a>
-<span class="sourceLineNo">6006</span>      Result result = getSingleScanResult(ht, scan);<a name="line.6006"></a>
-<span class="sourceLineNo">6007</span>      assertNResult(result, ROW, FAMILIES[0], QUALIFIER, new long[]{ts[1]},<a name="line.6007"></a>
-<span class="sourceLineNo">6008</span>              new byte[][]{VALUES[1]}, 0, 0);<a name="line.6008"></a>
-<span class="sourceLineNo">6009</span><a name="line.6009"></a>
-<span class="sourceLineNo">6010</span>      // Test delete latest version<a name="line.6010"></a>
-<span class="sourceLineNo">6011</span>      put = new Put(ROW);<a name="line.6011"></a>
-<span class="sourceLineNo">6012</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[4], VALUES[4]);<a name="line.6012"></a>
-<span class="sourceLineNo">6013</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[2], VALUES[2]);<a name="line.6013"></a>
-<span class="sourceLineNo">6014</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[3], VALUES[3]);<a name="line.6014"></a>
-<span class="sourceLineNo">6015</span>      put.addColumn(FAMILIES[0], null, ts[4], VALUES[4]);<a name="line.6015"></a>
-<span class="sourceLineNo">6016</span>      put.addColumn(FAMILIES[0], null, ts[2], VALUES[2]);<a name="line.6016"></a>
-<span class="sourceLineNo">6017</span>      put.addColumn(FAMILIES[0], null, ts[3], VALUES[3]);<a name="line.6017"></a>
-<span class="sourceLineNo">6018</span>      ht.put(put);<a name="line.6018"></a>
-<span class="sourceLineNo">6019</span><a name="line.6019"></a>
-<span class="sourceLineNo">6020</span>      delete = new Delete(ROW);<a name="line.6020"></a>
-<span class="sourceLineNo">6021</span>      delete.addColumn(FAMILIES[0], QUALIFIER); // ts[4]<a name="line.6021"></a>
-<span class="sourceLineNo">6022</span>      ht.delete(delete);<a name="line.6022"></a>
-<span class="sourceLineNo">6023</span><a name="line.6023"></a>
-<span class="sourceLineNo">6024</span>      scan = new Scan(ROW);<a name="line.6024"></a>
-<span class="sourceLineNo">6025</span>      scan.setReversed(true);<a name="line.6025"></a>
-<span class="sourceLineNo">6026</span>      scan.addColumn(FAMILIES[0], QUALIFIER);<a name="line.6026"></a>
-<span class="sourceLineNo">6027</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6027"></a>
-<span class="sourceLineNo">6028</span>      result = getSingleScanResult(ht, scan);<a name="line.6028"></a>
-<span class="sourceLineNo">6029</span>      assertNResult(result, ROW, FAMILIES[0], QUALIFIER, new long[]{ts[1],<a name="line.6029"></a>
-<span class="sourceLineNo">6030</span>              ts[2], ts[3]}, new byte[][]{VALUES[1], VALUES[2], VALUES[3]}, 0, 2);<a name="line.6030"></a>
-<span class="sourceLineNo">6031</span><a name="line.6031"></a>
-<span class="sourceLineNo">6032</span>      // Test for HBASE-1847<a name="line.6032"></a>
-<span class="sourceLineNo">6033</span>      delete = new Delete(ROW);<a name="line.6033"></a>
-<span class="sourceLineNo">6034</span>      delete.addColumn(FAMILIES[0], null);<a name="line.6034"></a>
-<span class="sourceLineNo">6035</span>      ht.delete(delete);<a name="line.6035"></a>
-<span class="sourceLineNo">6036</span><a name="line.6036"></a>
-<span class="sourceLineNo">6037</span>      // Cleanup null qualifier<a name="line.6037"></a>
-<span class="sourceLineNo">6038</span>      delete = new Delete(ROW);<a name="line.6038"></a>
-<span class="sourceLineNo">6039</span>      delete.addColumns(FAMILIES[0], null);<a name="line.6039"></a>
-<span class="sourceLineNo">6040</span>      ht.delete(delete);<a name="line.6040"></a>
-<span class="sourceLineNo">6041</span><a name="line.6041"></a>
-<span class="sourceLineNo">6042</span>      // Expected client behavior might be that you can re-put deleted values<a name="line.6042"></a>
-<span class="sourceLineNo">6043</span>      // But alas, this is not to be. We can't put them back in either case.<a name="line.6043"></a>
-<span class="sourceLineNo">6044</span><a name="line.6044"></a>
-<span class="sourceLineNo">6045</span>      put = new Put(ROW);<a name="line.6045"></a>
-<span class="sourceLineNo">6046</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[0], VALUES[0]);<a name="line.6046"></a>
-<span class="sourceLineNo">6047</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[4], VALUES[4]);<a name="line.6047"></a>
-<span class="sourceLineNo">6048</span>      ht.put(put);<a name="line.6048"></a>
-<span class="sourceLineNo">6049</span><a name="line.6049"></a>
-<span class="sourceLineNo">6050</span>      // The Scanner returns the previous values, the expected-naive-unexpected<a name="line.6050"></a>
-<span class="sourceLineNo">6051</span>      // behavior<a name="line.6051"></a>
-<span class="sourceLineNo">6052</span><a name="line.6052"></a>
-<span class="sourceLineNo">6053</span>      scan = new Scan(ROW);<a name="line.6053"></a>
-<span class="sourceLineNo">6054</span>      scan.setReversed(true);<a name="line.6054"></a>
-<span class="sourceLineNo">6055</span>      scan.addFamily(FAMILIES[0]);<a name="line.6055"></a>
-<span class="sourceLineNo">6056</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6056"></a>
-<span class="sourceLineNo">6057</span>      result = getSingleScanResult(ht, scan);<a name="line.6057"></a>
-<span class="sourceLineNo">6058</span>      assertNResult(result, ROW, FAMILIES[0], QUALIFIER, new long[]{ts[1],<a name="line.6058"></a>
-<span class="sourceLineNo">6059</span>              ts[2], ts[3]}, new byte[][]{VALUES[1], VALUES[2], VALUES[3]}, 0, 2);<a name="line.6059"></a>
-<span class="sourceLineNo">6060</span><a name="line.6060"></a>
-<span class="sourceLineNo">6061</span>      // Test deleting an entire family from one row but not the other various<a name="line.6061"></a>
-<span class="sourceLineNo">6062</span>      // ways<a name="line.6062"></a>
-<span class="sourceLineNo">6063</span><a name="line.6063"></a>
-<span class="sourceLineNo">6064</span>      put = new Put(ROWS[0]);<a name="line.6064"></a>
-<span class="sourceLineNo">6065</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[0], VALUES[0]);<a name="line.6065"></a>
-<span class="sourceLineNo">6066</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[1], VALUES[1]);<a name="line.6066"></a>
-<span class="sourceLineNo">6067</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[2], VALUES[2]);<a name="line.6067"></a>
-<span class="sourceLineNo">6068</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[3], VALUES[3]);<a name="line.6068"></a>
-<span class="sourceLineNo">6069</span>      ht.put(put);<a name="line.6069"></a>
-<span class="sourceLineNo">6070</span><a name="line.6070"></a>
-<span class="sourceLineNo">6071</span>      put = new Put(ROWS[1]);<a name="line.6071"></a>
-<span class="sourceLineNo">6072</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[0], VALUES[0]);<a name="line.6072"></a>
-<span class="sourceLineNo">6073</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[1], VALUES[1]);<a name="line.6073"></a>
-<span class="sourceLineNo">6074</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[2], VALUES[2]);<a name="line.6074"></a>
-<span class="sourceLineNo">6075</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[3], VALUES[3]);<a name="line.6075"></a>
-<span class="sourceLineNo">6076</span>      ht.put(put);<a name="line.6076"></a>
+<span class="sourceLineNo">5940</span>      scan.addFamily(FAMILY);<a name="line.5940"></a>
+<span class="sourceLineNo">5941</span>      result = getSingleScanResult(ht, scan);<a name="line.5941"></a>
+<span class="sourceLineNo">5942</span>      assertNullResult(result);<a name="line.5942"></a>
+<span class="sourceLineNo">5943</span><a name="line.5943"></a>
+<span class="sourceLineNo">5944</span>      scan = new Scan();<a name="line.5944"></a>
+<span class="sourceLineNo">5945</span>      scan.setReversed(true);<a name="line.5945"></a>
+<span class="sourceLineNo">5946</span>      scan.addColumn(FAMILY, QUALIFIER);<a name="line.5946"></a>
+<span class="sourceLineNo">5947</span>      result = getSingleScanResult(ht, scan);<a name="line.5947"></a>
+<span class="sourceLineNo">5948</span>      assertNullResult(result);<a name="line.5948"></a>
+<span class="sourceLineNo">5949</span><a name="line.5949"></a>
+<span class="sourceLineNo">5950</span>      // Insert a row<a name="line.5950"></a>
+<span class="sourceLineNo">5951</span><a name="line.5951"></a>
+<span class="sourceLineNo">5952</span>      Put put = new Put(ROWS[2]);<a name="line.5952"></a>
+<span class="sourceLineNo">5953</span>      put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.5953"></a>
+<span class="sourceLineNo">5954</span>      ht.put(put);<a name="line.5954"></a>
+<span class="sourceLineNo">5955</span><a name="line.5955"></a>
+<span class="sourceLineNo">5956</span>      // Make sure we can scan the row<a name="line.5956"></a>
+<span class="sourceLineNo">5957</span>      scan = new Scan();<a name="line.5957"></a>
+<span class="sourceLineNo">5958</span>      scan.setReversed(true);<a name="line.5958"></a>
+<span class="sourceLineNo">5959</span>      result = getSingleScanResult(ht, scan);<a name="line.5959"></a>
+<span class="sourceLineNo">5960</span>      assertSingleResult(result, ROWS[2], FAMILY, QUALIFIER, VALUE);<a name="line.5960"></a>
+<span class="sourceLineNo">5961</span><a name="line.5961"></a>
+<span class="sourceLineNo">5962</span>      scan = new Scan(ROWS[3], ROWS[0]);<a name="line.5962"></a>
+<span class="sourceLineNo">5963</span>      scan.setReversed(true);<a name="line.5963"></a>
+<span class="sourceLineNo">5964</span>      result = getSingleScanResult(ht, scan);<a name="line.5964"></a>
+<span class="sourceLineNo">5965</span>      assertSingleResult(result, ROWS[2], FAMILY, QUALIFIER, VALUE);<a name="line.5965"></a>
+<span class="sourceLineNo">5966</span><a name="line.5966"></a>
+<span class="sourceLineNo">5967</span>      scan = new Scan(ROWS[2], ROWS[1]);<a name="line.5967"></a>
+<span class="sourceLineNo">5968</span>      scan.setReversed(true);<a name="line.5968"></a>
+<span class="sourceLineNo">5969</span>      result = getSingleScanResult(ht, scan);<a name="line.5969"></a>
+<span class="sourceLineNo">5970</span>      assertSingleResult(result, ROWS[2], FAMILY, QUALIFIER, VALUE);<a name="line.5970"></a>
+<span class="sourceLineNo">5971</span><a name="line.5971"></a>
+<span class="sourceLineNo">5972</span>      // Try to scan empty rows around it<a name="line.5972"></a>
+<span class="sourceLineNo">5973</span>      // Introduced MemStore#shouldSeekForReverseScan to fix the following<a name="line.5973"></a>
+<span class="sourceLineNo">5974</span>      scan = new Scan(ROWS[1]);<a name="line.5974"></a>
+<span class="sourceLineNo">5975</span>      scan.setReversed(true);<a name="line.5975"></a>
+<span class="sourceLineNo">5976</span>      result = getSingleScanResult(ht, scan);<a name="line.5976"></a>
+<span class="sourceLineNo">5977</span>      assertNullResult(result);<a name="line.5977"></a>
+<span class="sourceLineNo">5978</span>    }<a name="line.5978"></a>
+<span class="sourceLineNo">5979</span>  }<a name="line.5979"></a>
+<span class="sourceLineNo">5980</span><a name="line.5980"></a>
+<span class="sourceLineNo">5981</span>  @Test<a name="line.5981"></a>
+<span class="sourceLineNo">5982</span>  public void testNullWithReverseScan() throws Exception {<a name="line.5982"></a>
+<span class="sourceLineNo">5983</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.5983"></a>
+<span class="sourceLineNo">5984</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.5984"></a>
+<span class="sourceLineNo">5985</span>      // Null qualifier (should work)<a name="line.5985"></a>
+<span class="sourceLineNo">5986</span>      Put put = new Put(ROW);<a name="line.5986"></a>
+<span class="sourceLineNo">5987</span>      put.addColumn(FAMILY, null, VALUE);<a name="line.5987"></a>
+<span class="sourceLineNo">5988</span>      ht.put(put);<a name="line.5988"></a>
+<span class="sourceLineNo">5989</span>      scanTestNull(ht, ROW, FAMILY, VALUE, true);<a name="line.5989"></a>
+<span class="sourceLineNo">5990</span>      Delete delete = new Delete(ROW);<a name="line.5990"></a>
+<span class="sourceLineNo">5991</span>      delete.addColumns(FAMILY, null);<a name="line.5991"></a>
+<span class="sourceLineNo">5992</span>      ht.delete(delete);<a name="line.5992"></a>
+<span class="sourceLineNo">5993</span>    }<a name="line.5993"></a>
+<span class="sourceLineNo">5994</span><a name="line.5994"></a>
+<span class="sourceLineNo">5995</span>    // Use a new table<a name="line.5995"></a>
+<span class="sourceLineNo">5996</span>    try (Table ht = TEST_UTIL.createTable(TableName.valueOf(name.getMethodName() + "2"), FAMILY)) {<a name="line.5996"></a>
+<span class="sourceLineNo">5997</span>      // Empty qualifier, byte[0] instead of null (should work)<a name="line.5997"></a>
+<span class="sourceLineNo">5998</span>      Put put = new Put(ROW);<a name="line.5998"></a>
+<span class="sourceLineNo">5999</span>      put.addColumn(FAMILY, HConstants.EMPTY_BYTE_ARRAY, VALUE);<a name="line.5999"></a>
+<span class="sourceLineNo">6000</span>      ht.put(put);<a name="line.6000"></a>
+<span class="sourceLineNo">6001</span>      scanTestNull(ht, ROW, FAMILY, VALUE, true);<a name="line.6001"></a>
+<span class="sourceLineNo">6002</span>      TEST_UTIL.flush();<a name="line.6002"></a>
+<span class="sourceLineNo">6003</span>      scanTestNull(ht, ROW, FAMILY, VALUE, true);<a name="line.6003"></a>
+<span class="sourceLineNo">6004</span>      Delete delete = new Delete(ROW);<a name="line.6004"></a>
+<span class="sourceLineNo">6005</span>      delete.addColumns(FAMILY, HConstants.EMPTY_BYTE_ARRAY);<a name="line.6005"></a>
+<span class="sourceLineNo">6006</span>      ht.delete(delete);<a name="line.6006"></a>
+<span class="sourceLineNo">6007</span>      // Null value<a name="line.6007"></a>
+<span class="sourceLineNo">6008</span>      put = new Put(ROW);<a name="line.6008"></a>
+<span class="sourceLineNo">6009</span>      put.addColumn(FAMILY, QUALIFIER, null);<a name="line.6009"></a>
+<span class="sourceLineNo">6010</span>      ht.put(put);<a name="line.6010"></a>
+<span class="sourceLineNo">6011</span>      Scan scan = new Scan();<a name="line.6011"></a>
+<span class="sourceLineNo">6012</span>      scan.setReversed(true);<a name="line.6012"></a>
+<span class="sourceLineNo">6013</span>      scan.addColumn(FAMILY, QUALIFIER);<a name="line.6013"></a>
+<span class="sourceLineNo">6014</span>      Result result = getSingleScanResult(ht, scan);<a name="line.6014"></a>
+<span class="sourceLineNo">6015</span>      assertSingleResult(result, ROW, FAMILY, QUALIFIER, null);<a name="line.6015"></a>
+<span class="sourceLineNo">6016</span>    }<a name="line.6016"></a>
+<span class="sourceLineNo">6017</span>  }<a name="line.6017"></a>
+<span class="sourceLineNo">6018</span><a name="line.6018"></a>
+<span class="sourceLineNo">6019</span>  @Test<a name="line.6019"></a>
+<span class="sourceLineNo">6020</span>  @SuppressWarnings("checkstyle:MethodLength")<a name="line.6020"></a>
+<span class="sourceLineNo">6021</span>  public void testDeletesWithReverseScan() throws Exception {<a name="line.6021"></a>
+<span class="sourceLineNo">6022</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6022"></a>
+<span class="sourceLineNo">6023</span>    byte[][] ROWS = makeNAscii(ROW, 6);<a name="line.6023"></a>
+<span class="sourceLineNo">6024</span>    byte[][] FAMILIES = makeNAscii(FAMILY, 3);<a name="line.6024"></a>
+<span class="sourceLineNo">6025</span>    byte[][] VALUES = makeN(VALUE, 5);<a name="line.6025"></a>
+<span class="sourceLineNo">6026</span>    long[] ts = { 1000, 2000, 3000, 4000, 5000 };<a name="line.6026"></a>
+<span class="sourceLineNo">6027</span>    try (Table ht = TEST_UTIL.createTable(tableName, FAMILIES, 3)) {<a name="line.6027"></a>
+<span class="sourceLineNo">6028</span><a name="line.6028"></a>
+<span class="sourceLineNo">6029</span>      Put put = new Put(ROW);<a name="line.6029"></a>
+<span class="sourceLineNo">6030</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[0], VALUES[0]);<a name="line.6030"></a>
+<span class="sourceLineNo">6031</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[1], VALUES[1]);<a name="line.6031"></a>
+<span class="sourceLineNo">6032</span>      ht.put(put);<a name="line.6032"></a>
+<span class="sourceLineNo">6033</span><a name="line.6033"></a>
+<span class="sourceLineNo">6034</span>      Delete delete = new Delete(ROW);<a name="line.6034"></a>
+<span class="sourceLineNo">6035</span>      delete.addFamily(FAMILIES[0], ts[0]);<a name="line.6035"></a>
+<span class="sourceLineNo">6036</span>      ht.delete(delete);<a name="line.6036"></a>
+<span class="sourceLineNo">6037</span><a name="line.6037"></a>
+<span class="sourceLineNo">6038</span>      Scan scan = new Scan(ROW);<a name="line.6038"></a>
+<span class="sourceLineNo">6039</span>      scan.setReversed(true);<a name="line.6039"></a>
+<span class="sourceLineNo">6040</span>      scan.addFamily(FAMILIES[0]);<a name="line.6040"></a>
+<span class="sourceLineNo">6041</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6041"></a>
+<span class="sourceLineNo">6042</span>      Result result = getSingleScanResult(ht, scan);<a name="line.6042"></a>
+<span class="sourceLineNo">6043</span>      assertNResult(result, ROW, FAMILIES[0], QUALIFIER, new long[]{ts[1]},<a name="line.6043"></a>
+<span class="sourceLineNo">6044</span>              new byte[][]{VALUES[1]}, 0, 0);<a name="line.6044"></a>
+<span class="sourceLineNo">6045</span><a name="line.6045"></a>
+<span class="sourceLineNo">6046</span>      // Test delete latest version<a name="line.6046"></a>
+<span class="sourceLineNo">6047</span>      put = new Put(ROW);<a name="line.6047"></a>
+<span class="sourceLineNo">6048</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[4], VALUES[4]);<a name="line.6048"></a>
+<span class="sourceLineNo">6049</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[2], VALUES[2]);<a name="line.6049"></a>
+<span class="sourceLineNo">6050</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[3], VALUES[3]);<a name="line.6050"></a>
+<span class="sourceLineNo">6051</span>      put.addColumn(FAMILIES[0], null, ts[4], VALUES[4]);<a name="line.6051"></a>
+<span class="sourceLineNo">6052</span>      put.addColumn(FAMILIES[0], null, ts[2], VALUES[2]);<a name="line.6052"></a>
+<span class="sourceLineNo">6053</span>      put.addColumn(FAMILIES[0], null, ts[3], VALUES[3]);<a name="line.6053"></a>
+<span class="sourceLineNo">6054</span>      ht.put(put);<a name="line.6054"></a>
+<span class="sourceLineNo">6055</span><a name="line.6055"></a>
+<span class="sourceLineNo">6056</span>      delete = new Delete(ROW);<a name="line.6056"></a>
+<span class="sourceLineNo">6057</span>      delete.addColumn(FAMILIES[0], QUALIFIER); // ts[4]<a name="line.6057"></a>
+<span class="sourceLineNo">6058</span>      ht.delete(delete);<a name="line.6058"></a>
+<span class="sourceLineNo">6059</span><a name="line.6059"></a>
+<span class="sourceLineNo">6060</span>      scan = new Scan(ROW);<a name="line.6060"></a>
+<span class="sourceLineNo">6061</span>      scan.setReversed(true);<a name="line.6061"></a>
+<span class="sourceLineNo">6062</span>      scan.addColumn(FAMILIES[0], QUALIFIER);<a name="line.6062"></a>
+<span class="sourceLineNo">6063</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6063"></a>
+<span class="sourceLineNo">6064</span>      result = getSingleScanResult(ht, scan);<a name="line.6064"></a>
+<span class="sourceLineNo">6065</span>      assertNResult(result, ROW, FAMILIES[0], QUALIFIER, new long[]{ts[1],<a name="line.6065"></a>
+<span class="sourceLineNo">6066</span>              ts[2], ts[3]}, new byte[][]{VALUES[1], VALUES[2], VALUES[3]}, 0, 2);<a name="line.6066"></a>
+<span class="sourceLineNo">6067</span><a name="line.6067"></a>
+<span class="sourceLineNo">6068</span>      // Test for HBASE-1847<a name="line.6068"></a>
+<span class="sourceLineNo">6069</span>      delete = new Delete(ROW);<a name="line.6069"></a>
+<span class="sourceLineNo">6070</span>      delete.addColumn(FAMILIES[0], null);<a name="line.6070"></a>
+<span class="sourceLineNo">6071</span>      ht.delete(delete);<a name="line.6071"></a>
+<span class="sourceLineNo">6072</span><a name="line.6072"></a>
+<span class="sourceLineNo">6073</span>      // Cleanup null qualifier<a name="line.6073"></a>
+<span class="sourceLineNo">6074</span>      delete = new Delete(ROW);<a name="line.6074"></a>
+<span class="sourceLineNo">6075</span>      delete.addColumns(FAMILIES[0], null);<a name="line.6075"></a>
+<span class="sourceLineNo">6076</span>      ht.delete(delete);<a name="line.6076"></a>
 <span class="sourceLineNo">6077</span><a name="line.6077"></a>
-<span class="sourceLineNo">6078</span>      put = new Put(ROWS[2]);<a name="line.6078"></a>
-<span class="sourceLineNo">6079</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[0], VALUES[0]);<a name="line.6079"></a>
-<span class="sourceLineNo">6080</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[1], VALUES[1]);<a name="line.6080"></a>
-<span class="sourceLineNo">6081</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[2], VALUES[2]);<a name="line.6081"></a>
-<span class="sourceLineNo">6082</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[3], VALUES[3]);<a name="line.6082"></a>
-<span class="sourceLineNo">6083</span>      ht.put(put);<a name="line.6083"></a>
-<span class="sourceLineNo">6084</span><a name="line.6084"></a>
-<span class="sourceLineNo">6085</span>      delete = new Delete(ROWS[0]);<a name="line.6085"></a>
-<span class="sourceLineNo">6086</span>      delete.addFamily(FAMILIES[2]);<a name="line.6086"></a>
-<span class="sourceLineNo">6087</span>      ht.delete(delete);<a name="line.6087"></a>
+<span class="sourceLineNo">6078</span>      // Expected client behavior might be that you can re-put deleted values<a name="line.6078"></a>
+<span class="sourceLineNo">6079</span>      // But alas, this is not to be. We can't put them back in either case.<a name="line.6079"></a>
+<span class="sourceLineNo">6080</span><a name="line.6080"></a>
+<span class="sourceLineNo">6081</span>      put = new Put(ROW);<a name="line.6081"></a>
+<span class="sourceLineNo">6082</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[0], VALUES[0]);<a name="line.6082"></a>
+<span class="sourceLineNo">6083</span>      put.addColumn(FAMILIES[0], QUALIFIER, ts[4], VALUES[4]);<a name="line.6083"></a>
+<span class="sourceLineNo">6084</span>      ht.put(put);<a name="line.6084"></a>
+<span class="sourceLineNo">6085</span><a name="line.6085"></a>
+<span class="sourceLineNo">6086</span>      // The Scanner returns the previous values, the expected-naive-unexpected<a name="line.6086"></a>
+<span class="sourceLineNo">6087</span>      // behavior<a name="line.6087"></a>
 <span class="sourceLineNo">6088</span><a name="line.6088"></a>
-<span class="sourceLineNo">6089</span>      delete = new Delete(ROWS[1]);<a name="line.6089"></a>
-<span class="sourceLineNo">6090</span>      delete.addColumns(FAMILIES[1], QUALIFIER);<a name="line.6090"></a>
-<span class="sourceLineNo">6091</span>      ht.delete(delete);<a name="line.6091"></a>
-<span class="sourceLineNo">6092</span><a name="line.6092"></a>
-<span class="sourceLineNo">6093</span>      delete = new Delete(ROWS[2]);<a name="line.6093"></a>
-<span class="sourceLineNo">6094</span>      delete.addColumn(FAMILIES[1], QUALIFIER);<a name="line.6094"></a>
-<span class="sourceLineNo">6095</span>      delete.addColumn(FAMILIES[1], QUALIFIER);<a name="line.6095"></a>
-<span class="sourceLineNo">6096</span>      delete.addColumn(FAMILIES[2], QUALIFIER);<a name="line.6096"></a>
-<span class="sourceLineNo">6097</span>      ht.delete(delete);<a name="line.6097"></a>
-<span class="sourceLineNo">6098</span><a name="line.6098"></a>
-<span class="sourceLineNo">6099</span>      scan = new Scan(ROWS[0]);<a name="line.6099"></a>
-<span class="sourceLineNo">6100</span>      scan.setReversed(true);<a name="line.6100"></a>
-<span class="sourceLineNo">6101</span>      scan.addFamily(FAMILIES[1]);<a name="line.6101"></a>
-<span class="sourceLineNo">6102</span>      scan.addFamily(FAMILIES[2]);<a name="line.6102"></a>
-<span class="sourceLineNo">6103</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6103"></a>
-<span class="sourceLineNo">6104</span>      result = getSingleScanResult(ht, scan);<a name="line.6104"></a>
-<span class="sourceLineNo">6105</span>      assertTrue("Expected 2 keys but received " + result.size(),<a name="line.6105"></a>
-<span class="sourceLineNo">6106</span>              result.size() == 2);<a name="line.6106"></a>
-<span class="sourceLineNo">6107</span>      assertNResult(result, ROWS[0], FAMILIES[1], QUALIFIER, new long[]{ts[0],<a name="line.6107"></a>
-<span class="sourceLineNo">6108</span>              ts[1]}, new byte[][]{VALUES[0], VALUES[1]}, 0, 1);<a name="line.6108"></a>
-<span class="sourceLineNo">6109</span><a name="line.6109"></a>
-<span class="sourceLineNo">6110</span>      scan = new Scan(ROWS[1]);<a name="line.6110"></a>
-<span class="sourceLineNo">6111</span>      scan.setReversed(true);<a name="line.6111"></a>
-<span class="sourceLineNo">6112</span>      scan.addFamily(FAMILIES[1]);<a name="line.6112"></a>
-<span class="sourceLineNo">6113</span>      scan.addFamily(FAMILIES[2]);<a name="line.6113"></a>
-<span class="sourceLineNo">6114</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6114"></a>
-<span class="sourceLineNo">6115</span>      result = getSingleScanResult(ht, scan);<a name="line.6115"></a>
-<span class="sourceLineNo">6116</span>      assertTrue("Expected 2 keys but received " + result.size(),<a name="line.6116"></a>
-<span class="sourceLineNo">6117</span>              result.size() == 2);<a name="line.6117"></a>
-<span class="sourceLineNo">6118</span><a name="line.6118"></a>
-<span class="sourceLineNo">6119</span>      scan = new Scan(ROWS[2]);<a name="line.6119"></a>
-<span class="sourceLineNo">6120</span>      scan.setReversed(true);<a name="line.6120"></a>
-<span class="sourceLineNo">6121</span>      scan.addFamily(FAMILIES[1]);<a name="line.6121"></a>
-<span class="sourceLineNo">6122</span>      scan.addFamily(FAMILIES[2]);<a name="line.6122"></a>
-<span class="sourceLineNo">6123</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6123"></a>
-<span class="sourceLineNo">6124</span>      result = getSingleScanResult(ht, scan);<a name="line.6124"></a>
-<span class="sourceLineNo">6125</span>      assertEquals(1, result.size());<a name="line.6125"></a>
-<span class="sourceLineNo">6126</span>      assertNResult(result, ROWS[2], FAMILIES[2], QUALIFIER,<a name="line.6126"></a>
-<span class="sourceLineNo">6127</span>              new long[]{ts[2]}, new byte[][]{VALUES[2]}, 0, 0);<a name="line.6127"></a>
+<span class="sourceLineNo">6089</span>      scan = new Scan(ROW);<a name="line.6089"></a>
+<span class="sourceLineNo">6090</span>      scan.setReversed(true);<a name="line.6090"></a>
+<span class="sourceLineNo">6091</span>      scan.addFamily(FAMILIES[0]);<a name="line.6091"></a>
+<span class="sourceLineNo">6092</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6092"></a>
+<span class="sourceLineNo">6093</span>      result = getSingleScanResult(ht, scan);<a name="line.6093"></a>
+<span class="sourceLineNo">6094</span>      assertNResult(result, ROW, FAMILIES[0], QUALIFIER, new long[]{ts[1],<a name="line.6094"></a>
+<span class="sourceLineNo">6095</span>              ts[2], ts[3]}, new byte[][]{VALUES[1], VALUES[2], VALUES[3]}, 0, 2);<a name="line.6095"></a>
+<span class="sourceLineNo">6096</span><a name="line.6096"></a>
+<span class="sourceLineNo">6097</span>      // Test deleting an entire family from one row but not the other various<a name="line.6097"></a>
+<span class="sourceLineNo">6098</span>      // ways<a name="line.6098"></a>
+<span class="sourceLineNo">6099</span><a name="line.6099"></a>
+<span class="sourceLineNo">6100</span>      put = new Put(ROWS[0]);<a name="line.6100"></a>
+<span class="sourceLineNo">6101</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[0], VALUES[0]);<a name="line.6101"></a>
+<span class="sourceLineNo">6102</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[1], VALUES[1]);<a name="line.6102"></a>
+<span class="sourceLineNo">6103</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[2], VALUES[2]);<a name="line.6103"></a>
+<span class="sourceLineNo">6104</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[3], VALUES[3]);<a name="line.6104"></a>
+<span class="sourceLineNo">6105</span>      ht.put(put);<a name="line.6105"></a>
+<span class="sourceLineNo">6106</span><a name="line.6106"></a>
+<span class="sourceLineNo">6107</span>      put = new Put(ROWS[1]);<a name="line.6107"></a>
+<span class="sourceLineNo">6108</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[0], VALUES[0]);<a name="line.6108"></a>
+<span class="sourceLineNo">6109</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[1], VALUES[1]);<a name="line.6109"></a>
+<span class="sourceLineNo">6110</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[2], VALUES[2]);<a name="line.6110"></a>
+<span class="sourceLineNo">6111</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[3], VALUES[3]);<a name="line.6111"></a>
+<span class="sourceLineNo">6112</span>      ht.put(put);<a name="line.6112"></a>
+<span class="sourceLineNo">6113</span><a name="line.6113"></a>
+<span class="sourceLineNo">6114</span>      put = new Put(ROWS[2]);<a name="line.6114"></a>
+<span class="sourceLineNo">6115</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[0], VALUES[0]);<a name="line.6115"></a>
+<span class="sourceLineNo">6116</span>      put.addColumn(FAMILIES[1], QUALIFIER, ts[1], VALUES[1]);<a name="line.6116"></a>
+<span class="sourceLineNo">6117</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[2], VALUES[2]);<a name="line.6117"></a>
+<span class="sourceLineNo">6118</span>      put.addColumn(FAMILIES[2], QUALIFIER, ts[3], VALUES[3]);<a name="line.6118"></a>
+<span class="sourceLineNo">6119</span>      ht.put(put);<a name="line.6119"></a>
+<span class="sourceLineNo">6120</span><a name="line.6120"></a>
+<span class="sourceLineNo">6121</span>      delete = new Delete(ROWS[0]);<a name="line.6121"></a>
+<span class="sourceLineNo">6122</span>      delete.addFamily(FAMILIES[2]);<a name="line.6122"></a>
+<span class="sourceLineNo">6123</span>      ht.delete(delete);<a name="line.6123"></a>
+<span class="sourceLineNo">6124</span><a name="line.6124"></a>
+<span class="sourceLineNo">6125</span>      delete = new Delete(ROWS[1]);<a name="line.6125"></a>
+<span class="sourceLineNo">6126</span>      delete.addColumns(FAMILIES[1], QUALIFIER);<a name="line.6126"></a>
+<span class="sourceLineNo">6127</span>      ht.delete(delete);<a name="line.6127"></a>
 <span class="sourceLineNo">6128</span><a name="line.6128"></a>
-<span class="sourceLineNo">6129</span>      // Test if we delete the family first in one row (HBASE-1541)<a name="line.6129"></a>
-<span class="sourceLineNo">6130</span><a name="line.6130"></a>
-<span class="sourceLineNo">6131</span>      delete = new Delete(ROWS[3]);<a name="line.6131"></a>
-<span class="sourceLineNo">6132</span>      delete.addFamily(FAMILIES[1]);<a name="line.6132"></a>
+<span class="sourceLineNo">6129</span>      delete = new Delete(ROWS[2]);<a name="line.6129"></a>
+<span class="sourceLineNo">6130</span>      delete.addColumn(FAMILIES[1], QUALIFIER);<a name="line.6130"></a>
+<span class="sourceLineNo">6131</span>      delete.addColumn(FAMILIES[1], QUALIFIER);<a name="line.6131"></a>
+<span class="sourceLineNo">6132</span>      delete.addColumn(FAMILIES[2], QUALIFIER);<a name="line.6132"></a>
 <span class="sourceLineNo">6133</span>      ht.delete(delete);<a name="line.6133"></a>
 <span class="sourceLineNo">6134</span><a name="line.6134"></a>
-<span class="sourceLineNo">6135</span>      put = new Put(ROWS[3]);<a name="line.6135"></a>
-<span class="sourceLineNo">6136</span>      put.addColumn(FAMILIES[2], QUALIFIER, VALUES[0]);<a name="line.6136"></a>
-<span class="sourceLineNo">6137</span>      ht.put(put);<a name="line.6137"></a>
-<span class="sourceLineNo">6138</span><a name="line.6138"></a>
-<span class="sourceLineNo">6139</span>      put = new Put(ROWS[4]);<a name="line.6139"></a>
-<span class="sourceLineNo">6140</span>      put.addColumn(FAMILIES[1], QUALIFIER, VALUES[1]);<a name="line.6140"></a>
-<span class="sourceLineNo">6141</span>      put.addColumn(FAMILIES[2], QUALIFIER, VALUES[2]);<a name="line.6141"></a>
-<span class="sourceLineNo">6142</span>      ht.put(put);<a name="line.6142"></a>
-<span class="sourceLineNo">6143</span><a name="line.6143"></a>
-<span class="sourceLineNo">6144</span>      scan = new Scan(ROWS[4]);<a name="line.6144"></a>
-<span class="sourceLineNo">6145</span>      scan.setReversed(true);<a name="line.6145"></a>
-<span class="sourceLineNo">6146</span>      scan.addFamily(FAMILIES[1]);<a name="line.6146"></a>
-<span class="sourceLineNo">6147</span>      scan.addFamily(FAMILIES[2]);<a name="line.6147"></a>
-<span class="sourceLineNo">6148</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6148"></a>
-<span class="sourceLineNo">6149</span>      ResultScanner scanner = ht.getScanner(scan);<a name="line.6149"></a>
-<span class="sourceLineNo">6150</span>      result = scanner.next();<a name="line.6150"></a>
-<span class="sourceLineNo">6151</span>      assertTrue("Expected 2 keys but received " + result.size(),<a name="line.6151"></a>
-<span class="sourceLineNo">6152</span>              result.size() == 2);<a name="line.6152"></a>
-<span class="sourceLineNo">6153</span>      assertTrue(Bytes.equals(CellUtil.cloneRow(result.rawCells()[0]), ROWS[4]));<a name="line.6153"></a>
-<span class="sourceLineNo">6154</span>      assertTrue(Bytes.equals(CellUtil.cloneRow(result.rawCells()[1]), ROWS[4]));<a name="line.6154"></a>
-<span class="sourceLineNo">6155</span>      assertTrue(Bytes.equals(CellUtil.cloneValue(result.rawCells()[0]), VALUES[1]));<a name="line.6155"></a>
-<span class="sourceLineNo">6156</span>      assertTrue(Bytes.equals(CellUtil.cloneValue(result.rawCells()[1]), VALUES[2]));<a name="line.6156"></a>
-<span class="sourceLineNo">6157</span>      result = scanner.next();<a name="line.6157"></a>
-<span class="sourceLineNo">6158</span>      assertTrue("Expected 1 key but received " + result.size(),<a name="line.6158"></a>
-<span class="sourceLineNo">6159</span>              result.size() == 1);<a name="line.6159"></a>
-<span class="sourceLineNo">6160</span>      assertTrue(Bytes.equals(CellUtil.cloneRow(result.rawCells()[0]), ROWS[3]));<a name="line.6160"></a>
-<span class="sourceLineNo">6161</span>      assertTrue(Bytes.equals(CellUtil.cloneValue(result.rawCells()[0]), VALUES[0]));<a name="line.6161"></a>
-<span class="sourceLineNo">6162</span>      scanner.close();<a name="line.6162"></a>
-<span class="sourceLineNo">6163</span>    }<a name="line.6163"></a>
-<span class="sourceLineNo">6164</span>  }<a name="line.6164"></a>
-<span class="sourceLineNo">6165</span><a name="line.6165"></a>
-<span class="sourceLineNo">6166</span>  /**<a name="line.6166"></a>
-<span class="sourceLineNo">6167</span>   * Tests reversed scan under multi regions<a name="line.6167"></a>
-<span class="sourceLineNo">6168</span>   */<a name="line.6168"></a>
-<span class="sourceLineNo">6169</span>  @Test<a name="line.6169"></a>
-<span class="sourceLineNo">6170</span>  public void testReversedScanUnderMultiRegions() throws Exception {<a name="line.6170"></a>
-<span class="sourceLineNo">6171</span>    // Test Initialization.<a name="line.6171"></a>
-<span class="sourceLineNo">6172</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6172"></a>
-<span class="sourceLineNo">6173</span>    byte[] maxByteArray = ConnectionUtils.MAX_BYTE_ARRAY;<a name="line.6173"></a>
-<span class="sourceLineNo">6174</span>    byte[][] splitRows = new byte[][] { Bytes.toBytes("005"),<a name="line.6174"></a>
-<span class="sourceLineNo">6175</span>        Bytes.add(Bytes.toBytes("005"), Bytes.multiple(maxByteArray, 16)),<a name="line.6175"></a>
-<span class="sourceLineNo">6176</span>        Bytes.toBytes("006"),<a name="line.6176"></a>
-<span class="sourceLineNo">6177</span>        Bytes.add(Bytes.toBytes("006"), Bytes.multiple(maxByteArray, 8)),<a name="line.6177"></a>
-<span class="sourceLineNo">6178</span>        Bytes.toBytes("007"),<a name="line.6178"></a>
-<span class="sourceLineNo">6179</span>        Bytes.add(Bytes.toBytes("007"), Bytes.multiple(maxByteArray, 4)),<a name="line.6179"></a>
-<span class="sourceLineNo">6180</span>        Bytes.toBytes("008"), Bytes.multiple(maxByteArray, 2) };<a name="line.6180"></a>
-<span class="sourceLineNo">6181</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY, splitRows)) {<a name="line.6181"></a>
-<span class="sourceLineNo">6182</span>      TEST_UTIL.waitUntilAllRegionsAssigned(table.getName());<a name="line.6182"></a>
-<span class="sourceLineNo">6183</span><a name="line.6183"></a>
-<span class="sourceLineNo">6184</span>      try (RegionLocator l = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.6184"></a>
-<span class="sourceLineNo">6185</span>        assertEquals(splitRows.length + 1, l.getAllRegionLocations().size());<a name="line.6185"></a>
-<span class="sourceLineNo">6186</span>      }<a name="line.6186"></a>
-<span class="sourceLineNo">6187</span>      // Insert one row each region<a name="line.6187"></a>
-<span class="sourceLineNo">6188</span>      int insertNum = splitRows.length;<a name="line.6188"></a>
-<span class="sourceLineNo">6189</span>      for (int i = 0; i &lt; insertNum; i++) {<a name="line.6189"></a>
-<span class="sourceLineNo">6190</span>        Put put = new Put(splitRows[i]);<a name="line.6190"></a>
-<span class="sourceLineNo">6191</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6191"></a>
-<span class="sourceLineNo">6192</span>        table.put(put);<a name="line.6192"></a>
-<span class="sourceLineNo">6193</span>      }<a name="line.6193"></a>
-<span class="sourceLineNo">6194</span><a name="line.6194"></a>
-<span class="sourceLineNo">6195</span>      // scan forward<a name="line.6195"></a>
-<span class="sourceLineNo">6196</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.6196"></a>
-<span class="sourceLineNo">6197</span>        int count = 0;<a name="line.6197"></a>
-<span class="sourceLineNo">6198</span>        for (Result r : scanner) {<a name="line.6198"></a>
-<span class="sourceLineNo">6199</span>          assertTrue(!r.isEmpty());<a name="line.6199"></a>
-<span class="sourceLineNo">6200</span>          count++;<a name="line.6200"></a>
-<span class="sourceLineNo">6201</span>        }<a name="line.6201"></a>
-<span class="sourceLineNo">6202</span>        assertEquals(insertNum, count);<a name="line.6202"></a>
-<span class="sourceLineNo">6203</span>      }<a name="line.6203"></a>
-<span class="sourceLineNo">6204</span><a name="line.6204"></a>
-<span class="sourceLineNo">6205</span>      // scan backward<a name="line.6205"></a>
-<span class="sourceLineNo">6206</span>      Scan scan = new Scan();<a name="line.6206"></a>
-<span class="sourceLineNo">6207</span>      scan.setReversed(true);<a name="line.6207"></a>
-<span class="sourceLineNo">6208</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6208"></a>
-<span class="sourceLineNo">6209</span>        int count = 0;<a name="line.6209"></a>
-<span class="sourceLineNo">6210</span>        byte[] lastRow = null;<a name="line.6210"></a>
-<span class="sourceLineNo">6211</span>        for (Result r : scanner) {<a name="line.6211"></a>
-<span class="sourceLineNo">6212</span>          assertTrue(!r.isEmpty());<a name="line.6212"></a>
-<span class="sourceLineNo">6213</span>          count++;<a name="line.6213"></a>
-<span class="sourceLineNo">6214</span>          byte[] thisRow = r.getRow();<a name="line.6214"></a>
-<span class="sourceLineNo">6215</span>          if (lastRow != null) {<a name="line.6215"></a>
-<span class="sourceLineNo">6216</span>            assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6216"></a>
-<span class="sourceLineNo">6217</span>                            + ",this row=" + Bytes.toString(thisRow),<a name="line.6217"></a>
-<span class="sourceLineNo">6218</span>                    Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6218"></a>
-<span class="sourceLineNo">6219</span>          }<a name="line.6219"></a>
-<span class="sourceLineNo">6220</span>          lastRow = thisRow;<a name="line.6220"></a>
-<span class="sourceLineNo">6221</span>        }<a name="line.6221"></a>
-<span class="sourceLineNo">6222</span>        assertEquals(insertNum, count);<a name="line.6222"></a>
-<span class="sourceLineNo">6223</span>      }<a name="line.6223"></a>
-<span class="sourceLineNo">6224</span>    }<a name="line.6224"></a>
-<span class="sourceLineNo">6225</span>  }<a name="line.6225"></a>
-<span class="sourceLineNo">6226</span><a name="line.6226"></a>
-<span class="sourceLineNo">6227</span>  /**<a name="line.6227"></a>
-<span class="sourceLineNo">6228</span>   * Tests reversed scan under multi regions<a name="line.6228"></a>
-<span class="sourceLineNo">6229</span>   */<a name="line.6229"></a>
-<span class="sourceLineNo">6230</span>  @Test<a name="line.6230"></a>
-<span class="sourceLineNo">6231</span>  public void testSmallReversedScanUnderMultiRegions() throws Exception {<a name="line.6231"></a>
-<span class="sourceLineNo">6232</span>    // Test Initialization.<a name="line.6232"></a>
-<span class="sourceLineNo">6233</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6233"></a>
-<span class="sourceLineNo">6234</span>    byte[][] splitRows = new byte[][]{<a name="line.6234"></a>
-<span class="sourceLineNo">6235</span>        Bytes.toBytes("000"), Bytes.toBytes("002"), Bytes.toBytes("004"),<a name="line.6235"></a>
-<span class="sourceLineNo">6236</span>        Bytes.toBytes("006"), Bytes.toBytes("008"), Bytes.toBytes("010")};<a name="line.6236"></a>
-<span class="sourceLineNo">6237</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY, splitRows)) {<a name="line.6237"></a>
-<span class="sourceLineNo">6238</span>      TEST_UTIL.waitUntilAllRegionsAssigned(table.getName());<a name="line.6238"></a>
-<span class="sourceLineNo">6239</span><a name="line.6239"></a>
-<span class="sourceLineNo">6240</span>      try (RegionLocator l = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.6240"></a>
-<span class="sourceLineNo">6241</span>        assertEquals(splitRows.length + 1, l.getAllRegionLocations().size());<a name="line.6241"></a>
-<span class="sourceLineNo">6242</span>      }<a name="line.6242"></a>
-<span class="sourceLineNo">6243</span>      for (byte[] splitRow : splitRows) {<a name="line.6243"></a>
-<span class="sourceLineNo">6244</span>        Put put = new Put(splitRow);<a name="line.6244"></a>
-<span class="sourceLineNo">6245</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6245"></a>
-<span class="sourceLineNo">6246</span>        table.put(put);<a name="line.6246"></a>
-<span class="sourceLineNo">6247</span><a name="line.6247"></a>
-<span class="sourceLineNo">6248</span>        byte[] nextRow = Bytes.copy(splitRow);<a name="line.6248"></a>
-<span class="sourceLineNo">6249</span>        nextRow[nextRow.length - 1]++;<a name="line.6249"></a>
-<span class="sourceLineNo">6250</span><a name="line.6250"></a>
-<span class="sourceLineNo">6251</span>        put = new Put(nextRow);<a name="line.6251"></a>
-<span class="sourceLineNo">6252</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6252"></a>
-<span class="sourceLineNo">6253</span>        table.put(put);<a name="line.6253"></a>
-<span class="sourceLineNo">6254</span>      }<a name="line.6254"></a>
-<span class="sourceLineNo">6255</span><a name="line.6255"></a>
-<span class="sourceLineNo">6256</span>      // scan forward<a name="line.6256"></a>
-<span class="sourceLineNo">6257</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.6257"></a>
-<span class="sourceLineNo">6258</span>        int count = 0;<a name="line.6258"></a>
-<span class="sourceLineNo">6259</span>        for (Result r : scanner) {<a name="line.6259"></a>
-<span class="sourceLineNo">6260</span>          assertTrue(!r.isEmpty());<a name="line.6260"></a>
-<span class="sourceLineNo">6261</span>          count++;<a name="line.6261"></a>
-<span class="sourceLineNo">6262</span>        }<a name="line.6262"></a>
-<span class="sourceLineNo">6263</span>        assertEquals(12, count);<a name="line.6263"></a>
-<span class="sourceLineNo">6264</span>      }<a name="line.6264"></a>
-<span class="sourceLineNo">6265</span><a name="line.6265"></a>
-<span class="sourceLineNo">6266</span>      reverseScanTest(table, false);<a name="line.6266"></a>
-<span class="sourceLineNo">6267</span>      reverseScanTest(table, true);<a name="line.6267"></a>
-<span class="sourceLineNo">6268</span>    }<a name="line.6268"></a>
-<span class="sourceLineNo">6269</span>  }<a name="line.6269"></a>
-<span class="sourceLineNo">6270</span><a name="line.6270"></a>
-<span class="sourceLineNo">6271</span>  private void reverseScanTest(Table table, boolean small) throws IOException {<a name="line.6271"></a>
-<span class="sourceLineNo">6272</span>    // scan backward<a name="line.6272"></a>
-<span class="sourceLineNo">6273</span>    Scan scan = new Scan();<a name="line.6273"></a>
-<span class="sourceLineNo">6274</span>    scan.setReversed(true);<a name="line.6274"></a>
-<span class="sourceLineNo">6275</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6275"></a>
-<span class="sourceLineNo">6276</span>      int count = 0;<a name="line.6276"></a>
-<span class="sourceLineNo">6277</span>      byte[] lastRow = null;<a name="line.6277"></a>
-<span class="sourceLineNo">6278</span>      for (Result r : scanner) {<a name="line.6278"></a>
-<span class="sourceLineNo">6279</span>        assertTrue(!r.isEmpty());<a name="line.6279"></a>
-<span class="sourceLineNo">6280</span>        count++;<a name="line.6280"></a>
-<span class="sourceLineNo">6281</span>        byte[] thisRow = r.getRow();<a name="line.6281"></a>
-<span class="sourceLineNo">6282</span>        if (lastRow != null) {<a name="line.6282"></a>
-<span class="sourceLineNo">6283</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6283"></a>
-<span class="sourceLineNo">6284</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6284"></a>
-<span class="sourceLineNo">6285</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6285"></a>
-<span class="sourceLineNo">6286</span>        }<a name="line.6286"></a>
-<span class="sourceLineNo">6287</span>        lastRow = thisRow;<a name="line.6287"></a>
-<span class="sourceLineNo">6288</span>      }<a name="line.6288"></a>
-<span class="sourceLineNo">6289</span>      assertEquals(12, count);<a name="line.6289"></a>
-<span class="sourceLineNo">6290</span>    }<a name="line.6290"></a>
+<span class="sourceLineNo">6135</span>      scan = new Scan(ROWS[0]);<a name="line.6135"></a>
+<span class="sourceLineNo">6136</span>      scan.setReversed(true);<a name="line.6136"></a>
+<span class="sourceLineNo">6137</span>      scan.addFamily(FAMILIES[1]);<a name="line.6137"></a>
+<span class="sourceLineNo">6138</span>      scan.addFamily(FAMILIES[2]);<a name="line.6138"></a>
+<span class="sourceLineNo">6139</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6139"></a>
+<span class="sourceLineNo">6140</span>      result = getSingleScanResult(ht, scan);<a name="line.6140"></a>
+<span class="sourceLineNo">6141</span>      assertTrue("Expected 2 keys but received " + result.size(),<a name="line.6141"></a>
+<span class="sourceLineNo">6142</span>              result.size() == 2);<a name="line.6142"></a>
+<span class="sourceLineNo">6143</span>      assertNResult(result, ROWS[0], FAMILIES[1], QUALIFIER, new long[]{ts[0],<a name="line.6143"></a>
+<span class="sourceLineNo">6144</span>              ts[1]}, new byte[][]{VALUES[0], VALUES[1]}, 0, 1);<a name="line.6144"></a>
+<span class="sourceLineNo">6145</span><a name="line.6145"></a>
+<span class="sourceLineNo">6146</span>      scan = new Scan(ROWS[1]);<a name="line.6146"></a>
+<span class="sourceLineNo">6147</span>      scan.setReversed(true);<a name="line.6147"></a>
+<span class="sourceLineNo">6148</span>      scan.addFamily(FAMILIES[1]);<a name="line.6148"></a>
+<span class="sourceLineNo">6149</span>      scan.addFamily(FAMILIES[2]);<a name="line.6149"></a>
+<span class="sourceLineNo">6150</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6150"></a>
+<span class="sourceLineNo">6151</span>      result = getSingleScanResult(ht, scan);<a name="line.6151"></a>
+<span class="sourceLineNo">6152</span>      assertTrue("Expected 2 keys but received " + result.size(),<a name="line.6152"></a>
+<span class="sourceLineNo">6153</span>              result.size() == 2);<a name="line.6153"></a>
+<span class="sourceLineNo">6154</span><a name="line.6154"></a>
+<span class="sourceLineNo">6155</span>      scan = new Scan(ROWS[2]);<a name="line.6155"></a>
+<span class="sourceLineNo">6156</span>      scan.setReversed(true);<a name="line.6156"></a>
+<span class="sourceLineNo">6157</span>      scan.addFamily(FAMILIES[1]);<a name="line.6157"></a>
+<span class="sourceLineNo">6158</span>      scan.addFamily(FAMILIES[2]);<a name="line.6158"></a>
+<span class="sourceLineNo">6159</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6159"></a>
+<span class="sourceLineNo">6160</span>      result = getSingleScanResult(ht, scan);<a name="line.6160"></a>
+<span class="sourceLineNo">6161</span>      assertEquals(1, result.size());<a name="line.6161"></a>
+<span class="sourceLineNo">6162</span>      assertNResult(result, ROWS[2], FAMILIES[2], QUALIFIER,<a name="line.6162"></a>
+<span class="sourceLineNo">6163</span>              new long[]{ts[2]}, new byte[][]{VALUES[2]}, 0, 0);<a name="line.6163"></a>
+<span class="sourceLineNo">6164</span><a name="line.6164"></a>
+<span class="sourceLineNo">6165</span>      // Test if we delete the family first in one row (HBASE-1541)<a name="line.6165"></a>
+<span class="sourceLineNo">6166</span><a name="line.6166"></a>
+<span class="sourceLineNo">6167</span>      delete = new Delete(ROWS[3]);<a name="line.6167"></a>
+<span class="sourceLineNo">6168</span>      delete.addFamily(FAMILIES[1]);<a name="line.6168"></a>
+<span class="sourceLineNo">6169</span>      ht.delete(delete);<a name="line.6169"></a>
+<span class="sourceLineNo">6170</span><a name="line.6170"></a>
+<span class="sourceLineNo">6171</span>      put = new Put(ROWS[3]);<a name="line.6171"></a>
+<span class="sourceLineNo">6172</span>      put.addColumn(FAMILIES[2], QUALIFIER, VALUES[0]);<a name="line.6172"></a>
+<span class="sourceLineNo">6173</span>      ht.put(put);<a name="line.6173"></a>
+<span class="sourceLineNo">6174</span><a name="line.6174"></a>
+<span class="sourceLineNo">6175</span>      put = new Put(ROWS[4]);<a name="line.6175"></a>
+<span class="sourceLineNo">6176</span>      put.addColumn(FAMILIES[1], QUALIFIER, VALUES[1]);<a name="line.6176"></a>
+<span class="sourceLineNo">6177</span>      put.addColumn(FAMILIES[2], QUALIFIER, VALUES[2]);<a name="line.6177"></a>
+<span class="sourceLineNo">6178</span>      ht.put(put);<a name="line.6178"></a>
+<span class="sourceLineNo">6179</span><a name="line.6179"></a>
+<span class="sourceLineNo">6180</span>      scan = new Scan(ROWS[4]);<a name="line.6180"></a>
+<span class="sourceLineNo">6181</span>      scan.setReversed(true);<a name="line.6181"></a>
+<span class="sourceLineNo">6182</span>      scan.addFamily(FAMILIES[1]);<a name="line.6182"></a>
+<span class="sourceLineNo">6183</span>      scan.addFamily(FAMILIES[2]);<a name="line.6183"></a>
+<span class="sourceLineNo">6184</span>      scan.setMaxVersions(Integer.MAX_VALUE);<a name="line.6184"></a>
+<span class="sourceLineNo">6185</span>      ResultScanner scanner = ht.getScanner(scan);<a name="line.6185"></a>
+<span class="sourceLineNo">6186</span>      result = scanner.next();<a name="line.6186"></a>
+<span class="sourceLineNo">6187</span>      assertTrue("Expected 2 keys but received " + result.size(),<a name="line.6187"></a>
+<span class="sourceLineNo">6188</span>              result.size() == 2);<a name="line.6188"></a>
+<span class="sourceLineNo">6189</span>      assertTrue(Bytes.equals(CellUtil.cloneRow(result.rawCells()[0]), ROWS[4]));<a name="line.6189"></a>
+<span class="sourceLineNo">6190</span>      assertTrue(Bytes.equals(CellUtil.cloneRow(result.rawCells()[1]), ROWS[4]));<a name="line.6190"></a>
+<span class="sourceLineNo">6191</span>      assertTrue(Bytes.equals(CellUtil.cloneValue(result.rawCells()[0]), VALUES[1]));<a name="line.6191"></a>
+<span class="sourceLineNo">6192</span>      assertTrue(Bytes.equals(CellUtil.cloneValue(result.rawCells()[1]), VALUES[2]));<a name="line.6192"></a>
+<span class="sourceLineNo">6193</span>      result = scanner.next();<a name="line.6193"></a>
+<span class="sourceLineNo">6194</span>      assertTrue("Expected 1 key but received " + result.size(),<a name="line.6194"></a>
+<span class="sourceLineNo">6195</span>              result.size() == 1);<a name="line.6195"></a>
+<span class="sourceLineNo">6196</span>      assertTrue(Bytes.equals(CellUtil.cloneRow(result.rawCells()[0]), ROWS[3]));<a name="line.6196"></a>
+<span class="sourceLineNo">6197</span>      assertTrue(Bytes.equals(CellUtil.cloneValue(result.rawCells()[0]), VALUES[0]));<a name="line.6197"></a>
+<span class="sourceLineNo">6198</span>      scanner.close();<a name="line.6198"></a>
+<span class="sourceLineNo">6199</span>    }<a name="line.6199"></a>
+<span class="sourceLineNo">6200</span>  }<a name="line.6200"></a>
+<span class="sourceLineNo">6201</span><a name="line.6201"></a>
+<span class="sourceLineNo">6202</span>  /**<a name="line.6202"></a>
+<span class="sourceLineNo">6203</span>   * Tests reversed scan under multi regions<a name="line.6203"></a>
+<span class="sourceLineNo">6204</span>   */<a name="line.6204"></a>
+<span class="sourceLineNo">6205</span>  @Test<a name="line.6205"></a>
+<span class="sourceLineNo">6206</span>  public void testReversedScanUnderMultiRegions() throws Exception {<a name="line.6206"></a>
+<span class="sourceLineNo">6207</span>    // Test Initialization.<a name="line.6207"></a>
+<span class="sourceLineNo">6208</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6208"></a>
+<span class="sourceLineNo">6209</span>    byte[] maxByteArray = ConnectionUtils.MAX_BYTE_ARRAY;<a name="line.6209"></a>
+<span class="sourceLineNo">6210</span>    byte[][] splitRows = new byte[][] { Bytes.toBytes("005"),<a name="line.6210"></a>
+<span class="sourceLineNo">6211</span>        Bytes.add(Bytes.toBytes("005"), Bytes.multiple(maxByteArray, 16)),<a name="line.6211"></a>
+<span class="sourceLineNo">6212</span>        Bytes.toBytes("006"),<a name="line.6212"></a>
+<span class="sourceLineNo">6213</span>        Bytes.add(Bytes.toBytes("006"), Bytes.multiple(maxByteArray, 8)),<a name="line.6213"></a>
+<span class="sourceLineNo">6214</span>        Bytes.toBytes("007"),<a name="line.6214"></a>
+<span class="sourceLineNo">6215</span>        Bytes.add(Bytes.toBytes("007"), Bytes.multiple(maxByteArray, 4)),<a name="line.6215"></a>
+<span class="sourceLineNo">6216</span>        Bytes.toBytes("008"), Bytes.multiple(maxByteArray, 2) };<a name="line.6216"></a>
+<span class="sourceLineNo">6217</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY, splitRows)) {<a name="line.6217"></a>
+<span class="sourceLineNo">6218</span>      TEST_UTIL.waitUntilAllRegionsAssigned(table.getName());<a name="line.6218"></a>
+<span class="sourceLineNo">6219</span><a name="line.6219"></a>
+<span class="sourceLineNo">6220</span>      try (RegionLocator l = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.6220"></a>
+<span class="sourceLineNo">6221</span>        assertEquals(splitRows.length + 1, l.getAllRegionLocations().size());<a name="line.6221"></a>
+<span class="sourceLineNo">6222</span>      }<a name="line.6222"></a>
+<span class="sourceLineNo">6223</span>      // Insert one row each region<a name="line.6223"></a>
+<span class="sourceLineNo">6224</span>      int insertNum = splitRows.length;<a name="line.6224"></a>
+<span class="sourceLineNo">6225</span>      for (int i = 0; i &lt; insertNum; i++) {<a name="line.6225"></a>
+<span class="sourceLineNo">6226</span>        Put put = new Put(splitRows[i]);<a name="line.6226"></a>
+<span class="sourceLineNo">6227</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6227"></a>
+<span class="sourceLineNo">6228</span>        table.put(put);<a name="line.6228"></a>
+<span class="sourceLineNo">6229</span>      }<a name="line.6229"></a>
+<span class="sourceLineNo">6230</span><a name="line.6230"></a>
+<span class="sourceLineNo">6231</span>      // scan forward<a name="line.6231"></a>
+<span class="sourceLineNo">6232</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.6232"></a>
+<span class="sourceLineNo">6233</span>        int count = 0;<a name="line.6233"></a>
+<span class="sourceLineNo">6234</span>        for (Result r : scanner) {<a name="line.6234"></a>
+<span class="sourceLineNo">6235</span>          assertTrue(!r.isEmpty());<a name="line.6235"></a>
+<span class="sourceLineNo">6236</span>          count++;<a name="line.6236"></a>
+<span class="sourceLineNo">6237</span>        }<a name="line.6237"></a>
+<span class="sourceLineNo">6238</span>        assertEquals(insertNum, count);<a name="line.6238"></a>
+<span class="sourceLineNo">6239</span>      }<a name="line.6239"></a>
+<span class="sourceLineNo">6240</span><a name="line.6240"></a>
+<span class="sourceLineNo">6241</span>      // scan backward<a name="line.6241"></a>
+<span class="sourceLineNo">6242</span>      Scan scan = new Scan();<a name="line.6242"></a>
+<span class="sourceLineNo">6243</span>      scan.setReversed(true);<a name="line.6243"></a>
+<span class="sourceLineNo">6244</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6244"></a>
+<span class="sourceLineNo">6245</span>        int count = 0;<a name="line.6245"></a>
+<span class="sourceLineNo">6246</span>        byte[] lastRow = null;<a name="line.6246"></a>
+<span class="sourceLineNo">6247</span>        for (Result r : scanner) {<a name="line.6247"></a>
+<span class="sourceLineNo">6248</span>          assertTrue(!r.isEmpty());<a name="line.6248"></a>
+<span class="sourceLineNo">6249</span>          count++;<a name="line.6249"></a>
+<span class="sourceLineNo">6250</span>          byte[] thisRow = r.getRow();<a name="line.6250"></a>
+<span class="sourceLineNo">6251</span>          if (lastRow != null) {<a name="line.6251"></a>
+<span class="sourceLineNo">6252</span>            assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6252"></a>
+<span class="sourceLineNo">6253</span>                            + ",this row=" + Bytes.toString(thisRow),<a name="line.6253"></a>
+<span class="sourceLineNo">6254</span>                    Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6254"></a>
+<span class="sourceLineNo">6255</span>          }<a name="line.6255"></a>
+<span class="sourceLineNo">6256</span>          lastRow = thisRow;<a name="line.6256"></a>
+<span class="sourceLineNo">6257</span>        }<a name="line.6257"></a>
+<span class="sourceLineNo">6258</span>        assertEquals(insertNum, count);<a name="line.6258"></a>
+<span class="sourceLineNo">6259</span>      }<a name="line.6259"></a>
+<span class="sourceLineNo">6260</span>    }<a name="line.6260"></a>
+<span class="sourceLineNo">6261</span>  }<a name="line.6261"></a>
+<span class="sourceLineNo">6262</span><a name="line.6262"></a>
+<span class="sourceLineNo">6263</span>  /**<a name="line.6263"></a>
+<span class="sourceLineNo">6264</span>   * Tests reversed scan under multi regions<a name="line.6264"></a>
+<span class="sourceLineNo">6265</span>   */<a name="line.6265"></a>
+<span class="sourceLineNo">6266</span>  @Test<a name="line.6266"></a>
+<span class="sourceLineNo">6267</span>  public void testSmallReversedScanUnderMultiRegions() throws Exception {<a name="line.6267"></a>
+<span class="sourceLineNo">6268</span>    // Test Initialization.<a name="line.6268"></a>
+<span class="sourceLineNo">6269</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6269"></a>
+<span class="sourceLineNo">6270</span>    byte[][] splitRows = new byte[][]{<a name="line.6270"></a>
+<span class="sourceLineNo">6271</span>        Bytes.toBytes("000"), Bytes.toBytes("002"), Bytes.toBytes("004"),<a name="line.6271"></a>
+<span class="sourceLineNo">6272</span>        Bytes.toBytes("006"), Bytes.toBytes("008"), Bytes.toBytes("010")};<a name="line.6272"></a>
+<span class="sourceLineNo">6273</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY, splitRows)) {<a name="line.6273"></a>
+<span class="sourceLineNo">6274</span>      TEST_UTIL.waitUntilAllRegionsAssigned(table.getName());<a name="line.6274"></a>
+<span class="sourceLineNo">6275</span><a name="line.6275"></a>
+<span class="sourceLineNo">6276</span>      try (RegionLocator l = TEST_UTIL.getConnection().getRegionLocator(tableName)) {<a name="line.6276"></a>
+<span class="sourceLineNo">6277</span>        assertEquals(splitRows.length + 1, l.getAllRegionLocations().size());<a name="line.6277"></a>
+<span class="sourceLineNo">6278</span>      }<a name="line.6278"></a>
+<span class="sourceLineNo">6279</span>      for (byte[] splitRow : splitRows) {<a name="line.6279"></a>
+<span class="sourceLineNo">6280</span>        Put put = new Put(splitRow);<a name="line.6280"></a>
+<span class="sourceLineNo">6281</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6281"></a>
+<span class="sourceLineNo">6282</span>        table.put(put);<a name="line.6282"></a>
+<span class="sourceLineNo">6283</span><a name="line.6283"></a>
+<span class="sourceLineNo">6284</span>        byte[] nextRow = Bytes.copy(splitRow);<a name="line.6284"></a>
+<span class="sourceLineNo">6285</span>        nextRow[nextRow.length - 1]++;<a name="line.6285"></a>
+<span class="sourceLineNo">6286</span><a name="line.6286"></a>
+<span class="sourceLineNo">6287</span>        put = new Put(nextRow);<a name="line.6287"></a>
+<span class="sourceLineNo">6288</span>        put.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6288"></a>
+<span class="sourceLineNo">6289</span>        table.put(put);<a name="line.6289"></a>
+<span class="sourceLineNo">6290</span>      }<a name="line.6290"></a>
 <span class="sourceLineNo">6291</span><a name="line.6291"></a>
-<span class="sourceLineNo">6292</span>    scan = new Scan();<a name="line.6292"></a>
-<span class="sourceLineNo">6293</span>    scan.setSmall(small);<a name="line.6293"></a>
-<span class="sourceLineNo">6294</span>    scan.setReversed(true);<a name="line.6294"></a>
-<span class="sourceLineNo">6295</span>    scan.setStartRow(Bytes.toBytes("002"));<a name="line.6295"></a>
-<span class="sourceLineNo">6296</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6296"></a>
-<span class="sourceLineNo">6297</span>      int count = 0;<a name="line.6297"></a>
-<span class="sourceLineNo">6298</span>      byte[] lastRow = null;<a name="line.6298"></a>
-<span class="sourceLineNo">6299</span>      for (Result r : scanner) {<a name="line.6299"></a>
-<span class="sourceLineNo">6300</span>        assertTrue(!r.isEmpty());<a name="line.6300"></a>
-<span class="sourceLineNo">6301</span>        count++;<a name="line.6301"></a>
-<span class="sourceLineNo">6302</span>        byte[] thisRow = r.getRow();<a name="line.6302"></a>
-<span class="sourceLineNo">6303</span>        if (lastRow != null) {<a name="line.6303"></a>
-<span class="sourceLineNo">6304</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6304"></a>
-<span class="sourceLineNo">6305</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6305"></a>
-<span class="sourceLineNo">6306</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6306"></a>
-<span class="sourceLineNo">6307</span>        }<a name="line.6307"></a>
-<span class="sourceLineNo">6308</span>        lastRow = thisRow;<a name="line.6308"></a>
-<span class="sourceLineNo">6309</span>      }<a name="line.6309"></a>
-<span class="sourceLineNo">6310</span>      assertEquals(3, count); // 000 001 002<a name="line.6310"></a>
-<span class="sourceLineNo">6311</span>    }<a name="line.6311"></a>
-<span class="sourceLineNo">6312</span><a name="line.6312"></a>
-<span class="sourceLineNo">6313</span>    scan = new Scan();<a name="line.6313"></a>
-<span class="sourceLineNo">6314</span>    scan.setSmall(small);<a name="line.6314"></a>
-<span class="sourceLineNo">6315</span>    scan.setReversed(true);<a name="line.6315"></a>
-<span class="sourceLineNo">6316</span>    scan.setStartRow(Bytes.toBytes("002"));<a name="line.6316"></a>
-<span class="sourceLineNo">6317</span>    scan.setStopRow(Bytes.toBytes("000"));<a name="line.6317"></a>
-<span class="sourceLineNo">6318</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6318"></a>
-<span class="sourceLineNo">6319</span>      int count = 0;<a name="line.6319"></a>
-<span class="sourceLineNo">6320</span>      byte[] lastRow = null;<a name="line.6320"></a>
-<span class="sourceLineNo">6321</span>      for (Result r : scanner) {<a name="line.6321"></a>
-<span class="sourceLineNo">6322</span>        assertTrue(!r.isEmpty());<a name="line.6322"></a>
-<span class="sourceLineNo">6323</span>        count++;<a name="line.6323"></a>
-<span class="sourceLineNo">6324</span>        byte[] thisRow = r.getRow();<a name="line.6324"></a>
-<span class="sourceLineNo">6325</span>        if (lastRow != null) {<a name="line.6325"></a>
-<span class="sourceLineNo">6326</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6326"></a>
-<span class="sourceLineNo">6327</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6327"></a>
-<span class="sourceLineNo">6328</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6328"></a>
-<span class="sourceLineNo">6329</span>        }<a name="line.6329"></a>
-<span class="sourceLineNo">6330</span>        lastRow = thisRow;<a name="line.6330"></a>
-<span class="sourceLineNo">6331</span>      }<a name="line.6331"></a>
-<span class="sourceLineNo">6332</span>      assertEquals(2, count); // 001 002<a name="line.6332"></a>
-<span class="sourceLineNo">6333</span>    }<a name="line.6333"></a>
-<span class="sourceLineNo">6334</span><a name="line.6334"></a>
-<span class="sourceLineNo">6335</span>    scan = new Scan();<a name="line.6335"></a>
-<span class="sourceLineNo">6336</span>    scan.setSmall(small);<a name="line.6336"></a>
-<span class="sourceLineNo">6337</span>    scan.setReversed(true);<a name="line.6337"></a>
-<span class="sourceLineNo">6338</span>    scan.setStartRow(Bytes.toBytes("001"));<a name="line.6338"></a>
-<span class="sourceLineNo">6339</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6339"></a>
-<span class="sourceLineNo">6340</span>      int count = 0;<a name="line.6340"></a>
-<span class="sourceLineNo">6341</span>      byte[] lastRow = null;<a name="line.6341"></a>
-<span class="sourceLineNo">6342</span>      for (Result r : scanner) {<a name="line.6342"></a>
-<span class="sourceLineNo">6343</span>        assertTrue(!r.isEmpty());<a name="line.6343"></a>
-<span class="sourceLineNo">6344</span>        count++;<a name="line.6344"></a>
-<span class="sourceLineNo">6345</span>        byte[] thisRow = r.getRow();<a name="line.6345"></a>
-<span class="sourceLineNo">6346</span>        if (lastRow != null) {<a name="line.6346"></a>
-<span class="sourceLineNo">6347</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6347"></a>
-<span class="sourceLineNo">6348</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6348"></a>
-<span class="sourceLineNo">6349</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6349"></a>
-<span class="sourceLineNo">6350</span>        }<a name="line.6350"></a>
-<span class="sourceLineNo">6351</span>        lastRow = thisRow;<a name="line.6351"></a>
-<span class="sourceLineNo">6352</span>      }<a name="line.6352"></a>
-<span class="sourceLineNo">6353</span>      assertEquals(2, count); // 000 001<a name="line.6353"></a>
-<span class="sourceLineNo">6354</span>    }<a name="line.6354"></a>
-<span class="sourceLineNo">6355</span><a name="line.6355"></a>
-<span class="sourceLineNo">6356</span>    scan = new Scan();<a name="line.6356"></a>
-<span class="sourceLineNo">6357</span>    scan.setSmall(small);<a name="line.6357"></a>
-<span class="sourceLineNo">6358</span>    scan.setReversed(true);<a name="line.6358"></a>
-<span class="sourceLineNo">6359</span>    scan.setStartRow(Bytes.toBytes("000"));<a name="line.6359"></a>
-<span class="sourceLineNo">6360</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6360"></a>
-<span class="sourceLineNo">6361</span>      int count = 0;<a name="line.6361"></a>
-<span class="sourceLineNo">6362</span>      byte[] lastRow = null;<a name="line.6362"></a>
-<span class="sourceLineNo">6363</span>      for (Result r : scanner) {<a name="line.6363"></a>
-<span class="sourceLineNo">6364</span>        assertTrue(!r.isEmpty());<a name="line.6364"></a>
-<span class="sourceLineNo">6365</span>        count++;<a name="line.6365"></a>
-<span class="sourceLineNo">6366</span>        byte[] thisRow = r.getRow();<a name="line.6366"></a>
-<span class="sourceLineNo">6367</span>        if (lastRow != null) {<a name="line.6367"></a>
-<span class="sourceLineNo">6368</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6368"></a>
-<span class="sourceLineNo">6369</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6369"></a>
-<span class="sourceLineNo">6370</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6370"></a>
-<span class="sourceLineNo">6371</span>        }<a name="line.6371"></a>
-<span class="sourceLineNo">6372</span>        lastRow = thisRow;<a name="line.6372"></a>
-<span class="sourceLineNo">6373</span>      }<a name="line.6373"></a>
-<span class="sourceLineNo">6374</span>      assertEquals(1, count); // 000<a name="line.6374"></a>
-<span class="sourceLineNo">6375</span>    }<a name="line.6375"></a>
-<span class="sourceLineNo">6376</span><a name="line.6376"></a>
-<span class="sourceLineNo">6377</span>    scan = new Scan();<a name="line.6377"></a>
-<span class="sourceLineNo">6378</span>    scan.setSmall(small);<a name="line.6378"></a>
-<span class="sourceLineNo">6379</span>    scan.setReversed(true);<a name="line.6379"></a>
-<span class="sourceLineNo">6380</span>    scan.setStartRow(Bytes.toBytes("006"));<a name="line.6380"></a>
-<span class="sourceLineNo">6381</span>    scan.setStopRow(Bytes.toBytes("002"));<a name="line.6381"></a>
-<span class="sourceLineNo">6382</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6382"></a>
-<span class="sourceLineNo">6383</span>      int count = 0;<a name="line.6383"></a>
-<span class="sourceLineNo">6384</span>      byte[] lastRow = null;<a name="line.6384"></a>
-<span class="sourceLineNo">6385</span>      for (Result r : scanner) {<a name="line.6385"></a>
-<span class="sourceLineNo">6386</span>        assertTrue(!r.isEmpty());<a name="line.6386"></a>
-<span class="sourceLineNo">6387</span>        count++;<a name="line.6387"></a>
-<span class="sourceLineNo">6388</span>        byte[] thisRow = r.getRow();<a name="line.6388"></a>
-<span class="sourceLineNo">6389</span>        if (lastRow != null) {<a name="line.6389"></a>
-<span class="sourceLineNo">6390</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6390"></a>
-<span class="sourceLineNo">6391</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6391"></a>
-<span class="sourceLineNo">6392</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6392"></a>
-<span class="sourceLineNo">6393</span>        }<a name="line.6393"></a>
-<span class="sourceLineNo">6394</span>        lastRow = thisRow;<a name="line.6394"></a>
-<span class="sourceLineNo">6395</span>      }<a name="line.6395"></a>
-<span class="sourceLineNo">6396</span>      assertEquals(4, count); // 003 004 005 006<a name="line.6396"></a>
-<span class="sourceLineNo">6397</span>    }<a name="line.6397"></a>
-<span class="sourceLineNo">6398</span>  }<a name="line.6398"></a>
-<span class="sourceLineNo">6399</span><a name="line.6399"></a>
-<span class="sourceLineNo">6400</span>  @Test<a name="line.6400"></a>
-<span class="sourceLineNo">6401</span>  public void testFilterAllRecords() throws IOException {<a name="line.6401"></a>
-<span class="sourceLineNo">6402</span>    Scan scan = new Scan();<a name="line.6402"></a>
-<span class="sourceLineNo">6403</span>    scan.setBatch(1);<a name="line.6403"></a>
-<span class="sourceLineNo">6404</span>    scan.setCaching(1);<a name="line.6404"></a>
-<span class="sourceLineNo">6405</span>    // Filter out any records<a name="line.6405"></a>
-<span class="sourceLineNo">6406</span>    scan.setFilter(new FilterList(new FirstKeyOnlyFilter(), new InclusiveStopFilter(new byte[0])));<a name="line.6406"></a>
-<span class="sourceLineNo">6407</span>    try (Table table = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME)) {<a name="line.6407"></a>
-<span class="sourceLineNo">6408</span>      try (ResultScanner s = table.getScanner(scan)) {<a name="line.6408"></a>
-<span class="sourceLineNo">6409</span>        assertNull(s.next());<a name="line.6409"></a>
-<span class="sourceLineNo">6410</span>      }<a name="line.6410"></a>
+<span class="sourceLineNo">6292</span>      // scan forward<a name="line.6292"></a>
+<span class="sourceLineNo">6293</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.6293"></a>
+<span class="sourceLineNo">6294</span>        int count = 0;<a name="line.6294"></a>
+<span class="sourceLineNo">6295</span>        for (Result r : scanner) {<a name="line.6295"></a>
+<span class="sourceLineNo">6296</span>          assertTrue(!r.isEmpty());<a name="line.6296"></a>
+<span class="sourceLineNo">6297</span>          count++;<a name="line.6297"></a>
+<span class="sourceLineNo">6298</span>        }<a name="line.6298"></a>
+<span class="sourceLineNo">6299</span>        assertEquals(12, count);<a name="line.6299"></a>
+<span class="sourceLineNo">6300</span>      }<a name="line.6300"></a>
+<span class="sourceLineNo">6301</span><a name="line.6301"></a>
+<span class="sourceLineNo">6302</span>      reverseScanTest(table, false);<a name="line.6302"></a>
+<span class="sourceLineNo">6303</span>      reverseScanTest(table, true);<a name="line.6303"></a>
+<span class="sourceLineNo">6304</span>    }<a name="line.6304"></a>
+<span class="sourceLineNo">6305</span>  }<a name="line.6305"></a>
+<span class="sourceLineNo">6306</span><a name="line.6306"></a>
+<span class="sourceLineNo">6307</span>  private void reverseScanTest(Table table, boolean small) throws IOException {<a name="line.6307"></a>
+<span class="sourceLineNo">6308</span>    // scan backward<a name="line.6308"></a>
+<span class="sourceLineNo">6309</span>    Scan scan = new Scan();<a name="line.6309"></a>
+<span class="sourceLineNo">6310</span>    scan.setReversed(true);<a name="line.6310"></a>
+<span class="sourceLineNo">6311</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6311"></a>
+<span class="sourceLineNo">6312</span>      int count = 0;<a name="line.6312"></a>
+<span class="sourceLineNo">6313</span>      byte[] lastRow = null;<a name="line.6313"></a>
+<span class="sourceLineNo">6314</span>      for (Result r : scanner) {<a name="line.6314"></a>
+<span class="sourceLineNo">6315</span>        assertTrue(!r.isEmpty());<a name="line.6315"></a>
+<span class="sourceLineNo">6316</span>        count++;<a name="line.6316"></a>
+<span class="sourceLineNo">6317</span>        byte[] thisRow = r.getRow();<a name="line.6317"></a>
+<span class="sourceLineNo">6318</span>        if (lastRow != null) {<a name="line.6318"></a>
+<span class="sourceLineNo">6319</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6319"></a>
+<span class="sourceLineNo">6320</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6320"></a>
+<span class="sourceLineNo">6321</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6321"></a>
+<span class="sourceLineNo">6322</span>        }<a name="line.6322"></a>
+<span class="sourceLineNo">6323</span>        lastRow = thisRow;<a name="line.6323"></a>
+<span class="sourceLineNo">6324</span>      }<a name="line.6324"></a>
+<span class="sourceLineNo">6325</span>      assertEquals(12, count);<a name="line.6325"></a>
+<span class="sourceLineNo">6326</span>    }<a name="line.6326"></a>
+<span class="sourceLineNo">6327</span><a name="line.6327"></a>
+<span class="sourceLineNo">6328</span>    scan = new Scan();<a name="line.6328"></a>
+<span class="sourceLineNo">6329</span>    scan.setSmall(small);<a name="line.6329"></a>
+<span class="sourceLineNo">6330</span>    scan.setReversed(true);<a name="line.6330"></a>
+<span class="sourceLineNo">6331</span>    scan.setStartRow(Bytes.toBytes("002"));<a name="line.6331"></a>
+<span class="sourceLineNo">6332</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6332"></a>
+<span class="sourceLineNo">6333</span>      int count = 0;<a name="line.6333"></a>
+<span class="sourceLineNo">6334</span>      byte[] lastRow = null;<a name="line.6334"></a>
+<span class="sourceLineNo">6335</span>      for (Result r : scanner) {<a name="line.6335"></a>
+<span class="sourceLineNo">6336</span>        assertTrue(!r.isEmpty());<a name="line.6336"></a>
+<span class="sourceLineNo">6337</span>        count++;<a name="line.6337"></a>
+<span class="sourceLineNo">6338</span>        byte[] thisRow = r.getRow();<a name="line.6338"></a>
+<span class="sourceLineNo">6339</span>        if (lastRow != null) {<a name="line.6339"></a>
+<span class="sourceLineNo">6340</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6340"></a>
+<span class="sourceLineNo">6341</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6341"></a>
+<span class="sourceLineNo">6342</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6342"></a>
+<span class="sourceLineNo">6343</span>        }<a name="line.6343"></a>
+<span class="sourceLineNo">6344</span>        lastRow = thisRow;<a name="line.6344"></a>
+<span class="sourceLineNo">6345</span>      }<a name="line.6345"></a>
+<span class="sourceLineNo">6346</span>      assertEquals(3, count); // 000 001 002<a name="line.6346"></a>
+<span class="sourceLineNo">6347</span>    }<a name="line.6347"></a>
+<span class="sourceLineNo">6348</span><a name="line.6348"></a>
+<span class="sourceLineNo">6349</span>    scan = new Scan();<a name="line.6349"></a>
+<span class="sourceLineNo">6350</span>    scan.setSmall(small);<a name="line.6350"></a>
+<span class="sourceLineNo">6351</span>    scan.setReversed(true);<a name="line.6351"></a>
+<span class="sourceLineNo">6352</span>    scan.setStartRow(Bytes.toBytes("002"));<a name="line.6352"></a>
+<span class="sourceLineNo">6353</span>    scan.setStopRow(Bytes.toBytes("000"));<a name="line.6353"></a>
+<span class="sourceLineNo">6354</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6354"></a>
+<span class="sourceLineNo">6355</span>      int count = 0;<a name="line.6355"></a>
+<span class="sourceLineNo">6356</span>      byte[] lastRow = null;<a name="line.6356"></a>
+<span class="sourceLineNo">6357</span>      for (Result r : scanner) {<a name="line.6357"></a>
+<span class="sourceLineNo">6358</span>        assertTrue(!r.isEmpty());<a name="line.6358"></a>
+<span class="sourceLineNo">6359</span>        count++;<a name="line.6359"></a>
+<span class="sourceLineNo">6360</span>        byte[] thisRow = r.getRow();<a name="line.6360"></a>
+<span class="sourceLineNo">6361</span>        if (lastRow != null) {<a name="line.6361"></a>
+<span class="sourceLineNo">6362</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6362"></a>
+<span class="sourceLineNo">6363</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6363"></a>
+<span class="sourceLineNo">6364</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6364"></a>
+<span class="sourceLineNo">6365</span>        }<a name="line.6365"></a>
+<span class="sourceLineNo">6366</span>        lastRow = thisRow;<a name="line.6366"></a>
+<span class="sourceLineNo">6367</span>      }<a name="line.6367"></a>
+<span class="sourceLineNo">6368</span>      assertEquals(2, count); // 001 002<a name="line.6368"></a>
+<span class="sourceLineNo">6369</span>    }<a name="line.6369"></a>
+<span class="sourceLineNo">6370</span><a name="line.6370"></a>
+<span class="sourceLineNo">6371</span>    scan = new Scan();<a name="line.6371"></a>
+<span class="sourceLineNo">6372</span>    scan.setSmall(small);<a name="line.6372"></a>
+<span class="sourceLineNo">6373</span>    scan.setReversed(true);<a name="line.6373"></a>
+<span class="sourceLineNo">6374</span>    scan.setStartRow(Bytes.toBytes("001"));<a name="line.6374"></a>
+<span class="sourceLineNo">6375</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6375"></a>
+<span class="sourceLineNo">6376</span>      int count = 0;<a name="line.6376"></a>
+<span class="sourceLineNo">6377</span>      byte[] lastRow = null;<a name="line.6377"></a>
+<span class="sourceLineNo">6378</span>      for (Result r : scanner) {<a name="line.6378"></a>
+<span class="sourceLineNo">6379</span>        assertTrue(!r.isEmpty());<a name="line.6379"></a>
+<span class="sourceLineNo">6380</span>        count++;<a name="line.6380"></a>
+<span class="sourceLineNo">6381</span>        byte[] thisRow = r.getRow();<a name="line.6381"></a>
+<span class="sourceLineNo">6382</span>        if (lastRow != null) {<a name="line.6382"></a>
+<span class="sourceLineNo">6383</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6383"></a>
+<span class="sourceLineNo">6384</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6384"></a>
+<span class="sourceLineNo">6385</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6385"></a>
+<span class="sourceLineNo">6386</span>        }<a name="line.6386"></a>
+<span class="sourceLineNo">6387</span>        lastRow = thisRow;<a name="line.6387"></a>
+<span class="sourceLineNo">6388</span>      }<a name="line.6388"></a>
+<span class="sourceLineNo">6389</span>      assertEquals(2, count); // 000 001<a name="line.6389"></a>
+<span class="sourceLineNo">6390</span>    }<a name="line.6390"></a>
+<span class="sourceLineNo">6391</span><a name="line.6391"></a>
+<span class="sourceLineNo">6392</span>    scan = new Scan();<a name="line.6392"></a>
+<span class="sourceLineNo">6393</span>    scan.setSmall(small);<a name="line.6393"></a>
+<span class="sourceLineNo">6394</span>    scan.setReversed(true);<a name="line.6394"></a>
+<span class="sourceLineNo">6395</span>    scan.setStartRow(Bytes.toBytes("000"));<a name="line.6395"></a>
+<span class="sourceLineNo">6396</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6396"></a>
+<span class="sourceLineNo">6397</span>      int count = 0;<a name="line.6397"></a>
+<span class="sourceLineNo">6398</span>      byte[] lastRow = null;<a name="line.6398"></a>
+<span class="sourceLineNo">6399</span>      for (Result r : scanner) {<a name="line.6399"></a>
+<span class="sourceLineNo">6400</span>        assertTrue(!r.isEmpty());<a name="line.6400"></a>
+<span class="sourceLineNo">6401</span>        count++;<a name="line.6401"></a>
+<span class="sourceLineNo">6402</span>        byte[] thisRow = r.getRow();<a name="line.6402"></a>
+<span class="sourceLineNo">6403</span>        if (lastRow != null) {<a name="line.6403"></a>
+<span class="sourceLineNo">6404</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6404"></a>
+<span class="sourceLineNo">6405</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6405"></a>
+<span class="sourceLineNo">6406</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6406"></a>
+<span class="sourceLineNo">6407</span>        }<a name="line.6407"></a>
+<span class="sourceLineNo">6408</span>        lastRow = thisRow;<a name="line.6408"></a>
+<span class="sourceLineNo">6409</span>      }<a name="line.6409"></a>
+<span class="sourceLineNo">6410</span>      assertEquals(1, count); // 000<a name="line.6410"></a>
 <span class="sourceLineNo">6411</span>    }<a name="line.6411"></a>
-<span class="sourceLineNo">6412</span>  }<a name="line.6412"></a>
-<span class="sourceLineNo">6413</span><a name="line.6413"></a>
-<span class="sourceLineNo">6414</span>  @Test<a name="line.6414"></a>
-<span class="sourceLineNo">6415</span>  public void testCellSizeLimit() throws IOException {<a name="line.6415"></a>
-<span class="sourceLineNo">6416</span>    final TableName tableName = TableName.valueOf("testCellSizeLimit");<a name="line.6416"></a>
-<span class="sourceLineNo">6417</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.6417"></a>
-<span class="sourceLineNo">6418</span>    htd.setConfiguration(HRegion.HBASE_MAX_CELL_SIZE_KEY, Integer.toString(10 * 1024)); // 10K<a name="line.6418"></a>
-<span class="sourceLineNo">6419</span>    HColumnDescriptor fam = new HColumnDescriptor(FAMILY);<a name="line.6419"></a>
-<span class="sourceLineNo">6420</span>    htd.addFamily(fam);<a name="line.6420"></a>
-<span class="sourceLineNo">6421</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6421"></a>
-<span class="sourceLineNo">6422</span>      admin.createTable(htd);<a name="line.6422"></a>
-<span class="sourceLineNo">6423</span>    }<a name="line.6423"></a>
-<span class="sourceLineNo">6424</span>    // Will succeed<a name="line.6424"></a>
-<span class="sourceLineNo">6425</span>    try (Table t = TEST_UTIL.getConnection().getTable(tableName)) {<a name="line.6425"></a>
-<span class="sourceLineNo">6426</span>      t.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, Bytes.toBytes(0L)));<a name="line.6426"></a>
-<span class="sourceLineNo">6427</span>      t.increment(new Increment(ROW).addColumn(FAMILY, QUALIFIER, 1L));<a name="line.6427"></a>
-<span class="sourceLineNo">6428</span>    }<a name="line.6428"></a>
-<span class="sourceLineNo">6429</span>    // Will succeed<a name="line.6429"></a>
-<span class="sourceLineNo">6430</span>    try (Table t = TEST_UTIL.getConnection().getTable(tableName)) {<a name="line.6430"></a>
-<span class="sourceLineNo">6431</span>      t.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, new byte[9*1024]));<a name="line.6431"></a>
-<span class="sourceLineNo">6432</span>    }<a name="line.6432"></a>
-<span class="sourceLineNo">6433</span>    // Will fail<a name="line.6433"></a>
-<span class="sourceLineNo">6434</span>    try (Table t = TEST_UTIL.getConnection().getTable(tableName)) {<a name="line.6434"></a>
-<span class="sourceLineNo">6435</span>      try {<a name="line.6435"></a>
-<span class="sourceLineNo">6436</span>        t.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, new byte[10 * 1024]));<a name="line.6436"></a>
-<span class="sourceLineNo">6437</span>        fail("Oversize cell failed to trigger exception");<a name="line.6437"></a>
-<span class="sourceLineNo">6438</span>      } catch (IOException e) {<a name="line.6438"></a>
-<span class="sourceLineNo">6439</span>        // expected<a name="line.6439"></a>
-<span class="sourceLineNo">6440</span>      }<a name="line.6440"></a>
-<span class="sourceLineNo">6441</span>      try {<a name="line.6441"></a>
-<span class="sourceLineNo">6442</span>        t.append(new Append(ROW).addColumn(FAMILY, QUALIFIER, new byte[2 * 1024]));<a name="line.6442"></a>
-<span class="sourceLineNo">6443</span>        fail("Oversize cell failed to trigger exception");<a name="line.6443"></a>
-<span class="sourceLineNo">6444</span>      } catch (IOException e) {<a name="line.6444"></a>
-<span class="sourceLineNo">6445</span>        // expected<a name="line.6445"></a>
+<span class="sourceLineNo">6412</span><a name="line.6412"></a>
+<span class="sourceLineNo">6413</span>    scan = new Scan();<a name="line.6413"></a>
+<span class="sourceLineNo">6414</span>    scan.setSmall(small);<a name="line.6414"></a>
+<span class="sourceLineNo">6415</span>    scan.setReversed(true);<a name="line.6415"></a>
+<span class="sourceLineNo">6416</span>    scan.setStartRow(Bytes.toBytes("006"));<a name="line.6416"></a>
+<span class="sourceLineNo">6417</span>    scan.setStopRow(Bytes.toBytes("002"));<a name="line.6417"></a>
+<span class="sourceLineNo">6418</span>    try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6418"></a>
+<span class="sourceLineNo">6419</span>      int count = 0;<a name="line.6419"></a>
+<span class="sourceLineNo">6420</span>      byte[] lastRow = null;<a name="line.6420"></a>
+<span class="sourceLineNo">6421</span>      for (Result r : scanner) {<a name="line.6421"></a>
+<span class="sourceLineNo">6422</span>        assertTrue(!r.isEmpty());<a name="line.6422"></a>
+<span class="sourceLineNo">6423</span>        count++;<a name="line.6423"></a>
+<span class="sourceLineNo">6424</span>        byte[] thisRow = r.getRow();<a name="line.6424"></a>
+<span class="sourceLineNo">6425</span>        if (lastRow != null) {<a name="line.6425"></a>
+<span class="sourceLineNo">6426</span>          assertTrue("Error scan order, last row= " + Bytes.toString(lastRow)<a name="line.6426"></a>
+<span class="sourceLineNo">6427</span>                          + ",this row=" + Bytes.toString(thisRow),<a name="line.6427"></a>
+<span class="sourceLineNo">6428</span>                  Bytes.compareTo(thisRow, lastRow) &lt; 0);<a name="line.6428"></a>
+<span class="sourceLineNo">6429</span>        }<a name="line.6429"></a>
+<span class="sourceLineNo">6430</span>        lastRow = thisRow;<a name="line.6430"></a>
+<span class="sourceLineNo">6431</span>      }<a name="line.6431"></a>
+<span class="sourceLineNo">6432</span>      assertEquals(4, count); // 003 004 005 006<a name="line.6432"></a>
+<span class="sourceLineNo">6433</span>    }<a name="line.6433"></a>
+<span class="sourceLineNo">6434</span>  }<a name="line.6434"></a>
+<span class="sourceLineNo">6435</span><a name="line.6435"></a>
+<span class="sourceLineNo">6436</span>  @Test<a name="line.6436"></a>
+<span class="sourceLineNo">6437</span>  public void testFilterAllRecords() throws IOException {<a name="line.6437"></a>
+<span class="sourceLineNo">6438</span>    Scan scan = new Scan();<a name="line.6438"></a>
+<span class="sourceLineNo">6439</span>    scan.setBatch(1);<a name="line.6439"></a>
+<span class="sourceLineNo">6440</span>    scan.setCaching(1);<a name="line.6440"></a>
+<span class="sourceLineNo">6441</span>    // Filter out any records<a name="line.6441"></a>
+<span class="sourceLineNo">6442</span>    scan.setFilter(new FilterList(new FirstKeyOnlyFilter(), new InclusiveStopFilter(new byte[0])));<a name="line.6442"></a>
+<span class="sourceLineNo">6443</span>    try (Table table = TEST_UTIL.getConnection().getTable(TableName.META_TABLE_NAME)) {<a name="line.6443"></a>
+<span class="sourceLineNo">6444</span>      try (ResultScanner s = table.getScanner(scan)) {<a name="line.6444"></a>
+<span class="sourceLineNo">6445</span>        assertNull(s.next());<a name="line.6445"></a>
 <span class="sourceLineNo">6446</span>      }<a name="line.6446"></a>
 <span class="sourceLineNo">6447</span>    }<a name="line.6447"></a>
 <span class="sourceLineNo">6448</span>  }<a name="line.6448"></a>
 <span class="sourceLineNo">6449</span><a name="line.6449"></a>
 <span class="sourceLineNo">6450</span>  @Test<a name="line.6450"></a>
-<span class="sourceLineNo">6451</span>  public void testDeleteSpecifiedVersionOfSpecifiedColumn() throws Exception {<a name="line.6451"></a>
-<span class="sourceLineNo">6452</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6452"></a>
-<span class="sourceLineNo">6453</span>      final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6453"></a>
-<span class="sourceLineNo">6454</span><a name="line.6454"></a>
-<span class="sourceLineNo">6455</span>      byte[][] VALUES = makeN(VALUE, 5);<a name="line.6455"></a>
-<span class="sourceLineNo">6456</span>      long[] ts = {1000, 2000, 3000, 4000, 5000};<a name="line.6456"></a>
-<span class="sourceLineNo">6457</span><a name="line.6457"></a>
-<span class="sourceLineNo">6458</span>      try (Table ht = TEST_UTIL.createTable(tableName, FAMILY, 5)) {<a name="line.6458"></a>
-<span class="sourceLineNo">6459</span><a name="line.6459"></a>
-<span class="sourceLineNo">6460</span>        Put put = new Put(ROW);<a name="line.6460"></a>
-<span class="sourceLineNo">6461</span>        // Put version 1000,2000,3000,4000 of column FAMILY:QUALIFIER<a name="line.6461"></a>
-<span class="sourceLineNo">6462</span>        for (int t = 0; t &lt; 4; t++) {<a name="line.6462"></a>
-<span class="sourceLineNo">6463</span>          put.addColumn(FAMILY, QUALIFIER, ts[t], VALUES[t]);<a name="line.6463"></a>
-<span class="sourceLineNo">6464</span>        }<a name="line.6464"></a>
-<span class="sourceLineNo">6465</span>        ht.put(put);<a name="line.6465"></a>
-<span class="sourceLineNo">6466</span><a name="line.6466"></a>
-<span class="sourceLineNo">6467</span>        Delete delete = new Delete(ROW);<a name="line.6467"></a>
-<span class="sourceLineNo">6468</span>        // Delete version 3000 of column FAMILY:QUALIFIER<a name="line.6468"></a>
-<span class="sourceLineNo">6469</span>        delete.addColumn(FAMILY, QUALIFIER, ts[2]);<a name="line.6469"></a>
-<span class="sourceLineNo">6470</span>        ht.delete(delete);<a name="line.6470"></a>
-<span class="sourceLineNo">6471</span><a name="line.6471"></a>
-<span class="sourceLineNo">6472</span>        Get get = new Get(ROW);<a name="line.6472"></a>
-<span class="sourceLineNo">6473</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6473"></a>
-<span class="sourceLineNo">6474</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6474"></a>
-<span class="sourceLineNo">6475</span>        Result result = ht.get(get);<a name="line.6475"></a>
-<span class="sourceLineNo">6476</span>        // verify version 1000,2000,4000 remains for column FAMILY:QUALIFIER<a name="line.6476"></a>
-<span class="sourceLineNo">6477</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[1], ts[3]}, new byte[][]{<a name="line.6477"></a>
-<span class="sourceLineNo">6478</span>                VALUES[0], VALUES[1], VALUES[3]}, 0, 2);<a name="line.6478"></a>
-<span class="sourceLineNo">6479</span><a name="line.6479"></a>
-<span class="sourceLineNo">6480</span>        delete = new Delete(ROW);<a name="line.6480"></a>
-<span class="sourceLineNo">6481</span>        // Delete a version 5000 of column FAMILY:QUALIFIER which didn't exist<a name="line.6481"></a>
-<span class="sourceLineNo">6482</span>        delete.addColumn(FAMILY, QUALIFIER, ts[4]);<a name="line.6482"></a>
-<span class="sourceLineNo">6483</span>        ht.delete(delete);<a name="line.6483"></a>
-<span class="sourceLineNo">6484</span><a name="line.6484"></a>
-<span class="sourceLineNo">6485</span>        get = new Get(ROW);<a name="line.6485"></a>
-<span class="sourceLineNo">6486</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6486"></a>
-<span class="sourceLineNo">6487</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6487"></a>
-<span class="sourceLineNo">6488</span>        result = ht.get(get);<a name="line.6488"></a>
-<span class="sourceLineNo">6489</span>        // verify version 1000,2000,4000 remains for column FAMILY:QUALIFIER<a name="line.6489"></a>
-<span class="sourceLineNo">6490</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[1], ts[3]}, new byte[][]{<a name="line.6490"></a>
-<span class="sourceLineNo">6491</span>                VALUES[0], VALUES[1], VALUES[3]}, 0, 2);<a name="line.6491"></a>
-<span class="sourceLineNo">6492</span>      }<a name="line.6492"></a>
-<span class="sourceLineNo">6493</span>    }<a name="line.6493"></a>
-<span class="sourceLineNo">6494</span>  }<a name="line.6494"></a>
+<span class="sourceLineNo">6451</span>  public void testCellSizeLimit() throws IOException {<a name="line.6451"></a>
+<span class="sourceLineNo">6452</span>    final TableName tableName = TableName.valueOf("testCellSizeLimit");<a name="line.6452"></a>
+<span class="sourceLineNo">6453</span>    HTableDescriptor htd = new HTableDescriptor(tableName);<a name="line.6453"></a>
+<span class="sourceLineNo">6454</span>    htd.setConfiguration(HRegion.HBASE_MAX_CELL_SIZE_KEY, Integer.toString(10 * 1024)); // 10K<a name="line.6454"></a>
+<span class="sourceLineNo">6455</span>    HColumnDescriptor fam = new HColumnDescriptor(FAMILY);<a name="line.6455"></a>
+<span class="sourceLineNo">6456</span>    htd.addFamily(fam);<a name="line.6456"></a>
+<span class="sourceLineNo">6457</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6457"></a>
+<span class="sourceLineNo">6458</span>      admin.createTable(htd);<a name="line.6458"></a>
+<span class="sourceLineNo">6459</span>    }<a name="line.6459"></a>
+<span class="sourceLineNo">6460</span>    // Will succeed<a name="line.6460"></a>
+<span class="sourceLineNo">6461</span>    try (Table t = TEST_UTIL.getConnection().getTable(tableName)) {<a name="line.6461"></a>
+<span class="sourceLineNo">6462</span>      t.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, Bytes.toBytes(0L)));<a name="line.6462"></a>
+<span class="sourceLineNo">6463</span>      t.increment(new Increment(ROW).addColumn(FAMILY, QUALIFIER, 1L));<a name="line.6463"></a>
+<span class="sourceLineNo">6464</span>    }<a name="line.6464"></a>
+<span class="sourceLineNo">6465</span>    // Will succeed<a name="line.6465"></a>
+<span class="sourceLineNo">6466</span>    try (Table t = TEST_UTIL.getConnection().getTable(tableName)) {<a name="line.6466"></a>
+<span class="sourceLineNo">6467</span>      t.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, new byte[9*1024]));<a name="line.6467"></a>
+<span class="sourceLineNo">6468</span>    }<a name="line.6468"></a>
+<span class="sourceLineNo">6469</span>    // Will fail<a name="line.6469"></a>
+<span class="sourceLineNo">6470</span>    try (Table t = TEST_UTIL.getConnection().getTable(tableName)) {<a name="line.6470"></a>
+<span class="sourceLineNo">6471</span>      try {<a name="line.6471"></a>
+<span class="sourceLineNo">6472</span>        t.put(new Put(ROW).addColumn(FAMILY, QUALIFIER, new byte[10 * 1024]));<a name="line.6472"></a>
+<span class="sourceLineNo">6473</span>        fail("Oversize cell failed to trigger exception");<a name="line.6473"></a>
+<span class="sourceLineNo">6474</span>      } catch (IOException e) {<a name="line.6474"></a>
+<span class="sourceLineNo">6475</span>        // expected<a name="line.6475"></a>
+<span class="sourceLineNo">6476</span>      }<a name="line.6476"></a>
+<span class="sourceLineNo">6477</span>      try {<a name="line.6477"></a>
+<span class="sourceLineNo">6478</span>        t.append(new Append(ROW).addColumn(FAMILY, QUALIFIER, new byte[2 * 1024]));<a name="line.6478"></a>
+<span class="sourceLineNo">6479</span>        fail("Oversize cell failed to trigger exception");<a name="line.6479"></a>
+<span class="sourceLineNo">6480</span>      } catch (IOException e) {<a name="line.6480"></a>
+<span class="sourceLineNo">6481</span>        // expected<a name="line.6481"></a>
+<span class="sourceLineNo">6482</span>      }<a name="line.6482"></a>
+<span class="sourceLineNo">6483</span>    }<a name="line.6483"></a>
+<span class="sourceLineNo">6484</span>  }<a name="line.6484"></a>
+<span class="sourceLineNo">6485</span><a name="line.6485"></a>
+<span class="sourceLineNo">6486</span>  @Test<a name="line.6486"></a>
+<span class="sourceLineNo">6487</span>  public void testDeleteSpecifiedVersionOfSpecifiedColumn() throws Exception {<a name="line.6487"></a>
+<span class="sourceLineNo">6488</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6488"></a>
+<span class="sourceLineNo">6489</span>      final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6489"></a>
+<span class="sourceLineNo">6490</span><a name="line.6490"></a>
+<span class="sourceLineNo">6491</span>      byte[][] VALUES = makeN(VALUE, 5);<a name="line.6491"></a>
+<span class="sourceLineNo">6492</span>      long[] ts = {1000, 2000, 3000, 4000, 5000};<a name="line.6492"></a>
+<span class="sourceLineNo">6493</span><a name="line.6493"></a>
+<span class="sourceLineNo">6494</span>      try (Table ht = TEST_UTIL.createTable(tableName, FAMILY, 5)) {<a name="line.6494"></a>
 <span class="sourceLineNo">6495</span><a name="line.6495"></a>
-<span class="sourceLineNo">6496</span>  @Test<a name="line.6496"></a>
-<span class="sourceLineNo">6497</span>  public void testDeleteLatestVersionOfSpecifiedColumn() throws Exception {<a name="line.6497"></a>
-<span class="sourceLineNo">6498</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6498"></a>
-<span class="sourceLineNo">6499</span>      final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6499"></a>
-<span class="sourceLineNo">6500</span><a name="line.6500"></a>
-<span class="sourceLineNo">6501</span>      byte[][] VALUES = makeN(VALUE, 5);<a name="line.6501"></a>
-<span class="sourceLineNo">6502</span>      long[] ts = {1000, 2000, 3000, 4000, 5000};<a name="line.6502"></a>
-<span class="sourceLineNo">6503</span><a name="line.6503"></a>
-<span class="sourceLineNo">6504</span>      try (Table ht = TEST_UTIL.createTable(tableName, FAMILY, 5)) {<a name="line.6504"></a>
-<span class="sourceLineNo">6505</span><a name="line.6505"></a>
-<span class="sourceLineNo">6506</span>        Put put = new Put(ROW);<a name="line.6506"></a>
-<span class="sourceLineNo">6507</span>        // Put version 1000,2000,3000,4000 of column FAMILY:QUALIFIER<a name="line.6507"></a>
-<span class="sourceLineNo">6508</span>        for (int t = 0; t &lt; 4; t++) {<a name="line.6508"></a>
-<span class="sourceLineNo">6509</span>          put.addColumn(FAMILY, QUALIFIER, ts[t], VALUES[t]);<a name="line.6509"></a>
-<span class="sourceLineNo">6510</span>        }<a name="line.6510"></a>
-<span class="sourceLineNo">6511</span>        ht.put(put);<a name="line.6511"></a>
-<span class="sourceLineNo">6512</span><a name="line.6512"></a>
-<span class="sourceLineNo">6513</span>        Delete delete = new Delete(ROW);<a name="line.6513"></a>
-<span class="sourceLineNo">6514</span>        // Delete latest version of column FAMILY:QUALIFIER<a name="line.6514"></a>
-<span class="sourceLineNo">6515</span>        delete.addColumn(FAMILY, QUALIFIER);<a name="line.6515"></a>
-<span class="sourceLineNo">6516</span>        ht.delete(delete);<a name="line.6516"></a>
-<span class="sourceLineNo">6517</span><a name="line.6517"></a>
-<span class="sourceLineNo">6518</span>        Get get = new Get(ROW);<a name="line.6518"></a>
-<span class="sourceLineNo">6519</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6519"></a>
-<span class="sourceLineNo">6520</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6520"></a>
-<span class="sourceLineNo">6521</span>        Result result = ht.get(get);<a name="line.6521"></a>
-<span class="sourceLineNo">6522</span>        // verify version 1000,2000,3000 remains for column FAMILY:QUALIFIER<a name="line.6522"></a>
-<span class="sourceLineNo">6523</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[1], ts[2]}, new byte[][]{<a name="line.6523"></a>
-<span class="sourceLineNo">6524</span>                VALUES[0], VALUES[1], VALUES[2]}, 0, 2);<a name="line.6524"></a>
-<span class="sourceLineNo">6525</span><a name="line.6525"></a>
-<span class="sourceLineNo">6526</span>        delete = new Delete(ROW);<a name="line.6526"></a>
-<span class="sourceLineNo">6527</span>        // Delete two latest version of column FAMILY:QUALIFIER<a name="line.6527"></a>
-<span class="sourceLineNo">6528</span>        delete.addColumn(FAMILY, QUALIFIER);<a name="line.6528"></a>
-<span class="sourceLineNo">6529</span>        delete.addColumn(FAMILY, QUALIFIER);<a name="line.6529"></a>
-<span class="sourceLineNo">6530</span>        ht.delete(delete);<a name="line.6530"></a>
+<span class="sourceLineNo">6496</span>        Put put = new Put(ROW);<a name="line.6496"></a>
+<span class="sourceLineNo">6497</span>        // Put version 1000,2000,3000,4000 of column FAMILY:QUALIFIER<a name="line.6497"></a>
+<span class="sourceLineNo">6498</span>        for (int t = 0; t &lt; 4; t++) {<a name="line.6498"></a>
+<span class="sourceLineNo">6499</span>          put.addColumn(FAMILY, QUALIFIER, ts[t], VALUES[t]);<a name="line.6499"></a>
+<span class="sourceLineNo">6500</span>        }<a name="line.6500"></a>
+<span class="sourceLineNo">6501</span>        ht.put(put);<a name="line.6501"></a>
+<span class="sourceLineNo">6502</span><a name="line.6502"></a>
+<span class="sourceLineNo">6503</span>        Delete delete = new Delete(ROW);<a name="line.6503"></a>
+<span class="sourceLineNo">6504</span>        // Delete version 3000 of column FAMILY:QUALIFIER<a name="line.6504"></a>
+<span class="sourceLineNo">6505</span>        delete.addColumn(FAMILY, QUALIFIER, ts[2]);<a name="line.6505"></a>
+<span class="sourceLineNo">6506</span>        ht.delete(delete);<a name="line.6506"></a>
+<span class="sourceLineNo">6507</span><a name="line.6507"></a>
+<span class="sourceLineNo">6508</span>        Get get = new Get(ROW);<a name="line.6508"></a>
+<span class="sourceLineNo">6509</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6509"></a>
+<span class="sourceLineNo">6510</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6510"></a>
+<span class="sourceLineNo">6511</span>        Result result = ht.get(get);<a name="line.6511"></a>
+<span class="sourceLineNo">6512</span>        // verify version 1000,2000,4000 remains for column FAMILY:QUALIFIER<a name="line.6512"></a>
+<span class="sourceLineNo">6513</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[1], ts[3]}, new byte[][]{<a name="line.6513"></a>
+<span class="sourceLineNo">6514</span>                VALUES[0], VALUES[1], VALUES[3]}, 0, 2);<a name="line.6514"></a>
+<span class="sourceLineNo">6515</span><a name="line.6515"></a>
+<span class="sourceLineNo">6516</span>        delete = new Delete(ROW);<a name="line.6516"></a>
+<span class="sourceLineNo">6517</span>        // Delete a version 5000 of column FAMILY:QUALIFIER which didn't exist<a name="line.6517"></a>
+<span class="sourceLineNo">6518</span>        delete.addColumn(FAMILY, QUALIFIER, ts[4]);<a name="line.6518"></a>
+<span class="sourceLineNo">6519</span>        ht.delete(delete);<a name="line.6519"></a>
+<span class="sourceLineNo">6520</span><a name="line.6520"></a>
+<span class="sourceLineNo">6521</span>        get = new Get(ROW);<a name="line.6521"></a>
+<span class="sourceLineNo">6522</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6522"></a>
+<span class="sourceLineNo">6523</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6523"></a>
+<span class="sourceLineNo">6524</span>        result = ht.get(get);<a name="line.6524"></a>
+<span class="sourceLineNo">6525</span>        // verify version 1000,2000,4000 remains for column FAMILY:QUALIFIER<a name="line.6525"></a>
+<span class="sourceLineNo">6526</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[1], ts[3]}, new byte[][]{<a name="line.6526"></a>
+<span class="sourceLineNo">6527</span>                VALUES[0], VALUES[1], VALUES[3]}, 0, 2);<a name="line.6527"></a>
+<span class="sourceLineNo">6528</span>      }<a name="line.6528"></a>
+<span class="sourceLineNo">6529</span>    }<a name="line.6529"></a>
+<span class="sourceLineNo">6530</span>  }<a name="line.6530"></a>
 <span class="sourceLineNo">6531</span><a name="line.6531"></a>
-<span class="sourceLineNo">6532</span>        get = new Get(ROW);<a name="line.6532"></a>
-<span class="sourceLineNo">6533</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6533"></a>
-<span class="sourceLineNo">6534</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6534"></a>
-<span class="sourceLineNo">6535</span>        result = ht.get(get);<a name="line.6535"></a>
-<span class="sourceLineNo">6536</span>        // verify version 1000 remains for column FAMILY:QUALIFIER<a name="line.6536"></a>
-<span class="sourceLineNo">6537</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0]}, new byte[][]{VALUES[0]},<a name="line.6537"></a>
-<span class="sourceLineNo">6538</span>                0, 0);<a name="line.6538"></a>
+<span class="sourceLineNo">6532</span>  @Test<a name="line.6532"></a>
+<span class="sourceLineNo">6533</span>  public void testDeleteLatestVersionOfSpecifiedColumn() throws Exception {<a name="line.6533"></a>
+<span class="sourceLineNo">6534</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6534"></a>
+<span class="sourceLineNo">6535</span>      final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6535"></a>
+<span class="sourceLineNo">6536</span><a name="line.6536"></a>
+<span class="sourceLineNo">6537</span>      byte[][] VALUES = makeN(VALUE, 5);<a name="line.6537"></a>
+<span class="sourceLineNo">6538</span>      long[] ts = {1000, 2000, 3000, 4000, 5000};<a name="line.6538"></a>
 <span class="sourceLineNo">6539</span><a name="line.6539"></a>
-<span class="sourceLineNo">6540</span>        put = new Put(ROW);<a name="line.6540"></a>
-<span class="sourceLineNo">6541</span>        // Put a version 5000 of column FAMILY:QUALIFIER<a name="line.6541"></a>
-<span class="sourceLineNo">6542</span>        put.addColumn(FAMILY, QUALIFIER, ts[4], VALUES[4]);<a name="line.6542"></a>
-<span class="sourceLineNo">6543</span>        ht.put(put);<a name="line.6543"></a>
-<span class="sourceLineNo">6544</span><a name="line.6544"></a>
-<span class="sourceLineNo">6545</span>        get = new Get(ROW);<a name="line.6545"></a>
-<span class="sourceLineNo">6546</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6546"></a>
-<span class="sourceLineNo">6547</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6547"></a>
-<span class="sourceLineNo">6548</span>        result = ht.get(get);<a name="line.6548"></a>
-<span class="sourceLineNo">6549</span>        // verify version 1000,5000 remains for column FAMILY:QUALIFIER<a name="line.6549"></a>
-<span class="sourceLineNo">6550</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[4]}, new byte[][]{<a name="line.6550"></a>
-<span class="sourceLineNo">6551</span>                VALUES[0], VALUES[4]}, 0, 1);<a name="line.6551"></a>
-<span class="sourceLineNo">6552</span>      }<a name="line.6552"></a>
-<span class="sourceLineNo">6553</span>    }<a name="line.6553"></a>
-<span class="sourceLineNo">6554</span>  }<a name="line.6554"></a>
-<span class="sourceLineNo">6555</span><a name="line.6555"></a>
-<span class="sourceLineNo">6556</span>  /**<a name="line.6556"></a>
-<span class="sourceLineNo">6557</span>   * Test for HBASE-17125<a name="line.6557"></a>
-<span class="sourceLineNo">6558</span>   */<a name="line.6558"></a>
-<span class="sourceLineNo">6559</span>  @Test<a name="line.6559"></a>
-<span class="sourceLineNo">6560</span>  public void testReadWithFilter() throws Exception {<a name="line.6560"></a>
-<span class="sourceLineNo">6561</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6561"></a>
-<span class="sourceLineNo">6562</span>      final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6562"></a>
-<span class="sourceLineNo">6563</span>      try (Table table = TEST_UTIL.createTable(tableName, FAMILY, 3)) {<a name="line.6563"></a>
-<span class="sourceLineNo">6564</span><a name="line.6564"></a>
-<span class="sourceLineNo">6565</span>        byte[] VALUEA = Bytes.toBytes("value-a");<a name="line.6565"></a>
-<span class="sourceLineNo">6566</span>        byte[] VALUEB = Bytes.toBytes("value-b");<a name="line.6566"></a>
-<span class="sourceLineNo">6567</span>        long[] ts = {1000, 2000, 3000, 4000};<a name="line.6567"></a>
-<span class="sourceLineNo">6568</span><a name="line.6568"></a>
-<span class="sourceLineNo">6569</span>        Put put = new Put(ROW);<a name="line.6569"></a>
-<span class="sourceLineNo">6570</span>        // Put version 1000,2000,3000,4000 of column FAMILY:QUALIFIER<a name="line.6570"></a>
-<span class="sourceLineNo">6571</span>        for (int t = 0; t &lt;= 3; t++) {<a name="line.6571"></a>
-<span class="sourceLineNo">6572</span>          if (t &lt;= 1) {<a name="line.6572"></a>
-<span class="sourceLineNo">6573</span>            put.addColumn(FAMILY, QUALIFIER, ts[t], VALUEA);<a name="line.6573"></a>
-<span class="sourceLineNo">6574</span>          } else {<a name="line.6574"></a>
-<span class="sourceLineNo">6575</span>            put.addColumn(FAMILY, QUALIFIER, ts[t], VALUEB);<a name="line.6575"></a>
-<span class="sourceLineNo">6576</span>          }<a name="line.6576"></a>
-<span class="sourceLineNo">6577</span>        }<a name="line.6577"></a>
-<span class="sourceLineNo">6578</span>        table.put(put);<a name="line.6578"></a>
-<span class="sourceLineNo">6579</span><a name="line.6579"></a>
-<span class="sourceLineNo">6580</span>        Scan scan =<a name="line.6580"></a>
-<span class="sourceLineNo">6581</span>                new Scan().setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6581"></a>
-<span class="sourceLineNo">6582</span>                        new SubstringComparator("value-a")))<a name="line.6582"></a>
-<span class="sourceLineNo">6583</span>                        .setMaxVersions(3);<a name="line.6583"></a>
-<span class="sourceLineNo">6584</span>        ResultScanner scanner = table.getScanner(scan);<a name="line.6584"></a>
-<span class="sourceLineNo">6585</span>        Result result = scanner.next();<a name="line.6585"></a>
-<span class="sourceLineNo">6586</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6586"></a>
-<span class="sourceLineNo">6587</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6587"></a>
-<span class="sourceLineNo">6588</span>                0);<a name="line.6588"></a>
-<span class="sourceLineNo">6589</span><a name="line.6589"></a>
-<span class="sourceLineNo">6590</span>        Get get =<a name="line.6590"></a>
-<span class="sourceLineNo">6591</span>                new Get(ROW)<a name="line.6591"></a>
-<span class="sourceLineNo">6592</span>                        .setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6592"></a>
-<span class="sourceLineNo">6593</span>                                new SubstringComparator("value-a")))<a name="line.6593"></a>
-<span class="sourceLineNo">6594</span>                        .readVersions(3);<a name="line.6594"></a>
-<span class="sourceLineNo">6595</span>        result = table.get(get);<a name="line.6595"></a>
-<span class="sourceLineNo">6596</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6596"></a>
-<span class="sourceLineNo">6597</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6597"></a>
-<span class="sourceLineNo">6598</span>                0);<a name="line.6598"></a>
-<span class="sourceLineNo">6599</span><a name="line.6599"></a>
-<span class="sourceLineNo">6600</span>        // Test with max versions 1, it should still read ts[1]<a name="line.6600"></a>
-<span class="sourceLineNo">6601</span>        scan =<a name="line.6601"></a>
-<span class="sourceLineNo">6602</span>                new Scan().setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6602"></a>
-<span class="sourceLineNo">6603</span>                        new SubstringComparator("value-a")))<a name="line.6603"></a>
-<span class="sourceLineNo">6604</span>                        .setMaxVersions(1);<a name="line.6604"></a>
-<span class="sourceLineNo">6605</span>        scanner = table.getScanner(scan);<a name="line.6605"></a>
-<span class="sourceLineNo">6606</span>        result = scanner.next();<a name="line.6606"></a>
-<span class="sourceLineNo">6607</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6607"></a>
-<span class="sourceLineNo">6608</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6608"></a>
-<span class="sourceLineNo">6609</span>                0);<a name="line.6609"></a>
-<span class="sourceLineNo">6610</span><a name="line.6610"></a>
-<span class="sourceLineNo">6611</span>        // Test with max versions 1, it should still read ts[1]<a name="line.6611"></a>
-<span class="sourceLineNo">6612</span>        get =<a name="line.6612"></a>
-<span class="sourceLineNo">6613</span>                new Get(ROW)<a name="line.6613"></a>
-<span class="sourceLineNo">6614</span>                        .setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6614"></a>
-<span class="sourceLineNo">6615</span>                                new SubstringComparator("value-a")))<a name="line.6615"></a>
-<span class="sourceLineNo">6616</span>                        .readVersions(1);<a name="line.6616"></a>
-<span class="sourceLineNo">6617</span>        result = table.get(get);<a name="line.6617"></a>
-<span class="sourceLineNo">6618</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6618"></a>
-<span class="sourceLineNo">6619</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6619"></a>
-<span class="sourceLineNo">6620</span>                0);<a name="line.6620"></a>
-<span class="sourceLineNo">6621</span><a name="line.6621"></a>
-<span class="sourceLineNo">6622</span>        // Test with max versions 5, it should still read ts[1]<a name="line.6622"></a>
-<span class="sourceLineNo">6623</span>        scan =<a name="line.6623"></a>
-<span class="sourceLineNo">6624</span>                new Scan().setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6624"></a>
-<span class="sourceLineNo">6625</span>                        new SubstringComparator("value-a")))<a name="line.6625"></a>
-<span class="sourceLineNo">6626</span>                        .setMaxVersions(5);<a name="line.6626"></a>
-<span class="sourceLineNo">6627</span>        scanner = table.getScanner(scan);<a name="line.6627"></a>
-<span class="sourceLineNo">6628</span>        result = scanner.next();<a name="line.6628"></a>
-<span class="sourceLineNo">6629</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6629"></a>
-<span class="sourceLineNo">6630</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6630"></a>
-<span class="sourceLineNo">6631</span>                0);<a name="line.6631"></a>
-<span class="sourceLineNo">6632</span><a name="line.6632"></a>
-<span class="sourceLineNo">6633</span>        // Test with max versions 5, it should still read ts[1]<a name="line.6633"></a>
-<span class="sourceLineNo">6634</span>        get =<a name="line.6634"></a>
-<span class="sourceLineNo">6635</span>                new Get(ROW)<a name="line.6635"></a>
-<span class="sourceLineNo">6636</span>                        .setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6636"></a>
-<span class="sourceLineNo">6637</span>                                new SubstringComparator("value-a")))<a name="line.6637"></a>
-<span class="sourceLineNo">6638</span>                        .readVersions(5);<a name="line.6638"></a>
-<span class="sourceLineNo">6639</span>        result = table.get(get);<a name="line.6639"></a>
-<span class="sourceLineNo">6640</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6640"></a>
-<span class="sourceLineNo">6641</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6641"></a>
-<span class="sourceLineNo">6642</span>                0);<a name="line.6642"></a>
-<span class="sourceLineNo">6643</span>      }<a name="line.6643"></a>
-<span class="sourceLineNo">6644</span>    }<a name="line.6644"></a>
-<span class="sourceLineNo">6645</span>  }<a name="line.6645"></a>
+<span class="sourceLineNo">6540</span>      try (Table ht = TEST_UTIL.createTable(tableName, FAMILY, 5)) {<a name="line.6540"></a>
+<span class="sourceLineNo">6541</span><a name="line.6541"></a>
+<span class="sourceLineNo">6542</span>        Put put = new Put(ROW);<a name="line.6542"></a>
+<span class="sourceLineNo">6543</span>        // Put version 1000,2000,3000,4000 of column FAMILY:QUALIFIER<a name="line.6543"></a>
+<span class="sourceLineNo">6544</span>        for (int t = 0; t &lt; 4; t++) {<a name="line.6544"></a>
+<span class="sourceLineNo">6545</span>          put.addColumn(FAMILY, QUALIFIER, ts[t], VALUES[t]);<a name="line.6545"></a>
+<span class="sourceLineNo">6546</span>        }<a name="line.6546"></a>
+<span class="sourceLineNo">6547</span>        ht.put(put);<a name="line.6547"></a>
+<span class="sourceLineNo">6548</span><a name="line.6548"></a>
+<span class="sourceLineNo">6549</span>        Delete delete = new Delete(ROW);<a name="line.6549"></a>
+<span class="sourceLineNo">6550</span>        // Delete latest version of column FAMILY:QUALIFIER<a name="line.6550"></a>
+<span class="sourceLineNo">6551</span>        delete.addColumn(FAMILY, QUALIFIER);<a name="line.6551"></a>
+<span class="sourceLineNo">6552</span>        ht.delete(delete);<a name="line.6552"></a>
+<span class="sourceLineNo">6553</span><a name="line.6553"></a>
+<span class="sourceLineNo">6554</span>        Get get = new Get(ROW);<a name="line.6554"></a>
+<span class="sourceLineNo">6555</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6555"></a>
+<span class="sourceLineNo">6556</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6556"></a>
+<span class="sourceLineNo">6557</span>        Result result = ht.get(get);<a name="line.6557"></a>
+<span class="sourceLineNo">6558</span>        // verify version 1000,2000,3000 remains for column FAMILY:QUALIFIER<a name="line.6558"></a>
+<span class="sourceLineNo">6559</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[1], ts[2]}, new byte[][]{<a name="line.6559"></a>
+<span class="sourceLineNo">6560</span>                VALUES[0], VALUES[1], VALUES[2]}, 0, 2);<a name="line.6560"></a>
+<span class="sourceLineNo">6561</span><a name="line.6561"></a>
+<span class="sourceLineNo">6562</span>        delete = new Delete(ROW);<a name="line.6562"></a>
+<span class="sourceLineNo">6563</span>        // Delete two latest version of column FAMILY:QUALIFIER<a name="line.6563"></a>
+<span class="sourceLineNo">6564</span>        delete.addColumn(FAMILY, QUALIFIER);<a name="line.6564"></a>
+<span class="sourceLineNo">6565</span>        delete.addColumn(FAMILY, QUALIFIER);<a name="line.6565"></a>
+<span class="sourceLineNo">6566</span>        ht.delete(delete);<a name="line.6566"></a>
+<span class="sourceLineNo">6567</span><a name="line.6567"></a>
+<span class="sourceLineNo">6568</span>        get = new Get(ROW);<a name="line.6568"></a>
+<span class="sourceLineNo">6569</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6569"></a>
+<span class="sourceLineNo">6570</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6570"></a>
+<span class="sourceLineNo">6571</span>        result = ht.get(get);<a name="line.6571"></a>
+<span class="sourceLineNo">6572</span>        // verify version 1000 remains for column FAMILY:QUALIFIER<a name="line.6572"></a>
+<span class="sourceLineNo">6573</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0]}, new byte[][]{VALUES[0]},<a name="line.6573"></a>
+<span class="sourceLineNo">6574</span>                0, 0);<a name="line.6574"></a>
+<span class="sourceLineNo">6575</span><a name="line.6575"></a>
+<span class="sourceLineNo">6576</span>        put = new Put(ROW);<a name="line.6576"></a>
+<span class="sourceLineNo">6577</span>        // Put a version 5000 of column FAMILY:QUALIFIER<a name="line.6577"></a>
+<span class="sourceLineNo">6578</span>        put.addColumn(FAMILY, QUALIFIER, ts[4], VALUES[4]);<a name="line.6578"></a>
+<span class="sourceLineNo">6579</span>        ht.put(put);<a name="line.6579"></a>
+<span class="sourceLineNo">6580</span><a name="line.6580"></a>
+<span class="sourceLineNo">6581</span>        get = new Get(ROW);<a name="line.6581"></a>
+<span class="sourceLineNo">6582</span>        get.addColumn(FAMILY, QUALIFIER);<a name="line.6582"></a>
+<span class="sourceLineNo">6583</span>        get.readVersions(Integer.MAX_VALUE);<a name="line.6583"></a>
+<span class="sourceLineNo">6584</span>        result = ht.get(get);<a name="line.6584"></a>
+<span class="sourceLineNo">6585</span>        // verify version 1000,5000 remains for column FAMILY:QUALIFIER<a name="line.6585"></a>
+<span class="sourceLineNo">6586</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[0], ts[4]}, new byte[][]{<a name="line.6586"></a>
+<span class="sourceLineNo">6587</span>                VALUES[0], VALUES[4]}, 0, 1);<a name="line.6587"></a>
+<span class="sourceLineNo">6588</span>      }<a name="line.6588"></a>
+<span class="sourceLineNo">6589</span>    }<a name="line.6589"></a>
+<span class="sourceLineNo">6590</span>  }<a name="line.6590"></a>
+<span class="sourceLineNo">6591</span><a name="line.6591"></a>
+<span class="sourceLineNo">6592</span>  /**<a name="line.6592"></a>
+<span class="sourceLineNo">6593</span>   * Test for HBASE-17125<a name="line.6593"></a>
+<span class="sourceLineNo">6594</span>   */<a name="line.6594"></a>
+<span class="sourceLineNo">6595</span>  @Test<a name="line.6595"></a>
+<span class="sourceLineNo">6596</span>  public void testReadWithFilter() throws Exception {<a name="line.6596"></a>
+<span class="sourceLineNo">6597</span>    try (Admin admin = TEST_UTIL.getAdmin()) {<a name="line.6597"></a>
+<span class="sourceLineNo">6598</span>      final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6598"></a>
+<span class="sourceLineNo">6599</span>      try (Table table = TEST_UTIL.createTable(tableName, FAMILY, 3)) {<a name="line.6599"></a>
+<span class="sourceLineNo">6600</span><a name="line.6600"></a>
+<span class="sourceLineNo">6601</span>        byte[] VALUEA = Bytes.toBytes("value-a");<a name="line.6601"></a>
+<span class="sourceLineNo">6602</span>        byte[] VALUEB = Bytes.toBytes("value-b");<a name="line.6602"></a>
+<span class="sourceLineNo">6603</span>        long[] ts = {1000, 2000, 3000, 4000};<a name="line.6603"></a>
+<span class="sourceLineNo">6604</span><a name="line.6604"></a>
+<span class="sourceLineNo">6605</span>        Put put = new Put(ROW);<a name="line.6605"></a>
+<span class="sourceLineNo">6606</span>        // Put version 1000,2000,3000,4000 of column FAMILY:QUALIFIER<a name="line.6606"></a>
+<span class="sourceLineNo">6607</span>        for (int t = 0; t &lt;= 3; t++) {<a name="line.6607"></a>
+<span class="sourceLineNo">6608</span>          if (t &lt;= 1) {<a name="line.6608"></a>
+<span class="sourceLineNo">6609</span>            put.addColumn(FAMILY, QUALIFIER, ts[t], VALUEA);<a name="line.6609"></a>
+<span class="sourceLineNo">6610</span>          } else {<a name="line.6610"></a>
+<span class="sourceLineNo">6611</span>            put.addColumn(FAMILY, QUALIFIER, ts[t], VALUEB);<a name="line.6611"></a>
+<span class="sourceLineNo">6612</span>          }<a name="line.6612"></a>
+<span class="sourceLineNo">6613</span>        }<a name="line.6613"></a>
+<span class="sourceLineNo">6614</span>        table.put(put);<a name="line.6614"></a>
+<span class="sourceLineNo">6615</span><a name="line.6615"></a>
+<span class="sourceLineNo">6616</span>        Scan scan =<a name="line.6616"></a>
+<span class="sourceLineNo">6617</span>                new Scan().setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6617"></a>
+<span class="sourceLineNo">6618</span>                        new SubstringComparator("value-a")))<a name="line.6618"></a>
+<span class="sourceLineNo">6619</span>                        .setMaxVersions(3);<a name="line.6619"></a>
+<span class="sourceLineNo">6620</span>        ResultScanner scanner = table.getScanner(scan);<a name="line.6620"></a>
+<span class="sourceLineNo">6621</span>        Result result = scanner.next();<a name="line.6621"></a>
+<span class="sourceLineNo">6622</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6622"></a>
+<span class="sourceLineNo">6623</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6623"></a>
+<span class="sourceLineNo">6624</span>                0);<a name="line.6624"></a>
+<span class="sourceLineNo">6625</span><a name="line.6625"></a>
+<span class="sourceLineNo">6626</span>        Get get =<a name="line.6626"></a>
+<span class="sourceLineNo">6627</span>                new Get(ROW)<a name="line.6627"></a>
+<span class="sourceLineNo">6628</span>                        .setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6628"></a>
+<span class="sourceLineNo">6629</span>                                new SubstringComparator("value-a")))<a name="line.6629"></a>
+<span class="sourceLineNo">6630</span>                        .readVersions(3);<a name="line.6630"></a>
+<span class="sourceLineNo">6631</span>        result = table.get(get);<a name="line.6631"></a>
+<span class="sourceLineNo">6632</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6632"></a>
+<span class="sourceLineNo">6633</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6633"></a>
+<span class="sourceLineNo">6634</span>                0);<a name="line.6634"></a>
+<span class="sourceLineNo">6635</span><a name="line.6635"></a>
+<span class="sourceLineNo">6636</span>        // Test with max versions 1, it should still read ts[1]<a name="line.6636"></a>
+<span class="sourceLineNo">6637</span>        scan =<a name="line.6637"></a>
+<span class="sourceLineNo">6638</span>                new Scan().setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6638"></a>
+<span class="sourceLineNo">6639</span>                        new SubstringComparator("value-a")))<a name="line.6639"></a>
+<span class="sourceLineNo">6640</span>                        .setMaxVersions(1);<a name="line.6640"></a>
+<span class="sourceLineNo">6641</span>        scanner = table.getScanner(scan);<a name="line.6641"></a>
+<span class="sourceLineNo">6642</span>        result = scanner.next();<a name="line.6642"></a>
+<span class="sourceLineNo">6643</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6643"></a>
+<span class="sourceLineNo">6644</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6644"></a>
+<span class="sourceLineNo">6645</span>                0);<a name="line.6645"></a>
 <span class="sourceLineNo">6646</span><a name="line.6646"></a>
-<span class="sourceLineNo">6647</span>  @Test<a name="line.6647"></a>
-<span class="sourceLineNo">6648</span>  public void testCellUtilTypeMethods() throws IOException {<a name="line.6648"></a>
-<span class="sourceLineNo">6649</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6649"></a>
-<span class="sourceLineNo">6650</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.6650"></a>
-<span class="sourceLineNo">6651</span><a name="line.6651"></a>
-<span class="sourceLineNo">6652</span>      final byte[] row = Bytes.toBytes("p");<a name="line.6652"></a>
-<span class="sourceLineNo">6653</span>      Put p = new Put(row);<a name="line.6653"></a>
-<span class="sourceLineNo">6654</span>      p.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6654"></a>
-<span class="sourceLineNo">6655</span>      table.put(p);<a name="line.6655"></a>
-<span class="sourceLineNo">6656</span><a name="line.6656"></a>
-<span class="sourceLineNo">6657</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.6657"></a>
-<span class="sourceLineNo">6658</span>        Result result = scanner.next();<a name="line.6658"></a>
-<span class="sourceLineNo">6659</span>        assertNotNull(result);<a name="line.6659"></a>
-<span class="sourceLineNo">6660</span>        CellScanner cs = result.cellScanner();<a name="line.6660"></a>
-<span class="sourceLineNo">6661</span>        assertTrue(cs.advance());<a name="line.6661"></a>
-<span class="sourceLineNo">6662</span>        Cell c = cs.current();<a name="line.6662"></a>
-<span class="sourceLineNo">6663</span>        assertTrue(CellUtil.isPut(c));<a name="line.6663"></a>
-<span class="sourceLineNo">6664</span>        assertFalse(CellUtil.isDelete(c));<a name="line.6664"></a>
-<span class="sourceLineNo">6665</span>        assertFalse(cs.advance());<a name="line.6665"></a>
-<span class="sourceLineNo">6666</span>        assertNull(scanner.next());<a name="line.6666"></a>
-<span class="sourceLineNo">6667</span>      }<a name="line.6667"></a>
+<span class="sourceLineNo">6647</span>        // Test with max versions 1, it should still read ts[1]<a name="line.6647"></a>
+<span class="sourceLineNo">6648</span>        get =<a name="line.6648"></a>
+<span class="sourceLineNo">6649</span>                new Get(ROW)<a name="line.6649"></a>
+<span class="sourceLineNo">6650</span>                        .setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6650"></a>
+<span class="sourceLineNo">6651</span>                                new SubstringComparator("value-a")))<a name="line.6651"></a>
+<span class="sourceLineNo">6652</span>                        .readVersions(1);<a name="line.6652"></a>
+<span class="sourceLineNo">6653</span>        result = table.get(get);<a name="line.6653"></a>
+<span class="sourceLineNo">6654</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6654"></a>
+<span class="sourceLineNo">6655</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6655"></a>
+<span class="sourceLineNo">6656</span>                0);<a name="line.6656"></a>
+<span class="sourceLineNo">6657</span><a name="line.6657"></a>
+<span class="sourceLineNo">6658</span>        // Test with max versions 5, it should still read ts[1]<a name="line.6658"></a>
+<span class="sourceLineNo">6659</span>        scan =<a name="line.6659"></a>
+<span class="sourceLineNo">6660</span>                new Scan().setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6660"></a>
+<span class="sourceLineNo">6661</span>                        new SubstringComparator("value-a")))<a name="line.6661"></a>
+<span class="sourceLineNo">6662</span>                        .setMaxVersions(5);<a name="line.6662"></a>
+<span class="sourceLineNo">6663</span>        scanner = table.getScanner(scan);<a name="line.6663"></a>
+<span class="sourceLineNo">6664</span>        result = scanner.next();<a name="line.6664"></a>
+<span class="sourceLineNo">6665</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6665"></a>
+<span class="sourceLineNo">6666</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6666"></a>
+<span class="sourceLineNo">6667</span>                0);<a name="line.6667"></a>
 <span class="sourceLineNo">6668</span><a name="line.6668"></a>
-<span class="sourceLineNo">6669</span>      Delete d = new Delete(row);<a name="line.6669"></a>
-<span class="sourceLineNo">6670</span>      d.addColumn(FAMILY, QUALIFIER);<a name="line.6670"></a>
-<span class="sourceLineNo">6671</span>      table.delete(d);<a name="line.6671"></a>
-<span class="sourceLineNo">6672</span><a name="line.6672"></a>
-<span class="sourceLineNo">6673</span>      Scan scan = new Scan();<a name="line.6673"></a>
-<span class="sourceLineNo">6674</span>      scan.setRaw(true);<a name="line.6674"></a>
-<span class="sourceLineNo">6675</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6675"></a>
-<span class="sourceLineNo">6676</span>        Result result = scanner.next();<a name="line.6676"></a>
-<span class="sourceLineNo">6677</span>        assertNotNull(result);<a name="line.6677"></a>
-<span class="sourceLineNo">6678</span>        CellScanner cs = result.cellScanner();<a name="line.6678"></a>
-<span class="sourceLineNo">6679</span>        assertTrue(cs.advance());<a name="line.6679"></a>
-<span class="sourceLineNo">6680</span><a name="line.6680"></a>
-<span class="sourceLineNo">6681</span>        // First cell should be the delete (masking the Put)<a name="line.6681"></a>
-<span class="sourceLineNo">6682</span>        Cell c = cs.current();<a name="line.6682"></a>
-<span class="sourceLineNo">6683</span>        assertTrue("Cell should be a Delete: " + c, CellUtil.isDelete(c));<a name="line.6683"></a>
-<span class="sourceLineNo">6684</span>        assertFalse("Cell should not be a Put: " + c, CellUtil.isPut(c));<a name="line.6684"></a>
-<span class="sourceLineNo">6685</span><a name="line.6685"></a>
-<span class="sourceLineNo">6686</span>        // Second cell should be the original Put<a name="line.6686"></a>
-<span class="sourceLineNo">6687</span>        assertTrue(cs.advance());<a name="line.6687"></a>
-<span class="sourceLineNo">6688</span>        c = cs.current();<a name="line.6688"></a>
-<span class="sourceLineNo">6689</span>        assertFalse("Cell should not be a Delete: " + c, CellUtil.isDelete(c));<a name="line.6689"></a>
-<span class="sourceLineNo">6690</span>        assertTrue("Cell should be a Put: " + c, CellUtil.isPut(c));<a name="line.6690"></a>
-<span class="sourceLineNo">6691</span><a name="line.6691"></a>
-<span class="sourceLineNo">6692</span>        // No more cells in this row<a name="line.6692"></a>
-<span class="sourceLineNo">6693</span>        assertFalse(cs.advance());<a name="line.6693"></a>
-<span class="sourceLineNo">6694</span><a name="line.6694"></a>
-<span class="sourceLineNo">6695</span>        // No more results in this scan<a name="line.6695"></a>
-<span class="sourceLineNo">6696</span>        assertNull(scanner.next());<a name="line.6696"></a>
-<span class="sourceLineNo">6697</span>      }<a name="line.6697"></a>
-<span class="sourceLineNo">6698</span>    }<a name="line.6698"></a>
-<span class="sourceLineNo">6699</span>  }<a name="line.6699"></a>
-<span class="sourceLineNo">6700</span><a name="line.6700"></a>
-<span class="sourceLineNo">6701</span>  @Test(expected = DoNotRetryIOException.class)<a name="line.6701"></a>
-<span class="sourceLineNo">6702</span>  public void testCreateTableWithZeroRegionReplicas() throws Exception {<a name="line.6702"></a>
-<span class="sourceLineNo">6703</span>    TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6703"></a>
-<span class="sourceLineNo">6704</span>    TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)<a name="line.6704"></a>
-<span class="sourceLineNo">6705</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(Bytes.toBytes("cf")))<a name="line.6705"></a>
-<span class="sourceLineNo">6706</span>        .setRegionReplication(0)<a name="line.6706"></a>
-<span class="sourceLineNo">6707</span>        .build();<a name="line.6707"></a>
+<span class="sourceLineNo">6669</span>        // Test with max versions 5, it should still read ts[1]<a name="line.6669"></a>
+<span class="sourceLineNo">6670</span>        get =<a name="line.6670"></a>
+<span class="sourceLineNo">6671</span>                new Get(ROW)<a name="line.6671"></a>
+<span class="sourceLineNo">6672</span>                        .setFilter(new ValueFilter(CompareOperator.EQUAL,<a name="line.6672"></a>
+<span class="sourceLineNo">6673</span>                                new SubstringComparator("value-a")))<a name="line.6673"></a>
+<span class="sourceLineNo">6674</span>                        .readVersions(5);<a name="line.6674"></a>
+<span class="sourceLineNo">6675</span>        result = table.get(get);<a name="line.6675"></a>
+<span class="sourceLineNo">6676</span>        // ts[0] has gone from user view. Only read ts[2] which value is less or equal to 3<a name="line.6676"></a>
+<span class="sourceLineNo">6677</span>        assertNResult(result, ROW, FAMILY, QUALIFIER, new long[]{ts[1]}, new byte[][]{VALUEA}, 0,<a name="line.6677"></a>
+<span class="sourceLineNo">6678</span>                0);<a name="line.6678"></a>
+<span class="sourceLineNo">6679</span>      }<a name="line.6679"></a>
+<span class="sourceLineNo">6680</span>    }<a name="line.6680"></a>
+<span class="sourceLineNo">6681</span>  }<a name="line.6681"></a>
+<span class="sourceLineNo">6682</span><a name="line.6682"></a>
+<span class="sourceLineNo">6683</span>  @Test<a name="line.6683"></a>
+<span class="sourceLineNo">6684</span>  public void testCellUtilTypeMethods() throws IOException {<a name="line.6684"></a>
+<span class="sourceLineNo">6685</span>    final TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6685"></a>
+<span class="sourceLineNo">6686</span>    try (Table table = TEST_UTIL.createTable(tableName, FAMILY)) {<a name="line.6686"></a>
+<span class="sourceLineNo">6687</span><a name="line.6687"></a>
+<span class="sourceLineNo">6688</span>      final byte[] row = Bytes.toBytes("p");<a name="line.6688"></a>
+<span class="sourceLineNo">6689</span>      Put p = new Put(row);<a name="line.6689"></a>
+<span class="sourceLineNo">6690</span>      p.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.6690"></a>
+<span class="sourceLineNo">6691</span>      table.put(p);<a name="line.6691"></a>
+<span class="sourceLineNo">6692</span><a name="line.6692"></a>
+<span class="sourceLineNo">6693</span>      try (ResultScanner scanner = table.getScanner(new Scan())) {<a name="line.6693"></a>
+<span class="sourceLineNo">6694</span>        Result result = scanner.next();<a name="line.6694"></a>
+<span class="sourceLineNo">6695</span>        assertNotNull(result);<a name="line.6695"></a>
+<span class="sourceLineNo">6696</span>        CellScanner cs = result.cellScanner();<a name="line.6696"></a>
+<span class="sourceLineNo">6697</span>        assertTrue(cs.advance());<a name="line.6697"></a>
+<span class="sourceLineNo">6698</span>        Cell c = cs.current();<a name="line.6698"></a>
+<span class="sourceLineNo">6699</span>        assertTrue(CellUtil.isPut(c));<a name="line.6699"></a>
+<span class="sourceLineNo">6700</span>        assertFalse(CellUtil.isDelete(c));<a name="line.6700"></a>
+<span class="sourceLineNo">6701</span>        assertFalse(cs.advance());<a name="line.6701"></a>
+<span class="sourceLineNo">6702</span>        assertNull(scanner.next());<a name="line.6702"></a>
+<span class="sourceLineNo">6703</span>      }<a name="line.6703"></a>
+<span class="sourceLineNo">6704</span><a name="line.6704"></a>
+<span class="sourceLineNo">6705</span>      Delete d = new Delete(row);<a name="line.6705"></a>
+<span class="sourceLineNo">6706</span>      d.addColumn(FAMILY, QUALIFIER);<a name="line.6706"></a>
+<span class="sourceLineNo">6707</span>      table.delete(d);<a name="line.6707"></a>
 <span class="sourceLineNo">6708</span><a name="line.6708"></a>
-<span class="sourceLineNo">6709</span>    TEST_UTIL.getAdmin().createTable(desc);<a name="line.6709"></a>
-<span class="sourceLineNo">6710</span>  }<a name="line.6710"></a>
-<span class="sourceLineNo">6711</span><a name="line.6711"></a>
-<span class="sourceLineNo">6712</span>  @Test(expected = DoNotRetryIOException.class)<a name="line.6712"></a>
-<span class="sourceLineNo">6713</span>  public void testModifyTableWithZeroRegionReplicas() throws Exception {<a name="line.6713"></a>
-<span class="sourceLineNo">6714</span>    TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6714"></a>
-<span class="sourceLineNo">6715</span>    TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)<a name="line.6715"></a>
-<span class="sourceLineNo">6716</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(Bytes.toBytes("cf")))<a name="line.6716"></a>
-<span class="sourceLineNo">6717</span>        .build();<a name="line.6717"></a>
-<span class="sourceLineNo">6718</span><a name="line.6718"></a>
-<span class="sourceLineNo">6719</span>    TEST_UTIL.getAdmin().createTable(desc);<a name="line.6719"></a>
-<span class="sourceLineNo">6720</span>    TableDescriptor newDesc = TableDescriptorBuilder.newBuilder(desc)<a name="line.6720"></a>
-<span class="sourceLineNo">6721</span>        .setRegionReplication(0)<a name="line.6721"></a>
-<span class="sourceLineNo">6722</span>        .build();<a name="line.6722"></a>
-<span class="sourceLineNo">6723</span><a name="line.6723"></a>
-<span class="sourceLineNo">6724</span>    TEST_UTIL.getAdmin().modifyTable(newDesc);<a name="line.6724"></a>
-<span class="sourceLineNo">6725</span>  }<a name="line.6725"></a>
-<span class="sourceLineNo">6726</span>}<a name="line.6726"></a>
+<span class="sourceLineNo">6709</span>      Scan scan = new Scan();<a name="line.6709"></a>
+<span class="sourceLineNo">6710</span>      scan.setRaw(true);<a name="line.6710"></a>
+<span class="sourceLineNo">6711</span>      try (ResultScanner scanner = table.getScanner(scan)) {<a name="line.6711"></a>
+<span class="sourceLineNo">6712</span>        Result result = scanner.next();<a name="line.6712"></a>
+<span class="sourceLineNo">6713</span>        assertNotNull(result);<a name="line.6713"></a>
+<span class="sourceLineNo">6714</span>        CellScanner cs = result.cellScanner();<a name="line.6714"></a>
+<span class="sourceLineNo">6715</span>        assertTrue(cs.advance());<a name="line.6715"></a>
+<span class="sourceLineNo">6716</span><a name="line.6716"></a>
+<span class="sourceLineNo">6717</span>        // First cell should be the delete (masking the Put)<a name="line.6717"></a>
+<span class="sourceLineNo">6718</span>        Cell c = cs.current();<a name="line.6718"></a>
+<span class="sourceLineNo">6719</span>        assertTrue("Cell should be a Delete: " + c, CellUtil.isDelete(c));<a name="line.6719"></a>
+<span class="sourceLineNo">6720</span>        assertFalse("Cell should not be a Put: " + c, CellUtil.isPut(c));<a name="line.6720"></a>
+<span class="sourceLineNo">6721</span><a name="line.6721"></a>
+<span class="sourceLineNo">6722</span>        // Second cell should be the original Put<a name="line.6722"></a>
+<span class="sourceLineNo">6723</span>        assertTrue(cs.advance());<a name="line.6723"></a>
+<span class="sourceLineNo">6724</span>        c = cs.current();<a name="line.6724"></a>
+<span class="sourceLineNo">6725</span>        assertFalse("Cell should not be a Delete: " + c, CellUtil.isDelete(c));<a name="line.6725"></a>
+<span class="sourceLineNo">6726</span>        assertTrue("Cell should be a Put: " + c, CellUtil.isPut(c));<a name="line.6726"></a>
+<span class="sourceLineNo">6727</span><a name="line.6727"></a>
+<span class="sourceLineNo">6728</span>        // No more cells in this row<a name="line.6728"></a>
+<span class="sourceLineNo">6729</span>        assertFalse(cs.advance());<a name="line.6729"></a>
+<span class="sourceLineNo">6730</span><a name="line.6730"></a>
+<span class="sourceLineNo">6731</span>        // No more results in this scan<a name="line.6731"></a>
+<span class="sourceLineNo">6732</span>        assertNull(scanner.next());<a name="line.6732"></a>
+<span class="sourceLineNo">6733</span>      }<a name="line.6733"></a>
+<span class="sourceLineNo">6734</span>    }<a name="line.6734"></a>
+<span class="sourceLineNo">6735</span>  }<a name="line.6735"></a>
+<span class="sourceLineNo">6736</span><a name="line.6736"></a>
+<span class="sourceLineNo">6737</span>  @Test(expected = DoNotRetryIOException.class)<a name="line.6737"></a>
+<span class="sourceLineNo">6738</span>  public void testCreateTableWithZeroRegionReplicas() throws Exception {<a name="line.6738"></a>
+<span class="sourceLineNo">6739</span>    TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6739"></a>
+<span class="sourceLineNo">6740</span>    TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)<a name="line.6740"></a>
+<span class="sourceLineNo">6741</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(Bytes.toBytes("cf")))<a name="line.6741"></a>
+<span class="sourceLineNo">6742</span>        .setRegionReplication(0)<a name="line.6742"></a>
+<span class="sourceLineNo">6743</span>        .build();<a name="line.6743"></a>
+<span class="sourceLineNo">6744</span><a name="line.6744"></a>
+<span class="sourceLineNo">6745</span>    TEST_UTIL.getAdmin().createTable(desc);<a name="line.6745"></a>
+<span class="sourceLineNo">6746</span>  }<a name="line.6746"></a>
+<span class="sourceLineNo">6747</span><a name="line.6747"></a>
+<span class="sourceLineNo">6748</span>  @Test(expected = DoNotRetryIOException.class)<a name="line.6748"></a>
+<span class="sourceLineNo">6749</span>  public void testModifyTableWithZeroRegionReplicas() throws Exception {<a name="line.6749"></a>
+<span class="sourceLineNo">6750</span>    TableName tableName = TableName.valueOf(name.getMethodName());<a name="line.6750"></a>
+<span class="sourceLineNo">6751</span>    TableDescriptor desc = TableDescriptorBuilder.newBuilder(tableName)<a name="line.6751"></a>
+<span class="sourceLineNo">6752</span>        .setColumnFamily(ColumnFamilyDescriptorBuilder.of(Bytes.toBytes("cf")))<a name="line.6752"></a>
+<span class="sourceLineNo">6753</span>        .build();<a name="line.6753"></a>
+<span class="sourceLineNo">6754</span><a name="line.6754"></a>
+<span class="sourceLineNo">6755</span>    TEST_UTIL.getAdmin().createTable(desc);<a name="line.6755"></a>
+<span class="sourceLineNo">6756</span>    TableDescriptor newDesc = TableDescriptorBuilder.newBuilder(desc)<a name="line.6756"></a>
+<span class="sourceLineNo">6757</span>        .setRegionReplication(0)<a name="line.6757"></a>
+<span class="sourceLineNo">6758</span>        .build();<a name="line.6758"></a>
+<span class="sourceLineNo">6759</span><a name="line.6759"></a>
+<span class="sourceLineNo">6760</span>    TEST_UTIL.getAdmin().modifyTable(newDesc);<a name="line.6760"></a>
+<span class="sourceLineNo">6761</span>  }<a name="line.6761"></a>
+<span class="sourceLineNo">6762</span>}<a name="line.6762"></a>