You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mi...@apache.org on 2016/02/03 18:25:51 UTC

[18/51] [partial] hbase-site git commit: Published site at 2f5767376f42c0416e025df412e3d5944a1b2a67.

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/6a13df3e/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html
----------------------------------------------------------------------
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 7892f01..aca2cbc 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/client/TestFromClientSide.html
@@ -56,77 +56,77 @@
 <span class="sourceLineNo">048</span>import org.apache.hadoop.conf.Configuration;<a name="line.48"></a>
 <span class="sourceLineNo">049</span>import org.apache.hadoop.hbase.Cell;<a name="line.49"></a>
 <span class="sourceLineNo">050</span>import org.apache.hadoop.hbase.CellUtil;<a name="line.50"></a>
-<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.DoNotRetryIOException;<a name="line.51"></a>
-<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.52"></a>
-<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.53"></a>
-<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.HConstants;<a name="line.54"></a>
-<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.55"></a>
-<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.56"></a>
-<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.57"></a>
-<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.KeepDeletedCells;<a name="line.58"></a>
-<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.59"></a>
-<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.60"></a>
-<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.61"></a>
-<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.ServerName;<a name="line.62"></a>
-<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.TableName;<a name="line.63"></a>
-<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.Waiter;<a name="line.64"></a>
-<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.filter.CompareFilter;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.71"></a>
-<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.InclusiveStopFilter;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.KeyOnlyFilter;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.LongComparator;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.77"></a>
-<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.QualifierFilter;<a name="line.78"></a>
-<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.RegexStringComparator;<a name="line.79"></a>
-<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.RowFilter;<a name="line.80"></a>
-<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.81"></a>
-<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.82"></a>
-<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.83"></a>
-<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.84"></a>
-<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.85"></a>
-<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;<a name="line.86"></a>
-<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.87"></a>
-<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.88"></a>
-<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.protobuf.generated.AdminProtos;<a name="line.89"></a>
-<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;<a name="line.90"></a>
-<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.MutationType;<a name="line.91"></a>
-<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MultiRowMutationService;<a name="line.92"></a>
-<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MutateRowsRequest;<a name="line.93"></a>
-<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.94"></a>
-<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException;<a name="line.95"></a>
-<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.regionserver.Region;<a name="line.96"></a>
-<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.97"></a>
-<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.98"></a>
-<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.99"></a>
-<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.100"></a>
-<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.101"></a>
-<span class="sourceLineNo">102</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.102"></a>
-<span class="sourceLineNo">103</span>import org.apache.log4j.AppenderSkeleton;<a name="line.103"></a>
-<span class="sourceLineNo">104</span>import org.apache.log4j.Level;<a name="line.104"></a>
-<span class="sourceLineNo">105</span>import org.apache.log4j.Logger;<a name="line.105"></a>
-<span class="sourceLineNo">106</span>import org.apache.log4j.spi.LoggingEvent;<a name="line.106"></a>
-<span class="sourceLineNo">107</span>import org.junit.After;<a name="line.107"></a>
-<span class="sourceLineNo">108</span>import org.junit.AfterClass;<a name="line.108"></a>
-<span class="sourceLineNo">109</span>import org.junit.Before;<a name="line.109"></a>
-<span class="sourceLineNo">110</span>import org.junit.BeforeClass;<a name="line.110"></a>
-<span class="sourceLineNo">111</span>import org.junit.Ignore;<a name="line.111"></a>
-<span class="sourceLineNo">112</span>import org.junit.Test;<a name="line.112"></a>
-<span class="sourceLineNo">113</span>import org.junit.experimental.categories.Category;<a name="line.113"></a>
-<span class="sourceLineNo">114</span>/**<a name="line.114"></a>
-<span class="sourceLineNo">115</span> * Run tests that use the HBase clients; {@link Table}.<a name="line.115"></a>
-<span class="sourceLineNo">116</span> * Sets up the HBase mini cluster once at start and runs through all client tests.<a name="line.116"></a>
-<span class="sourceLineNo">117</span> * Each creates a table named for the method and does its stuff against that.<a name="line.117"></a>
-<span class="sourceLineNo">118</span> */<a name="line.118"></a>
-<span class="sourceLineNo">119</span>@Category({LargeTests.class, ClientTests.class})<a name="line.119"></a>
-<span class="sourceLineNo">120</span>@SuppressWarnings ("deprecation")<a name="line.120"></a>
-<span class="sourceLineNo">121</span>public class TestFromClientSide {<a name="line.121"></a>
+<span class="sourceLineNo">051</span>import org.apache.hadoop.hbase.HBaseTestingUtility;<a name="line.51"></a>
+<span class="sourceLineNo">052</span>import org.apache.hadoop.hbase.HColumnDescriptor;<a name="line.52"></a>
+<span class="sourceLineNo">053</span>import org.apache.hadoop.hbase.HConstants;<a name="line.53"></a>
+<span class="sourceLineNo">054</span>import org.apache.hadoop.hbase.HRegionInfo;<a name="line.54"></a>
+<span class="sourceLineNo">055</span>import org.apache.hadoop.hbase.HRegionLocation;<a name="line.55"></a>
+<span class="sourceLineNo">056</span>import org.apache.hadoop.hbase.HTableDescriptor;<a name="line.56"></a>
+<span class="sourceLineNo">057</span>import org.apache.hadoop.hbase.KeepDeletedCells;<a name="line.57"></a>
+<span class="sourceLineNo">058</span>import org.apache.hadoop.hbase.KeyValue;<a name="line.58"></a>
+<span class="sourceLineNo">059</span>import org.apache.hadoop.hbase.MiniHBaseCluster;<a name="line.59"></a>
+<span class="sourceLineNo">060</span>import org.apache.hadoop.hbase.RegionLocations;<a name="line.60"></a>
+<span class="sourceLineNo">061</span>import org.apache.hadoop.hbase.ServerName;<a name="line.61"></a>
+<span class="sourceLineNo">062</span>import org.apache.hadoop.hbase.TableName;<a name="line.62"></a>
+<span class="sourceLineNo">063</span>import org.apache.hadoop.hbase.Waiter;<a name="line.63"></a>
+<span class="sourceLineNo">064</span>import org.apache.hadoop.hbase.client.metrics.ScanMetrics;<a name="line.64"></a>
+<span class="sourceLineNo">065</span>import org.apache.hadoop.hbase.coprocessor.CoprocessorHost;<a name="line.65"></a>
+<span class="sourceLineNo">066</span>import org.apache.hadoop.hbase.coprocessor.MultiRowMutationEndpoint;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.apache.hadoop.hbase.filter.BinaryComparator;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.apache.hadoop.hbase.filter.CompareFilter;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.apache.hadoop.hbase.filter.Filter;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.apache.hadoop.hbase.filter.FilterList;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;<a name="line.72"></a>
+<span class="sourceLineNo">073</span>import org.apache.hadoop.hbase.filter.InclusiveStopFilter;<a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hadoop.hbase.filter.KeyOnlyFilter;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hadoop.hbase.filter.LongComparator;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hadoop.hbase.filter.PrefixFilter;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hadoop.hbase.filter.QualifierFilter;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hadoop.hbase.filter.RegexStringComparator;<a name="line.78"></a>
+<span class="sourceLineNo">079</span>import org.apache.hadoop.hbase.filter.RowFilter;<a name="line.79"></a>
+<span class="sourceLineNo">080</span>import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;<a name="line.80"></a>
+<span class="sourceLineNo">081</span>import org.apache.hadoop.hbase.filter.WhileMatchFilter;<a name="line.81"></a>
+<span class="sourceLineNo">082</span>import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;<a name="line.82"></a>
+<span class="sourceLineNo">083</span>import org.apache.hadoop.hbase.io.hfile.BlockCache;<a name="line.83"></a>
+<span class="sourceLineNo">084</span>import org.apache.hadoop.hbase.io.hfile.CacheConfig;<a name="line.84"></a>
+<span class="sourceLineNo">085</span>import org.apache.hadoop.hbase.ipc.CoprocessorRpcChannel;<a name="line.85"></a>
+<span class="sourceLineNo">086</span>import org.apache.hadoop.hbase.master.HMaster;<a name="line.86"></a>
+<span class="sourceLineNo">087</span>import org.apache.hadoop.hbase.protobuf.ProtobufUtil;<a name="line.87"></a>
+<span class="sourceLineNo">088</span>import org.apache.hadoop.hbase.protobuf.generated.AdminProtos;<a name="line.88"></a>
+<span class="sourceLineNo">089</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto;<a name="line.89"></a>
+<span class="sourceLineNo">090</span>import org.apache.hadoop.hbase.protobuf.generated.ClientProtos.MutationProto.MutationType;<a name="line.90"></a>
+<span class="sourceLineNo">091</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MultiRowMutationService;<a name="line.91"></a>
+<span class="sourceLineNo">092</span>import org.apache.hadoop.hbase.protobuf.generated.MultiRowMutationProtos.MutateRowsRequest;<a name="line.92"></a>
+<span class="sourceLineNo">093</span>import org.apache.hadoop.hbase.regionserver.HRegionServer;<a name="line.93"></a>
+<span class="sourceLineNo">094</span>import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException;<a name="line.94"></a>
+<span class="sourceLineNo">095</span>import org.apache.hadoop.hbase.regionserver.Region;<a name="line.95"></a>
+<span class="sourceLineNo">096</span>import org.apache.hadoop.hbase.regionserver.Store;<a name="line.96"></a>
+<span class="sourceLineNo">097</span>import org.apache.hadoop.hbase.testclassification.ClientTests;<a name="line.97"></a>
+<span class="sourceLineNo">098</span>import org.apache.hadoop.hbase.testclassification.LargeTests;<a name="line.98"></a>
+<span class="sourceLineNo">099</span>import org.apache.hadoop.hbase.util.Bytes;<a name="line.99"></a>
+<span class="sourceLineNo">100</span>import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;<a name="line.100"></a>
+<span class="sourceLineNo">101</span>import org.apache.hadoop.hbase.util.Pair;<a name="line.101"></a>
+<span class="sourceLineNo">102</span>import org.apache.log4j.AppenderSkeleton;<a name="line.102"></a>
+<span class="sourceLineNo">103</span>import org.apache.log4j.Level;<a name="line.103"></a>
+<span class="sourceLineNo">104</span>import org.apache.log4j.Logger;<a name="line.104"></a>
+<span class="sourceLineNo">105</span>import org.apache.log4j.spi.LoggingEvent;<a name="line.105"></a>
+<span class="sourceLineNo">106</span>import org.junit.After;<a name="line.106"></a>
+<span class="sourceLineNo">107</span>import org.junit.AfterClass;<a name="line.107"></a>
+<span class="sourceLineNo">108</span>import org.junit.Before;<a name="line.108"></a>
+<span class="sourceLineNo">109</span>import org.junit.BeforeClass;<a name="line.109"></a>
+<span class="sourceLineNo">110</span>import org.junit.Ignore;<a name="line.110"></a>
+<span class="sourceLineNo">111</span>import org.junit.Test;<a name="line.111"></a>
+<span class="sourceLineNo">112</span>import org.junit.experimental.categories.Category;<a name="line.112"></a>
+<span class="sourceLineNo">113</span>/**<a name="line.113"></a>
+<span class="sourceLineNo">114</span> * Run tests that use the HBase clients; {@link Table}.<a name="line.114"></a>
+<span class="sourceLineNo">115</span> * Sets up the HBase mini cluster once at start and runs through all client tests.<a name="line.115"></a>
+<span class="sourceLineNo">116</span> * Each creates a table named for the method and does its stuff against that.<a name="line.116"></a>
+<span class="sourceLineNo">117</span> */<a name="line.117"></a>
+<span class="sourceLineNo">118</span>@Category({LargeTests.class, ClientTests.class})<a name="line.118"></a>
+<span class="sourceLineNo">119</span>@SuppressWarnings ("deprecation")<a name="line.119"></a>
+<span class="sourceLineNo">120</span>public class TestFromClientSide {<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  // NOTE: Increment tests were moved to their own class, TestIncrementsFromClientSide.<a name="line.121"></a>
 <span class="sourceLineNo">122</span>  private static final Log LOG = LogFactory.getLog(TestFromClientSide.class);<a name="line.122"></a>
 <span class="sourceLineNo">123</span>  protected final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.123"></a>
 <span class="sourceLineNo">124</span>  private static byte [] ROW = Bytes.toBytes("testRow");<a name="line.124"></a>
@@ -3054,7 +3054,7 @@
 <span class="sourceLineNo">3046</span>        equals(value, CellUtil.cloneValue(key)));<a name="line.3046"></a>
 <span class="sourceLineNo">3047</span>  }<a name="line.3047"></a>
 <span class="sourceLineNo">3048</span><a name="line.3048"></a>
-<span class="sourceLineNo">3049</span>  private void assertIncrementKey(Cell key, byte [] row, byte [] family,<a name="line.3049"></a>
+<span class="sourceLineNo">3049</span>  static void assertIncrementKey(Cell key, byte [] row, byte [] family,<a name="line.3049"></a>
 <span class="sourceLineNo">3050</span>      byte [] qualifier, long value)<a name="line.3050"></a>
 <span class="sourceLineNo">3051</span>  throws Exception {<a name="line.3051"></a>
 <span class="sourceLineNo">3052</span>    assertTrue("Expected row [" + Bytes.toString(row) + "] " +<a name="line.3052"></a>
@@ -3278,7 +3278,7 @@
 <span class="sourceLineNo">3270</span>    return stamps;<a name="line.3270"></a>
 <span class="sourceLineNo">3271</span>  }<a name="line.3271"></a>
 <span class="sourceLineNo">3272</span><a name="line.3272"></a>
-<span class="sourceLineNo">3273</span>  private boolean equals(byte [] left, byte [] right) {<a name="line.3273"></a>
+<span class="sourceLineNo">3273</span>  static boolean equals(byte [] left, byte [] right) {<a name="line.3273"></a>
 <span class="sourceLineNo">3274</span>    if (left == null &amp;&amp; right == null) return true;<a name="line.3274"></a>
 <span class="sourceLineNo">3275</span>    if (left == null &amp;&amp; right.length == 0) return true;<a name="line.3275"></a>
 <span class="sourceLineNo">3276</span>    if (right == null &amp;&amp; left.length == 0) return true;<a name="line.3276"></a>
@@ -4407,2001 +4407,1743 @@
 <span class="sourceLineNo">4399</span>  }<a name="line.4399"></a>
 <span class="sourceLineNo">4400</span><a name="line.4400"></a>
 <span class="sourceLineNo">4401</span>  @Test<a name="line.4401"></a>
-<span class="sourceLineNo">4402</span>  public void testIncrementWithDeletes() throws Exception {<a name="line.4402"></a>
-<span class="sourceLineNo">4403</span>    LOG.info("Starting testIncrementWithDeletes");<a name="line.4403"></a>
-<span class="sourceLineNo">4404</span>    final TableName TABLENAME =<a name="line.4404"></a>
-<span class="sourceLineNo">4405</span>        TableName.valueOf("testIncrementWithDeletes");<a name="line.4405"></a>
-<span class="sourceLineNo">4406</span>    Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY);<a name="line.4406"></a>
-<span class="sourceLineNo">4407</span>    final byte[] COLUMN = Bytes.toBytes("column");<a name="line.4407"></a>
-<span class="sourceLineNo">4408</span><a name="line.4408"></a>
-<span class="sourceLineNo">4409</span>    ht.incrementColumnValue(ROW, FAMILY, COLUMN, 5);<a name="line.4409"></a>
-<span class="sourceLineNo">4410</span>    TEST_UTIL.flush(TABLENAME);<a name="line.4410"></a>
-<span class="sourceLineNo">4411</span><a name="line.4411"></a>
-<span class="sourceLineNo">4412</span>    Delete del = new Delete(ROW);<a name="line.4412"></a>
-<span class="sourceLineNo">4413</span>    ht.delete(del);<a name="line.4413"></a>
-<span class="sourceLineNo">4414</span><a name="line.4414"></a>
-<span class="sourceLineNo">4415</span>    ht.incrementColumnValue(ROW, FAMILY, COLUMN, 5);<a name="line.4415"></a>
-<span class="sourceLineNo">4416</span><a name="line.4416"></a>
-<span class="sourceLineNo">4417</span>    Get get = new Get(ROW);<a name="line.4417"></a>
-<span class="sourceLineNo">4418</span>    Result r = ht.get(get);<a name="line.4418"></a>
-<span class="sourceLineNo">4419</span>    assertEquals(1, r.size());<a name="line.4419"></a>
-<span class="sourceLineNo">4420</span>    assertEquals(5, Bytes.toLong(r.getValue(FAMILY, COLUMN)));<a name="line.4420"></a>
-<span class="sourceLineNo">4421</span>  }<a name="line.4421"></a>
+<span class="sourceLineNo">4402</span>  public void testClientPoolRoundRobin() throws IOException {<a name="line.4402"></a>
+<span class="sourceLineNo">4403</span>    final TableName tableName = TableName.valueOf("testClientPoolRoundRobin");<a name="line.4403"></a>
+<span class="sourceLineNo">4404</span><a name="line.4404"></a>
+<span class="sourceLineNo">4405</span>    int poolSize = 3;<a name="line.4405"></a>
+<span class="sourceLineNo">4406</span>    int numVersions = poolSize * 2;<a name="line.4406"></a>
+<span class="sourceLineNo">4407</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.4407"></a>
+<span class="sourceLineNo">4408</span>    conf.set(HConstants.HBASE_CLIENT_IPC_POOL_TYPE, "round-robin");<a name="line.4408"></a>
+<span class="sourceLineNo">4409</span>    conf.setInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, poolSize);<a name="line.4409"></a>
+<span class="sourceLineNo">4410</span><a name="line.4410"></a>
+<span class="sourceLineNo">4411</span>    Table table = TEST_UTIL.createTable(tableName, new byte[][] { FAMILY }, Integer.MAX_VALUE);<a name="line.4411"></a>
+<span class="sourceLineNo">4412</span><a name="line.4412"></a>
+<span class="sourceLineNo">4413</span>    final long ts = EnvironmentEdgeManager.currentTime();<a name="line.4413"></a>
+<span class="sourceLineNo">4414</span>    Get get = new Get(ROW);<a name="line.4414"></a>
+<span class="sourceLineNo">4415</span>    get.addColumn(FAMILY, QUALIFIER);<a name="line.4415"></a>
+<span class="sourceLineNo">4416</span>    get.setMaxVersions();<a name="line.4416"></a>
+<span class="sourceLineNo">4417</span><a name="line.4417"></a>
+<span class="sourceLineNo">4418</span>    for (int versions = 1; versions &lt;= numVersions; versions++) {<a name="line.4418"></a>
+<span class="sourceLineNo">4419</span>      Put put = new Put(ROW);<a name="line.4419"></a>
+<span class="sourceLineNo">4420</span>      put.addColumn(FAMILY, QUALIFIER, ts + versions, VALUE);<a name="line.4420"></a>
+<span class="sourceLineNo">4421</span>      table.put(put);<a name="line.4421"></a>
 <span class="sourceLineNo">4422</span><a name="line.4422"></a>
-<span class="sourceLineNo">4423</span>  @Test<a name="line.4423"></a>
-<span class="sourceLineNo">4424</span>  public void testIncrementingInvalidValue() throws Exception {<a name="line.4424"></a>
-<span class="sourceLineNo">4425</span>    LOG.info("Starting testIncrementingInvalidValue");<a name="line.4425"></a>
-<span class="sourceLineNo">4426</span>    final TableName TABLENAME = TableName.valueOf("testIncrementingInvalidValue");<a name="line.4426"></a>
-<span class="sourceLineNo">4427</span>    Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY);<a name="line.4427"></a>
-<span class="sourceLineNo">4428</span>    final byte[] COLUMN = Bytes.toBytes("column");<a name="line.4428"></a>
-<span class="sourceLineNo">4429</span>    Put p = new Put(ROW);<a name="line.4429"></a>
-<span class="sourceLineNo">4430</span>    // write an integer here (not a Long)<a name="line.4430"></a>
-<span class="sourceLineNo">4431</span>    p.addColumn(FAMILY, COLUMN, Bytes.toBytes(5));<a name="line.4431"></a>
-<span class="sourceLineNo">4432</span>    ht.put(p);<a name="line.4432"></a>
-<span class="sourceLineNo">4433</span>    try {<a name="line.4433"></a>
-<span class="sourceLineNo">4434</span>      ht.incrementColumnValue(ROW, FAMILY, COLUMN, 5);<a name="line.4434"></a>
-<span class="sourceLineNo">4435</span>      fail("Should have thrown DoNotRetryIOException");<a name="line.4435"></a>
-<span class="sourceLineNo">4436</span>    } catch (DoNotRetryIOException iox) {<a name="line.4436"></a>
-<span class="sourceLineNo">4437</span>      // success<a name="line.4437"></a>
-<span class="sourceLineNo">4438</span>    }<a name="line.4438"></a>
-<span class="sourceLineNo">4439</span>    Increment inc = new Increment(ROW);<a name="line.4439"></a>
-<span class="sourceLineNo">4440</span>    inc.addColumn(FAMILY, COLUMN, 5);<a name="line.4440"></a>
-<span class="sourceLineNo">4441</span>    try {<a name="line.4441"></a>
-<span class="sourceLineNo">4442</span>      ht.increment(inc);<a name="line.4442"></a>
-<span class="sourceLineNo">4443</span>      fail("Should have thrown DoNotRetryIOException");<a name="line.4443"></a>
-<span class="sourceLineNo">4444</span>    } catch (DoNotRetryIOException iox) {<a name="line.4444"></a>
-<span class="sourceLineNo">4445</span>      // success<a name="line.4445"></a>
-<span class="sourceLineNo">4446</span>    }<a name="line.4446"></a>
-<span class="sourceLineNo">4447</span>  }<a name="line.4447"></a>
+<span class="sourceLineNo">4423</span>      Result result = table.get(get);<a name="line.4423"></a>
+<span class="sourceLineNo">4424</span>      NavigableMap&lt;Long, byte[]&gt; navigableMap = result.getMap().get(FAMILY)<a name="line.4424"></a>
+<span class="sourceLineNo">4425</span>          .get(QUALIFIER);<a name="line.4425"></a>
+<span class="sourceLineNo">4426</span><a name="line.4426"></a>
+<span class="sourceLineNo">4427</span>      assertEquals("The number of versions of '" + FAMILY + ":" + QUALIFIER<a name="line.4427"></a>
+<span class="sourceLineNo">4428</span>          + " did not match " + versions, versions, navigableMap.size());<a name="line.4428"></a>
+<span class="sourceLineNo">4429</span>      for (Map.Entry&lt;Long, byte[]&gt; entry : navigableMap.entrySet()) {<a name="line.4429"></a>
+<span class="sourceLineNo">4430</span>        assertTrue("The value at time " + entry.getKey()<a name="line.4430"></a>
+<span class="sourceLineNo">4431</span>            + " did not match what was put",<a name="line.4431"></a>
+<span class="sourceLineNo">4432</span>            Bytes.equals(VALUE, entry.getValue()));<a name="line.4432"></a>
+<span class="sourceLineNo">4433</span>      }<a name="line.4433"></a>
+<span class="sourceLineNo">4434</span>    }<a name="line.4434"></a>
+<span class="sourceLineNo">4435</span>  }<a name="line.4435"></a>
+<span class="sourceLineNo">4436</span><a name="line.4436"></a>
+<span class="sourceLineNo">4437</span>  @Ignore ("Flakey: HBASE-8989") @Test<a name="line.4437"></a>
+<span class="sourceLineNo">4438</span>  public void testClientPoolThreadLocal() throws IOException {<a name="line.4438"></a>
+<span class="sourceLineNo">4439</span>    final TableName tableName = TableName.valueOf("testClientPoolThreadLocal");<a name="line.4439"></a>
+<span class="sourceLineNo">4440</span><a name="line.4440"></a>
+<span class="sourceLineNo">4441</span>    int poolSize = Integer.MAX_VALUE;<a name="line.4441"></a>
+<span class="sourceLineNo">4442</span>    int numVersions = 3;<a name="line.4442"></a>
+<span class="sourceLineNo">4443</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.4443"></a>
+<span class="sourceLineNo">4444</span>    conf.set(HConstants.HBASE_CLIENT_IPC_POOL_TYPE, "thread-local");<a name="line.4444"></a>
+<span class="sourceLineNo">4445</span>    conf.setInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, poolSize);<a name="line.4445"></a>
+<span class="sourceLineNo">4446</span><a name="line.4446"></a>
+<span class="sourceLineNo">4447</span>    final Table table = TEST_UTIL.createTable(tableName, new byte[][] { FAMILY },  3);<a name="line.4447"></a>
 <span class="sourceLineNo">4448</span><a name="line.4448"></a>
-<span class="sourceLineNo">4449</span>  @Test<a name="line.4449"></a>
-<span class="sourceLineNo">4450</span>  public void testIncrementInvalidArguments() throws Exception {<a name="line.4450"></a>
-<span class="sourceLineNo">4451</span>    LOG.info("Starting testIncrementInvalidArguments");<a name="line.4451"></a>
-<span class="sourceLineNo">4452</span>    final TableName TABLENAME = TableName.valueOf("testIncrementInvalidArguments");<a name="line.4452"></a>
-<span class="sourceLineNo">4453</span>    Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY);<a name="line.4453"></a>
-<span class="sourceLineNo">4454</span>    final byte[] COLUMN = Bytes.toBytes("column");<a name="line.4454"></a>
-<span class="sourceLineNo">4455</span>    try {<a name="line.4455"></a>
-<span class="sourceLineNo">4456</span>      // try null row<a name="line.4456"></a>
-<span class="sourceLineNo">4457</span>      ht.incrementColumnValue(null, FAMILY, COLUMN, 5);<a name="line.4457"></a>
-<span class="sourceLineNo">4458</span>      fail("Should have thrown IOException");<a name="line.4458"></a>
-<span class="sourceLineNo">4459</span>    } catch (IOException iox) {<a name="line.4459"></a>
-<span class="sourceLineNo">4460</span>      // success<a name="line.4460"></a>
-<span class="sourceLineNo">4461</span>    }<a name="line.4461"></a>
-<span class="sourceLineNo">4462</span>    try {<a name="line.4462"></a>
-<span class="sourceLineNo">4463</span>      // try null family<a name="line.4463"></a>
-<span class="sourceLineNo">4464</span>      ht.incrementColumnValue(ROW, null, COLUMN, 5);<a name="line.4464"></a>
-<span class="sourceLineNo">4465</span>      fail("Should have thrown IOException");<a name="line.4465"></a>
-<span class="sourceLineNo">4466</span>    } catch (IOException iox) {<a name="line.4466"></a>
-<span class="sourceLineNo">4467</span>      // success<a name="line.4467"></a>
-<span class="sourceLineNo">4468</span>    }<a name="line.4468"></a>
-<span class="sourceLineNo">4469</span>    try {<a name="line.4469"></a>
-<span class="sourceLineNo">4470</span>      // try null qualifier<a name="line.4470"></a>
-<span class="sourceLineNo">4471</span>      ht.incrementColumnValue(ROW, FAMILY, null, 5);<a name="line.4471"></a>
-<span class="sourceLineNo">4472</span>      fail("Should have thrown IOException");<a name="line.4472"></a>
-<span class="sourceLineNo">4473</span>    } catch (IOException iox) {<a name="line.4473"></a>
-<span class="sourceLineNo">4474</span>      // success<a name="line.4474"></a>
-<span class="sourceLineNo">4475</span>    }<a name="line.4475"></a>
-<span class="sourceLineNo">4476</span>    // try null row<a name="line.4476"></a>
-<span class="sourceLineNo">4477</span>    try {<a name="line.4477"></a>
-<span class="sourceLineNo">4478</span>      Increment incNoRow = new Increment((byte [])null);<a name="line.4478"></a>
-<span class="sourceLineNo">4479</span>      incNoRow.addColumn(FAMILY, COLUMN, 5);<a name="line.4479"></a>
-<span class="sourceLineNo">4480</span>      fail("Should have thrown IllegalArgumentException");<a name="line.4480"></a>
-<span class="sourceLineNo">4481</span>    } catch (IllegalArgumentException iax) {<a name="line.4481"></a>
-<span class="sourceLineNo">4482</span>      // success<a name="line.4482"></a>
-<span class="sourceLineNo">4483</span>    } catch (NullPointerException npe) {<a name="line.4483"></a>
-<span class="sourceLineNo">4484</span>      // success<a name="line.4484"></a>
-<span class="sourceLineNo">4485</span>    }<a name="line.4485"></a>
-<span class="sourceLineNo">4486</span>    // try null family<a name="line.4486"></a>
-<span class="sourceLineNo">4487</span>    try {<a name="line.4487"></a>
-<span class="sourceLineNo">4488</span>      Increment incNoFamily = new Increment(ROW);<a name="line.4488"></a>
-<span class="sourceLineNo">4489</span>      incNoFamily.addColumn(null, COLUMN, 5);<a name="line.4489"></a>
-<span class="sourceLineNo">4490</span>      fail("Should have thrown IllegalArgumentException");<a name="line.4490"></a>
-<span class="sourceLineNo">4491</span>    } catch (IllegalArgumentException iax) {<a name="line.4491"></a>
-<span class="sourceLineNo">4492</span>      // success<a name="line.4492"></a>
-<span class="sourceLineNo">4493</span>    }<a name="line.4493"></a>
-<span class="sourceLineNo">4494</span>    // try null qualifier<a name="line.4494"></a>
-<span class="sourceLineNo">4495</span>    try {<a name="line.4495"></a>
-<span class="sourceLineNo">4496</span>      Increment incNoQualifier = new Increment(ROW);<a name="line.4496"></a>
-<span class="sourceLineNo">4497</span>      incNoQualifier.addColumn(FAMILY, null, 5);<a name="line.4497"></a>
-<span class="sourceLineNo">4498</span>      fail("Should have thrown IllegalArgumentException");<a name="line.4498"></a>
-<span class="sourceLineNo">4499</span>    } catch (IllegalArgumentException iax) {<a name="line.4499"></a>
-<span class="sourceLineNo">4500</span>      // success<a name="line.4500"></a>
-<span class="sourceLineNo">4501</span>    }<a name="line.4501"></a>
-<span class="sourceLineNo">4502</span>  }<a name="line.4502"></a>
-<span class="sourceLineNo">4503</span><a name="line.4503"></a>
-<span class="sourceLineNo">4504</span>  @Test<a name="line.4504"></a>
-<span class="sourceLineNo">4505</span>  public void testIncrementOutOfOrder() throws Exception {<a name="line.4505"></a>
-<span class="sourceLineNo">4506</span>    LOG.info("Starting testIncrementOutOfOrder");<a name="line.4506"></a>
-<span class="sourceLineNo">4507</span>    final TableName TABLENAME = TableName.valueOf("testIncrementOutOfOrder");<a name="line.4507"></a>
-<span class="sourceLineNo">4508</span>    Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY);<a name="line.4508"></a>
-<span class="sourceLineNo">4509</span><a name="line.4509"></a>
-<span class="sourceLineNo">4510</span>    byte [][] QUALIFIERS = new byte [][] {<a name="line.4510"></a>
-<span class="sourceLineNo">4511</span>      Bytes.toBytes("B"), Bytes.toBytes("A"), Bytes.toBytes("C")<a name="line.4511"></a>
-<span class="sourceLineNo">4512</span>    };<a name="line.4512"></a>
-<span class="sourceLineNo">4513</span><a name="line.4513"></a>
-<span class="sourceLineNo">4514</span>    Increment inc = new Increment(ROW);<a name="line.4514"></a>
-<span class="sourceLineNo">4515</span>    for (int i=0; i&lt;QUALIFIERS.length; i++) {<a name="line.4515"></a>
-<span class="sourceLineNo">4516</span>      inc.addColumn(FAMILY, QUALIFIERS[i], 1);<a name="line.4516"></a>
-<span class="sourceLineNo">4517</span>    }<a name="line.4517"></a>
-<span class="sourceLineNo">4518</span>    ht.increment(inc);<a name="line.4518"></a>
-<span class="sourceLineNo">4519</span><a name="line.4519"></a>
-<span class="sourceLineNo">4520</span>    // Verify expected results<a name="line.4520"></a>
-<span class="sourceLineNo">4521</span>    Result r = ht.get(new Get(ROW));<a name="line.4521"></a>
-<span class="sourceLineNo">4522</span>    Cell [] kvs = r.rawCells();<a name="line.4522"></a>
-<span class="sourceLineNo">4523</span>    assertEquals(3, kvs.length);<a name="line.4523"></a>
-<span class="sourceLineNo">4524</span>    assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[1], 1);<a name="line.4524"></a>
-<span class="sourceLineNo">4525</span>    assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[0], 1);<a name="line.4525"></a>
-<span class="sourceLineNo">4526</span>    assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 1);<a name="line.4526"></a>
+<span class="sourceLineNo">4449</span>    final long ts = EnvironmentEdgeManager.currentTime();<a name="line.4449"></a>
+<span class="sourceLineNo">4450</span>    final Get get = new Get(ROW);<a name="line.4450"></a>
+<span class="sourceLineNo">4451</span>    get.addColumn(FAMILY, QUALIFIER);<a name="line.4451"></a>
+<span class="sourceLineNo">4452</span>    get.setMaxVersions();<a name="line.4452"></a>
+<span class="sourceLineNo">4453</span><a name="line.4453"></a>
+<span class="sourceLineNo">4454</span>    for (int versions = 1; versions &lt;= numVersions; versions++) {<a name="line.4454"></a>
+<span class="sourceLineNo">4455</span>      Put put = new Put(ROW);<a name="line.4455"></a>
+<span class="sourceLineNo">4456</span>      put.addColumn(FAMILY, QUALIFIER, ts + versions, VALUE);<a name="line.4456"></a>
+<span class="sourceLineNo">4457</span>      table.put(put);<a name="line.4457"></a>
+<span class="sourceLineNo">4458</span><a name="line.4458"></a>
+<span class="sourceLineNo">4459</span>      Result result = table.get(get);<a name="line.4459"></a>
+<span class="sourceLineNo">4460</span>      NavigableMap&lt;Long, byte[]&gt; navigableMap = result.getMap().get(FAMILY)<a name="line.4460"></a>
+<span class="sourceLineNo">4461</span>          .get(QUALIFIER);<a name="line.4461"></a>
+<span class="sourceLineNo">4462</span><a name="line.4462"></a>
+<span class="sourceLineNo">4463</span>      assertEquals("The number of versions of '" + FAMILY + ":" + QUALIFIER + " did not match " +<a name="line.4463"></a>
+<span class="sourceLineNo">4464</span>        versions + "; " + put.toString() + ", " + get.toString(), versions, navigableMap.size());<a name="line.4464"></a>
+<span class="sourceLineNo">4465</span>      for (Map.Entry&lt;Long, byte[]&gt; entry : navigableMap.entrySet()) {<a name="line.4465"></a>
+<span class="sourceLineNo">4466</span>        assertTrue("The value at time " + entry.getKey()<a name="line.4466"></a>
+<span class="sourceLineNo">4467</span>            + " did not match what was put",<a name="line.4467"></a>
+<span class="sourceLineNo">4468</span>            Bytes.equals(VALUE, entry.getValue()));<a name="line.4468"></a>
+<span class="sourceLineNo">4469</span>      }<a name="line.4469"></a>
+<span class="sourceLineNo">4470</span>    }<a name="line.4470"></a>
+<span class="sourceLineNo">4471</span><a name="line.4471"></a>
+<span class="sourceLineNo">4472</span>    final Object waitLock = new Object();<a name="line.4472"></a>
+<span class="sourceLineNo">4473</span>    ExecutorService executorService = Executors.newFixedThreadPool(numVersions);<a name="line.4473"></a>
+<span class="sourceLineNo">4474</span>    final AtomicReference&lt;AssertionError&gt; error = new AtomicReference&lt;AssertionError&gt;(null);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span>    for (int versions = numVersions; versions &lt; numVersions * 2; versions++) {<a name="line.4475"></a>
+<span class="sourceLineNo">4476</span>      final int versionsCopy = versions;<a name="line.4476"></a>
+<span class="sourceLineNo">4477</span>      executorService.submit(new Callable&lt;Void&gt;() {<a name="line.4477"></a>
+<span class="sourceLineNo">4478</span>        @Override<a name="line.4478"></a>
+<span class="sourceLineNo">4479</span>        public Void call() {<a name="line.4479"></a>
+<span class="sourceLineNo">4480</span>          try {<a name="line.4480"></a>
+<span class="sourceLineNo">4481</span>            Put put = new Put(ROW);<a name="line.4481"></a>
+<span class="sourceLineNo">4482</span>            put.addColumn(FAMILY, QUALIFIER, ts + versionsCopy, VALUE);<a name="line.4482"></a>
+<span class="sourceLineNo">4483</span>            table.put(put);<a name="line.4483"></a>
+<span class="sourceLineNo">4484</span><a name="line.4484"></a>
+<span class="sourceLineNo">4485</span>            Result result = table.get(get);<a name="line.4485"></a>
+<span class="sourceLineNo">4486</span>            NavigableMap&lt;Long, byte[]&gt; navigableMap = result.getMap()<a name="line.4486"></a>
+<span class="sourceLineNo">4487</span>                .get(FAMILY).get(QUALIFIER);<a name="line.4487"></a>
+<span class="sourceLineNo">4488</span><a name="line.4488"></a>
+<span class="sourceLineNo">4489</span>            assertEquals("The number of versions of '" + Bytes.toString(FAMILY) + ":"<a name="line.4489"></a>
+<span class="sourceLineNo">4490</span>                + Bytes.toString(QUALIFIER) + " did not match " + versionsCopy, versionsCopy,<a name="line.4490"></a>
+<span class="sourceLineNo">4491</span>                navigableMap.size());<a name="line.4491"></a>
+<span class="sourceLineNo">4492</span>            for (Map.Entry&lt;Long, byte[]&gt; entry : navigableMap.entrySet()) {<a name="line.4492"></a>
+<span class="sourceLineNo">4493</span>              assertTrue("The value at time " + entry.getKey()<a name="line.4493"></a>
+<span class="sourceLineNo">4494</span>                  + " did not match what was put",<a name="line.4494"></a>
+<span class="sourceLineNo">4495</span>                  Bytes.equals(VALUE, entry.getValue()));<a name="line.4495"></a>
+<span class="sourceLineNo">4496</span>            }<a name="line.4496"></a>
+<span class="sourceLineNo">4497</span>            synchronized (waitLock) {<a name="line.4497"></a>
+<span class="sourceLineNo">4498</span>              waitLock.wait();<a name="line.4498"></a>
+<span class="sourceLineNo">4499</span>            }<a name="line.4499"></a>
+<span class="sourceLineNo">4500</span>          } catch (Exception e) {<a name="line.4500"></a>
+<span class="sourceLineNo">4501</span>          } catch (AssertionError e) {<a name="line.4501"></a>
+<span class="sourceLineNo">4502</span>            // the error happens in a thread, it won't fail the test,<a name="line.4502"></a>
+<span class="sourceLineNo">4503</span>            // need to pass it to the caller for proper handling.<a name="line.4503"></a>
+<span class="sourceLineNo">4504</span>            error.set(e);<a name="line.4504"></a>
+<span class="sourceLineNo">4505</span>            LOG.error(e);<a name="line.4505"></a>
+<span class="sourceLineNo">4506</span>          }<a name="line.4506"></a>
+<span class="sourceLineNo">4507</span><a name="line.4507"></a>
+<span class="sourceLineNo">4508</span>          return null;<a name="line.4508"></a>
+<span class="sourceLineNo">4509</span>        }<a name="line.4509"></a>
+<span class="sourceLineNo">4510</span>      });<a name="line.4510"></a>
+<span class="sourceLineNo">4511</span>    }<a name="line.4511"></a>
+<span class="sourceLineNo">4512</span>    synchronized (waitLock) {<a name="line.4512"></a>
+<span class="sourceLineNo">4513</span>      waitLock.notifyAll();<a name="line.4513"></a>
+<span class="sourceLineNo">4514</span>    }<a name="line.4514"></a>
+<span class="sourceLineNo">4515</span>    executorService.shutdownNow();<a name="line.4515"></a>
+<span class="sourceLineNo">4516</span>    assertNull(error.get());<a name="line.4516"></a>
+<span class="sourceLineNo">4517</span>  }<a name="line.4517"></a>
+<span class="sourceLineNo">4518</span><a name="line.4518"></a>
+<span class="sourceLineNo">4519</span>  @Test<a name="line.4519"></a>
+<span class="sourceLineNo">4520</span>  public void testCheckAndPut() throws IOException {<a name="line.4520"></a>
+<span class="sourceLineNo">4521</span>    final byte [] anotherrow = Bytes.toBytes("anotherrow");<a name="line.4521"></a>
+<span class="sourceLineNo">4522</span>    final byte [] value2 = Bytes.toBytes("abcd");<a name="line.4522"></a>
+<span class="sourceLineNo">4523</span><a name="line.4523"></a>
+<span class="sourceLineNo">4524</span>    Table table = TEST_UTIL.createTable(TableName.valueOf("testCheckAndPut"), FAMILY);<a name="line.4524"></a>
+<span class="sourceLineNo">4525</span>    Put put1 = new Put(ROW);<a name="line.4525"></a>
+<span class="sourceLineNo">4526</span>    put1.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.4526"></a>
 <span class="sourceLineNo">4527</span><a name="line.4527"></a>
-<span class="sourceLineNo">4528</span>    // Now try multiple columns again<a name="line.4528"></a>
-<span class="sourceLineNo">4529</span>    inc = new Increment(ROW);<a name="line.4529"></a>
-<span class="sourceLineNo">4530</span>    for (int i=0; i&lt;QUALIFIERS.length; i++) {<a name="line.4530"></a>
-<span class="sourceLineNo">4531</span>      inc.addColumn(FAMILY, QUALIFIERS[i], 1);<a name="line.4531"></a>
-<span class="sourceLineNo">4532</span>    }<a name="line.4532"></a>
-<span class="sourceLineNo">4533</span>    ht.increment(inc);<a name="line.4533"></a>
-<span class="sourceLineNo">4534</span><a name="line.4534"></a>
-<span class="sourceLineNo">4535</span>    // Verify<a name="line.4535"></a>
-<span class="sourceLineNo">4536</span>    r = ht.get(new Get(ROW));<a name="line.4536"></a>
-<span class="sourceLineNo">4537</span>    kvs = r.rawCells();<a name="line.4537"></a>
-<span class="sourceLineNo">4538</span>    assertEquals(3, kvs.length);<a name="line.4538"></a>
-<span class="sourceLineNo">4539</span>    assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[1], 2);<a name="line.4539"></a>
-<span class="sourceLineNo">4540</span>    assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[0], 2);<a name="line.4540"></a>
-<span class="sourceLineNo">4541</span>    assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 2);<a name="line.4541"></a>
-<span class="sourceLineNo">4542</span>  }<a name="line.4542"></a>
-<span class="sourceLineNo">4543</span><a name="line.4543"></a>
-<span class="sourceLineNo">4544</span>  @Test<a name="line.4544"></a>
-<span class="sourceLineNo">4545</span>  public void testIncrementOnSameColumn() throws Exception {<a name="line.4545"></a>
-<span class="sourceLineNo">4546</span>    LOG.info("Starting testIncrementOnSameColumn");<a name="line.4546"></a>
-<span class="sourceLineNo">4547</span>    final TableName TABLENAME = TableName.valueOf("testIncrementOnSameColumn");<a name="line.4547"></a>
-<span class="sourceLineNo">4548</span>    Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY);<a name="line.4548"></a>
+<span class="sourceLineNo">4528</span>    // row doesn't exist, so using non-null value should be considered "not match".<a name="line.4528"></a>
+<span class="sourceLineNo">4529</span>    boolean ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, VALUE, put1);<a name="line.4529"></a>
+<span class="sourceLineNo">4530</span>    assertEquals(ok, false);<a name="line.4530"></a>
+<span class="sourceLineNo">4531</span><a name="line.4531"></a>
+<span class="sourceLineNo">4532</span>    // row doesn't exist, so using "null" to check for existence should be considered "match".<a name="line.4532"></a>
+<span class="sourceLineNo">4533</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put1);<a name="line.4533"></a>
+<span class="sourceLineNo">4534</span>    assertEquals(ok, true);<a name="line.4534"></a>
+<span class="sourceLineNo">4535</span><a name="line.4535"></a>
+<span class="sourceLineNo">4536</span>    // row now exists, so using "null" to check for existence should be considered "not match".<a name="line.4536"></a>
+<span class="sourceLineNo">4537</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put1);<a name="line.4537"></a>
+<span class="sourceLineNo">4538</span>    assertEquals(ok, false);<a name="line.4538"></a>
+<span class="sourceLineNo">4539</span><a name="line.4539"></a>
+<span class="sourceLineNo">4540</span>    Put put2 = new Put(ROW);<a name="line.4540"></a>
+<span class="sourceLineNo">4541</span>    put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.4541"></a>
+<span class="sourceLineNo">4542</span><a name="line.4542"></a>
+<span class="sourceLineNo">4543</span>    // row now exists, use the matching value to check<a name="line.4543"></a>
+<span class="sourceLineNo">4544</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, VALUE, put2);<a name="line.4544"></a>
+<span class="sourceLineNo">4545</span>    assertEquals(ok, true);<a name="line.4545"></a>
+<span class="sourceLineNo">4546</span><a name="line.4546"></a>
+<span class="sourceLineNo">4547</span>    Put put3 = new Put(anotherrow);<a name="line.4547"></a>
+<span class="sourceLineNo">4548</span>    put3.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.4548"></a>
 <span class="sourceLineNo">4549</span><a name="line.4549"></a>
-<span class="sourceLineNo">4550</span>    byte[][] QUALIFIERS =<a name="line.4550"></a>
-<span class="sourceLineNo">4551</span>        new byte[][] { Bytes.toBytes("A"), Bytes.toBytes("B"), Bytes.toBytes("C") };<a name="line.4551"></a>
-<span class="sourceLineNo">4552</span><a name="line.4552"></a>
-<span class="sourceLineNo">4553</span>    Increment inc = new Increment(ROW);<a name="line.4553"></a>
-<span class="sourceLineNo">4554</span>    for (int i = 0; i &lt; QUALIFIERS.length; i++) {<a name="line.4554"></a>
-<span class="sourceLineNo">4555</span>      inc.addColumn(FAMILY, QUALIFIERS[i], 1);<a name="line.4555"></a>
-<span class="sourceLineNo">4556</span>      inc.addColumn(FAMILY, QUALIFIERS[i], 1);<a name="line.4556"></a>
-<span class="sourceLineNo">4557</span>    }<a name="line.4557"></a>
-<span class="sourceLineNo">4558</span>    ht.increment(inc);<a name="line.4558"></a>
-<span class="sourceLineNo">4559</span><a name="line.4559"></a>
-<span class="sourceLineNo">4560</span>    // Verify expected results<a name="line.4560"></a>
-<span class="sourceLineNo">4561</span>    Result r = ht.get(new Get(ROW));<a name="line.4561"></a>
-<span class="sourceLineNo">4562</span>    Cell[] kvs = r.rawCells();<a name="line.4562"></a>
-<span class="sourceLineNo">4563</span>    assertEquals(3, kvs.length);<a name="line.4563"></a>
-<span class="sourceLineNo">4564</span>    assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[0], 1);<a name="line.4564"></a>
-<span class="sourceLineNo">4565</span>    assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[1], 1);<a name="line.4565"></a>
-<span class="sourceLineNo">4566</span>    assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 1);<a name="line.4566"></a>
-<span class="sourceLineNo">4567</span><a name="line.4567"></a>
-<span class="sourceLineNo">4568</span>    // Now try multiple columns again<a name="line.4568"></a>
-<span class="sourceLineNo">4569</span>    inc = new Increment(ROW);<a name="line.4569"></a>
-<span class="sourceLineNo">4570</span>    for (int i = 0; i &lt; QUALIFIERS.length; i++) {<a name="line.4570"></a>
-<span class="sourceLineNo">4571</span>      inc.addColumn(FAMILY, QUALIFIERS[i], 1);<a name="line.4571"></a>
-<span class="sourceLineNo">4572</span>      inc.addColumn(FAMILY, QUALIFIERS[i], 1);<a name="line.4572"></a>
-<span class="sourceLineNo">4573</span>    }<a name="line.4573"></a>
-<span class="sourceLineNo">4574</span>    ht.increment(inc);<a name="line.4574"></a>
-<span class="sourceLineNo">4575</span><a name="line.4575"></a>
-<span class="sourceLineNo">4576</span>    // Verify<a name="line.4576"></a>
-<span class="sourceLineNo">4577</span>    r = ht.get(new Get(ROW));<a name="line.4577"></a>
-<span class="sourceLineNo">4578</span>    kvs = r.rawCells();<a name="line.4578"></a>
-<span class="sourceLineNo">4579</span>    assertEquals(3, kvs.length);<a name="line.4579"></a>
-<span class="sourceLineNo">4580</span>    assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[0], 2);<a name="line.4580"></a>
-<span class="sourceLineNo">4581</span>    assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[1], 2);<a name="line.4581"></a>
-<span class="sourceLineNo">4582</span>    assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 2);<a name="line.4582"></a>
-<span class="sourceLineNo">4583</span><a name="line.4583"></a>
-<span class="sourceLineNo">4584</span>    ht.close();<a name="line.4584"></a>
-<span class="sourceLineNo">4585</span>  }<a name="line.4585"></a>
-<span class="sourceLineNo">4586</span><a name="line.4586"></a>
-<span class="sourceLineNo">4587</span>  @Test<a name="line.4587"></a>
-<span class="sourceLineNo">4588</span>  public void testIncrement() throws Exception {<a name="line.4588"></a>
-<span class="sourceLineNo">4589</span>    LOG.info("Starting testIncrement");<a name="line.4589"></a>
-<span class="sourceLineNo">4590</span>    final TableName TABLENAME = TableName.valueOf("testIncrement");<a name="line.4590"></a>
-<span class="sourceLineNo">4591</span>    Table ht = TEST_UTIL.createTable(TABLENAME, FAMILY);<a name="line.4591"></a>
-<span class="sourceLineNo">4592</span><a name="line.4592"></a>
-<span class="sourceLineNo">4593</span>    byte [][] ROWS = new byte [][] {<a name="line.4593"></a>
-<span class="sourceLineNo">4594</span>        Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c"),<a name="line.4594"></a>
-<span class="sourceLineNo">4595</span>        Bytes.toBytes("d"), Bytes.toBytes("e"), Bytes.toBytes("f"),<a name="line.4595"></a>
-<span class="sourceLineNo">4596</span>        Bytes.toBytes("g"), Bytes.toBytes("h"), Bytes.toBytes("i")<a name="line.4596"></a>
-<span class="sourceLineNo">4597</span>    };<a name="line.4597"></a>
-<span class="sourceLineNo">4598</span>    byte [][] QUALIFIERS = new byte [][] {<a name="line.4598"></a>
-<span class="sourceLineNo">4599</span>        Bytes.toBytes("a"), Bytes.toBytes("b"), Bytes.toBytes("c"),<a name="line.4599"></a>
-<span class="sourceLineNo">4600</span>        Bytes.toBytes("d"), Bytes.toBytes("e"), Bytes.toBytes("f"),<a name="line.4600"></a>
-<span class="sourceLineNo">4601</span>        Bytes.toBytes("g"), Bytes.toBytes("h"), Bytes.toBytes("i")<a name="line.4601"></a>
-<span class="sourceLineNo">4602</span>    };<a name="line.4602"></a>
-<span class="sourceLineNo">4603</span><a name="line.4603"></a>
-<span class="sourceLineNo">4604</span>    // Do some simple single-column increments<a name="line.4604"></a>
-<span class="sourceLineNo">4605</span><a name="line.4605"></a>
-<span class="sourceLineNo">4606</span>    // First with old API<a name="line.4606"></a>
-<span class="sourceLineNo">4607</span>    ht.incrementColumnValue(ROW, FAMILY, QUALIFIERS[0], 1);<a name="line.4607"></a>
-<span class="sourceLineNo">4608</span>    ht.incrementColumnValue(ROW, FAMILY, QUALIFIERS[1], 2);<a name="line.4608"></a>
-<span class="sourceLineNo">4609</span>    ht.incrementColumnValue(ROW, FAMILY, QUALIFIERS[2], 3);<a name="line.4609"></a>
-<span class="sourceLineNo">4610</span>    ht.incrementColumnValue(ROW, FAMILY, QUALIFIERS[3], 4);<a name="line.4610"></a>
-<span class="sourceLineNo">4611</span><a name="line.4611"></a>
-<span class="sourceLineNo">4612</span>    // Now increment things incremented with old and do some new<a name="line.4612"></a>
-<span class="sourceLineNo">4613</span>    Increment inc = new Increment(ROW);<a name="line.4613"></a>
-<span class="sourceLineNo">4614</span>    inc.addColumn(FAMILY, QUALIFIERS[1], 1);<a name="line.4614"></a>
-<span class="sourceLineNo">4615</span>    inc.addColumn(FAMILY, QUALIFIERS[3], 1);<a name="line.4615"></a>
-<span class="sourceLineNo">4616</span>    inc.addColumn(FAMILY, QUALIFIERS[4], 1);<a name="line.4616"></a>
-<span class="sourceLineNo">4617</span>    ht.increment(inc);<a name="line.4617"></a>
-<span class="sourceLineNo">4618</span><a name="line.4618"></a>
-<span class="sourceLineNo">4619</span>    // Verify expected results<a name="line.4619"></a>
-<span class="sourceLineNo">4620</span>    Result r = ht.get(new Get(ROW));<a name="line.4620"></a>
-<span class="sourceLineNo">4621</span>    Cell [] kvs = r.rawCells();<a name="line.4621"></a>
-<span class="sourceLineNo">4622</span>    assertEquals(5, kvs.length);<a name="line.4622"></a>
-<span class="sourceLineNo">4623</span>    assertIncrementKey(kvs[0], ROW, FAMILY, QUALIFIERS[0], 1);<a name="line.4623"></a>
-<span class="sourceLineNo">4624</span>    assertIncrementKey(kvs[1], ROW, FAMILY, QUALIFIERS[1], 3);<a name="line.4624"></a>
-<span class="sourceLineNo">4625</span>    assertIncrementKey(kvs[2], ROW, FAMILY, QUALIFIERS[2], 3);<a name="line.4625"></a>
-<span class="sourceLineNo">4626</span>    assertIncrementKey(kvs[3], ROW, FAMILY, QUALIFIERS[3], 5);<a name="line.4626"></a>
-<span class="sourceLineNo">4627</span>    assertIncrementKey(kvs[4], ROW, FAMILY, QUALIFIERS[4], 1);<a name="line.4627"></a>
-<span class="sourceLineNo">4628</span><a name="line.4628"></a>
-<span class="sourceLineNo">4629</span>    // Now try multiple columns by different amounts<a name="line.4629"></a>
-<span class="sourceLineNo">4630</span>    inc = new Increment(ROWS[0]);<a name="line.4630"></a>
-<span class="sourceLineNo">4631</span>    for (int i=0;i&lt;QUALIFIERS.length;i++) {<a name="line.4631"></a>
-<span class="sourceLineNo">4632</span>      inc.addColumn(FAMILY, QUALIFIERS[i], i+1);<a name="line.4632"></a>
-<span class="sourceLineNo">4633</span>    }<a name="line.4633"></a>
-<span class="sourceLineNo">4634</span>    ht.increment(inc);<a name="line.4634"></a>
-<span class="sourceLineNo">4635</span>    // Verify<a name="line.4635"></a>
-<span class="sourceLineNo">4636</span>    r = ht.get(new Get(ROWS[0]));<a name="line.4636"></a>
-<span class="sourceLineNo">4637</span>    kvs = r.rawCells();<a name="line.4637"></a>
-<span class="sourceLineNo">4638</span>    assertEquals(QUALIFIERS.length, kvs.length);<a name="line.4638"></a>
-<span class="sourceLineNo">4639</span>    for (int i=0;i&lt;QUALIFIERS.length;i++) {<a name="line.4639"></a>
-<span class="sourceLineNo">4640</span>      assertIncrementKey(kvs[i], ROWS[0], FAMILY, QUALIFIERS[i], i+1);<a name="line.4640"></a>
-<span class="sourceLineNo">4641</span>    }<a name="line.4641"></a>
+<span class="sourceLineNo">4550</span>    // try to do CheckAndPut on different rows<a name="line.4550"></a>
+<span class="sourceLineNo">4551</span>    try {<a name="line.4551"></a>
+<span class="sourceLineNo">4552</span>        ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, value2, put3);<a name="line.4552"></a>
+<span class="sourceLineNo">4553</span>        fail("trying to check and modify different rows should have failed.");<a name="line.4553"></a>
+<span class="sourceLineNo">4554</span>    } catch(Exception e) {}<a name="line.4554"></a>
+<span class="sourceLineNo">4555</span><a name="line.4555"></a>
+<span class="sourceLineNo">4556</span>  }<a name="line.4556"></a>
+<span class="sourceLineNo">4557</span><a name="line.4557"></a>
+<span class="sourceLineNo">4558</span>  @Test<a name="line.4558"></a>
+<span class="sourceLineNo">4559</span>  public void testCheckAndPutWithCompareOp() throws IOException {<a name="line.4559"></a>
+<span class="sourceLineNo">4560</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.4560"></a>
+<span class="sourceLineNo">4561</span>    final byte [] value2 = Bytes.toBytes("bbbb");<a name="line.4561"></a>
+<span class="sourceLineNo">4562</span>    final byte [] value3 = Bytes.toBytes("cccc");<a name="line.4562"></a>
+<span class="sourceLineNo">4563</span>    final byte [] value4 = Bytes.toBytes("dddd");<a name="line.4563"></a>
+<span class="sourceLineNo">4564</span><a name="line.4564"></a>
+<span class="sourceLineNo">4565</span>    Table table = TEST_UTIL.createTable(TableName.valueOf("testCheckAndPutWithCompareOp"), FAMILY);<a name="line.4565"></a>
+<span class="sourceLineNo">4566</span><a name="line.4566"></a>
+<span class="sourceLineNo">4567</span>    Put put2 = new Put(ROW);<a name="line.4567"></a>
+<span class="sourceLineNo">4568</span>    put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.4568"></a>
+<span class="sourceLineNo">4569</span><a name="line.4569"></a>
+<span class="sourceLineNo">4570</span>    Put put3 = new Put(ROW);<a name="line.4570"></a>
+<span class="sourceLineNo">4571</span>    put3.addColumn(FAMILY, QUALIFIER, value3);<a name="line.4571"></a>
+<span class="sourceLineNo">4572</span><a name="line.4572"></a>
+<span class="sourceLineNo">4573</span>    // row doesn't exist, so using "null" to check for existence should be considered "match".<a name="line.4573"></a>
+<span class="sourceLineNo">4574</span>    boolean ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, null, put2);<a name="line.4574"></a>
+<span class="sourceLineNo">4575</span>    assertEquals(ok, true);<a name="line.4575"></a>
+<span class="sourceLineNo">4576</span><a name="line.4576"></a>
+<span class="sourceLineNo">4577</span>    // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL<a name="line.4577"></a>
+<span class="sourceLineNo">4578</span>    // turns out "match"<a name="line.4578"></a>
+<span class="sourceLineNo">4579</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value1, put2);<a name="line.4579"></a>
+<span class="sourceLineNo">4580</span>    assertEquals(ok, false);<a name="line.4580"></a>
+<span class="sourceLineNo">4581</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value1, put2);<a name="line.4581"></a>
+<span class="sourceLineNo">4582</span>    assertEquals(ok, false);<a name="line.4582"></a>
+<span class="sourceLineNo">4583</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value1, put2);<a name="line.4583"></a>
+<span class="sourceLineNo">4584</span>    assertEquals(ok, false);<a name="line.4584"></a>
+<span class="sourceLineNo">4585</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value1, put2);<a name="line.4585"></a>
+<span class="sourceLineNo">4586</span>    assertEquals(ok, true);<a name="line.4586"></a>
+<span class="sourceLineNo">4587</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value1, put2);<a name="line.4587"></a>
+<span class="sourceLineNo">4588</span>    assertEquals(ok, true);<a name="line.4588"></a>
+<span class="sourceLineNo">4589</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value1, put3);<a name="line.4589"></a>
+<span class="sourceLineNo">4590</span>    assertEquals(ok, true);<a name="line.4590"></a>
+<span class="sourceLineNo">4591</span><a name="line.4591"></a>
+<span class="sourceLineNo">4592</span>    // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL<a name="line.4592"></a>
+<span class="sourceLineNo">4593</span>    // turns out "match"<a name="line.4593"></a>
+<span class="sourceLineNo">4594</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value4, put3);<a name="line.4594"></a>
+<span class="sourceLineNo">4595</span>    assertEquals(ok, false);<a name="line.4595"></a>
+<span class="sourceLineNo">4596</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value4, put3);<a name="line.4596"></a>
+<span class="sourceLineNo">4597</span>    assertEquals(ok, false);<a name="line.4597"></a>
+<span class="sourceLineNo">4598</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value4, put3);<a name="line.4598"></a>
+<span class="sourceLineNo">4599</span>    assertEquals(ok, false);<a name="line.4599"></a>
+<span class="sourceLineNo">4600</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value4, put3);<a name="line.4600"></a>
+<span class="sourceLineNo">4601</span>    assertEquals(ok, true);<a name="line.4601"></a>
+<span class="sourceLineNo">4602</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value4, put3);<a name="line.4602"></a>
+<span class="sourceLineNo">4603</span>    assertEquals(ok, true);<a name="line.4603"></a>
+<span class="sourceLineNo">4604</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value4, put2);<a name="line.4604"></a>
+<span class="sourceLineNo">4605</span>    assertEquals(ok, true);<a name="line.4605"></a>
+<span class="sourceLineNo">4606</span><a name="line.4606"></a>
+<span class="sourceLineNo">4607</span>    // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL<a name="line.4607"></a>
+<span class="sourceLineNo">4608</span>    // turns out "match"<a name="line.4608"></a>
+<span class="sourceLineNo">4609</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value2, put2);<a name="line.4609"></a>
+<span class="sourceLineNo">4610</span>    assertEquals(ok, false);<a name="line.4610"></a>
+<span class="sourceLineNo">4611</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value2, put2);<a name="line.4611"></a>
+<span class="sourceLineNo">4612</span>    assertEquals(ok, false);<a name="line.4612"></a>
+<span class="sourceLineNo">4613</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value2, put2);<a name="line.4613"></a>
+<span class="sourceLineNo">4614</span>    assertEquals(ok, false);<a name="line.4614"></a>
+<span class="sourceLineNo">4615</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value2, put2);<a name="line.4615"></a>
+<span class="sourceLineNo">4616</span>    assertEquals(ok, true);<a name="line.4616"></a>
+<span class="sourceLineNo">4617</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value2, put2);<a name="line.4617"></a>
+<span class="sourceLineNo">4618</span>    assertEquals(ok, true);<a name="line.4618"></a>
+<span class="sourceLineNo">4619</span>    ok = table.checkAndPut(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value2, put3);<a name="line.4619"></a>
+<span class="sourceLineNo">4620</span>    assertEquals(ok, true);<a name="line.4620"></a>
+<span class="sourceLineNo">4621</span>  }<a name="line.4621"></a>
+<span class="sourceLineNo">4622</span><a name="line.4622"></a>
+<span class="sourceLineNo">4623</span>  @Test<a name="line.4623"></a>
+<span class="sourceLineNo">4624</span>  public void testCheckAndDeleteWithCompareOp() throws IOException {<a name="line.4624"></a>
+<span class="sourceLineNo">4625</span>    final byte [] value1 = Bytes.toBytes("aaaa");<a name="line.4625"></a>
+<span class="sourceLineNo">4626</span>    final byte [] value2 = Bytes.toBytes("bbbb");<a name="line.4626"></a>
+<span class="sourceLineNo">4627</span>    final byte [] value3 = Bytes.toBytes("cccc");<a name="line.4627"></a>
+<span class="sourceLineNo">4628</span>    final byte [] value4 = Bytes.toBytes("dddd");<a name="line.4628"></a>
+<span class="sourceLineNo">4629</span><a name="line.4629"></a>
+<span class="sourceLineNo">4630</span>    Table table = TEST_UTIL.createTable(TableName.valueOf("testCheckAndDeleteWithCompareOp"),<a name="line.4630"></a>
+<span class="sourceLineNo">4631</span>        FAMILY);<a name="line.4631"></a>
+<span class="sourceLineNo">4632</span><a name="line.4632"></a>
+<span class="sourceLineNo">4633</span>    Put put2 = new Put(ROW);<a name="line.4633"></a>
+<span class="sourceLineNo">4634</span>    put2.addColumn(FAMILY, QUALIFIER, value2);<a name="line.4634"></a>
+<span class="sourceLineNo">4635</span>    table.put(put2);<a name="line.4635"></a>
+<span class="sourceLineNo">4636</span><a name="line.4636"></a>
+<span class="sourceLineNo">4637</span>    Put put3 = new Put(ROW);<a name="line.4637"></a>
+<span class="sourceLineNo">4638</span>    put3.addColumn(FAMILY, QUALIFIER, value3);<a name="line.4638"></a>
+<span class="sourceLineNo">4639</span><a name="line.4639"></a>
+<span class="sourceLineNo">4640</span>    Delete delete = new Delete(ROW);<a name="line.4640"></a>
+<span class="sourceLineNo">4641</span>    delete.addColumns(FAMILY, QUALIFIER);<a name="line.4641"></a>
 <span class="sourceLineNo">4642</span><a name="line.4642"></a>
-<span class="sourceLineNo">4643</span>    // Re-increment them<a name="line.4643"></a>
-<span class="sourceLineNo">4644</span>    inc = new Increment(ROWS[0]);<a name="line.4644"></a>
-<span class="sourceLineNo">4645</span>    for (int i=0;i&lt;QUALIFIERS.length;i++) {<a name="line.4645"></a>
-<span class="sourceLineNo">4646</span>      inc.addColumn(FAMILY, QUALIFIERS[i], i+1);<a name="line.4646"></a>
-<span class="sourceLineNo">4647</span>    }<a name="line.4647"></a>
-<span class="sourceLineNo">4648</span>    ht.increment(inc);<a name="line.4648"></a>
-<span class="sourceLineNo">4649</span>    // Verify<a name="line.4649"></a>
-<span class="sourceLineNo">4650</span>    r = ht.get(new Get(ROWS[0]));<a name="line.4650"></a>
-<span class="sourceLineNo">4651</span>    kvs = r.rawCells();<a name="line.4651"></a>
-<span class="sourceLineNo">4652</span>    assertEquals(QUALIFIERS.length, kvs.length);<a name="line.4652"></a>
-<span class="sourceLineNo">4653</span>    for (int i=0;i&lt;QUALIFIERS.length;i++) {<a name="line.4653"></a>
-<span class="sourceLineNo">4654</span>      assertIncrementKey(kvs[i], ROWS[0], FAMILY, QUALIFIERS[i], 2*(i+1));<a name="line.4654"></a>
-<span class="sourceLineNo">4655</span>    }<a name="line.4655"></a>
-<span class="sourceLineNo">4656</span>  }<a name="line.4656"></a>
-<span class="sourceLineNo">4657</span><a name="line.4657"></a>
-<span class="sourceLineNo">4658</span><a name="line.4658"></a>
-<span class="sourceLineNo">4659</span>  @Test<a name="line.4659"></a>
-<span class="sourceLineNo">4660</span>  public void testClientPoolRoundRobin() throws IOException {<a name="line.4660"></a>
-<span class="sourceLineNo">4661</span>    final TableName tableName = TableName.valueOf("testClientPoolRoundRobin");<a name="line.4661"></a>
-<span class="sourceLineNo">4662</span><a name="line.4662"></a>
-<span class="sourceLineNo">4663</span>    int poolSize = 3;<a name="line.4663"></a>
-<span class="sourceLineNo">4664</span>    int numVersions = poolSize * 2;<a name="line.4664"></a>
-<span class="sourceLineNo">4665</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.4665"></a>
-<span class="sourceLineNo">4666</span>    conf.set(HConstants.HBASE_CLIENT_IPC_POOL_TYPE, "round-robin");<a name="line.4666"></a>
-<span class="sourceLineNo">4667</span>    conf.setInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, poolSize);<a name="line.4667"></a>
-<span class="sourceLineNo">4668</span><a name="line.4668"></a>
-<span class="sourceLineNo">4669</span>    Table table = TEST_UTIL.createTable(tableName, new byte[][] { FAMILY }, Integer.MAX_VALUE);<a name="line.4669"></a>
-<span class="sourceLineNo">4670</span><a name="line.4670"></a>
-<span class="sourceLineNo">4671</span>    final long ts = EnvironmentEdgeManager.currentTime();<a name="line.4671"></a>
-<span class="sourceLineNo">4672</span>    Get get = new Get(ROW);<a name="line.4672"></a>
-<span class="sourceLineNo">4673</span>    get.addColumn(FAMILY, QUALIFIER);<a name="line.4673"></a>
-<span class="sourceLineNo">4674</span>    get.setMaxVersions();<a name="line.4674"></a>
-<span class="sourceLineNo">4675</span><a name="line.4675"></a>
-<span class="sourceLineNo">4676</span>    for (int versions = 1; versions &lt;= numVersions; versions++) {<a name="line.4676"></a>
-<span class="sourceLineNo">4677</span>      Put put = new Put(ROW);<a name="line.4677"></a>
-<span class="sourceLineNo">4678</span>      put.addColumn(FAMILY, QUALIFIER, ts + versions, VALUE);<a name="line.4678"></a>
-<span class="sourceLineNo">4679</span>      table.put(put);<a name="line.4679"></a>
-<span class="sourceLineNo">4680</span><a name="line.4680"></a>
-<span class="sourceLineNo">4681</span>      Result result = table.get(get);<a name="line.4681"></a>
-<span class="sourceLineNo">4682</span>      NavigableMap&lt;Long, byte[]&gt; navigableMap = result.getMap().get(FAMILY)<a name="line.4682"></a>
-<span class="sourceLineNo">4683</span>          .get(QUALIFIER);<a name="line.4683"></a>
-<span class="sourceLineNo">4684</span><a name="line.4684"></a>
-<span class="sourceLineNo">4685</span>      assertEquals("The number of versions of '" + FAMILY + ":" + QUALIFIER<a name="line.4685"></a>
-<span class="sourceLineNo">4686</span>          + " did not match " + versions, versions, navigableMap.size());<a name="line.4686"></a>
-<span class="sourceLineNo">4687</span>      for (Map.Entry&lt;Long, byte[]&gt; entry : navigableMap.entrySet()) {<a name="line.4687"></a>
-<span class="sourceLineNo">4688</span>        assertTrue("The value at time " + entry.getKey()<a name="line.4688"></a>
-<span class="sourceLineNo">4689</span>            + " did not match what was put",<a name="line.4689"></a>
-<span class="sourceLineNo">4690</span>            Bytes.equals(VALUE, entry.getValue()));<a name="line.4690"></a>
-<span class="sourceLineNo">4691</span>      }<a name="line.4691"></a>
-<span class="sourceLineNo">4692</span>    }<a name="line.4692"></a>
-<span class="sourceLineNo">4693</span>  }<a name="line.4693"></a>
-<span class="sourceLineNo">4694</span><a name="line.4694"></a>
-<span class="sourceLineNo">4695</span>  @Ignore ("Flakey: HBASE-8989") @Test<a name="line.4695"></a>
-<span class="sourceLineNo">4696</span>  public void testClientPoolThreadLocal() throws IOException {<a name="line.4696"></a>
-<span class="sourceLineNo">4697</span>    final TableName tableName = TableName.valueOf("testClientPoolThreadLocal");<a name="line.4697"></a>
-<span class="sourceLineNo">4698</span><a name="line.4698"></a>
-<span class="sourceLineNo">4699</span>    int poolSize = Integer.MAX_VALUE;<a name="line.4699"></a>
-<span class="sourceLineNo">4700</span>    int numVersions = 3;<a name="line.4700"></a>
-<span class="sourceLineNo">4701</span>    Configuration conf = TEST_UTIL.getConfiguration();<a name="line.4701"></a>
-<span class="sourceLineNo">4702</span>    conf.set(HConstants.HBASE_CLIENT_IPC_POOL_TYPE, "thread-local");<a name="line.4702"></a>
-<span class="sourceLineNo">4703</span>    conf.setInt(HConstants.HBASE_CLIENT_IPC_POOL_SIZE, poolSize);<a name="line.4703"></a>
-<span class="sourceLineNo">4704</span><a name="line.4704"></a>
-<span class="sourceLineNo">4705</span>    final Table table = TEST_UTIL.createTable(tableName, new byte[][] { FAMILY },  3);<a name="line.4705"></a>
-<span class="sourceLineNo">4706</span><a name="line.4706"></a>
-<span class="sourceLineNo">4707</span>    final long ts = EnvironmentEdgeManager.currentTime();<a name="line.4707"></a>
-<span class="sourceLineNo">4708</span>    final Get get = new Get(ROW);<a name="line.4708"></a>
-<span class="sourceLineNo">4709</span>    get.addColumn(FAMILY, QUALIFIER);<a name="line.4709"></a>
-<span class="sourceLineNo">4710</span>    get.setMaxVersions();<a name="line.4710"></a>
-<span class="sourceLineNo">4711</span><a name="line.4711"></a>
-<span class="sourceLineNo">4712</span>    for (int versions = 1; versions &lt;= numVersions; versions++) {<a name="line.4712"></a>
-<span class="sourceLineNo">4713</span>      Put put = new Put(ROW);<a name="line.4713"></a>
-<span class="sourceLineNo">4714</span>      put.addColumn(FAMILY, QUALIFIER, ts + versions, VALUE);<a name="line.4714"></a>
-<span class="sourceLineNo">4715</span>      table.put(put);<a name="line.4715"></a>
-<span class="sourceLineNo">4716</span><a name="line.4716"></a>
-<span class="sourceLineNo">4717</span>      Result result = table.get(get);<a name="line.4717"></a>
-<span class="sourceLineNo">4718</span>      NavigableMap&lt;Long, byte[]&gt; navigableMap = result.getMap().get(FAMILY)<a name="line.4718"></a>
-<span class="sourceLineNo">4719</span>          .get(QUALIFIER);<a name="line.4719"></a>
-<span class="sourceLineNo">4720</span><a name="line.4720"></a>
-<span class="sourceLineNo">4721</span>      assertEquals("The number of versions of '" + FAMILY + ":" + QUALIFIER + " did not match " +<a name="line.4721"></a>
-<span class="sourceLineNo">4722</span>        versions + "; " + put.toString() + ", " + get.toString(), versions, navigableMap.size());<a name="line.4722"></a>
-<span class="sourceLineNo">4723</span>      for (Map.Entry&lt;Long, byte[]&gt; entry : navigableMap.entrySet()) {<a name="line.4723"></a>
-<span class="sourceLineNo">4724</span>        assertTrue("The value at time " + entry.getKey()<a name="line.4724"></a>
-<span class="sourceLineNo">4725</span>            + " did not match what was put",<a name="line.4725"></a>
-<span class="sourceLineNo">4726</span>            Bytes.equals(VALUE, entry.getValue()));<a name="line.4726"></a>
-<span class="sourceLineNo">4727</span>      }<a name="line.4727"></a>
+<span class="sourceLineNo">4643</span>    // cell = "bbbb", using "aaaa" to compare only LESS/LESS_OR_EQUAL/NOT_EQUAL<a name="line.4643"></a>
+<span class="sourceLineNo">4644</span>    // turns out "match"<a name="line.4644"></a>
+<span class="sourceLineNo">4645</span>    boolean ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value1, delete);<a name="line.4645"></a>
+<span class="sourceLineNo">4646</span>    assertEquals(ok, false);<a name="line.4646"></a>
+<span class="sourceLineNo">4647</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value1, delete);<a name="line.4647"></a>
+<span class="sourceLineNo">4648</span>    assertEquals(ok, false);<a name="line.4648"></a>
+<span class="sourceLineNo">4649</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value1, delete);<a name="line.4649"></a>
+<span class="sourceLineNo">4650</span>    assertEquals(ok, false);<a name="line.4650"></a>
+<span class="sourceLineNo">4651</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value1, delete);<a name="line.4651"></a>
+<span class="sourceLineNo">4652</span>    assertEquals(ok, true);<a name="line.4652"></a>
+<span class="sourceLineNo">4653</span>    table.put(put2);<a name="line.4653"></a>
+<span class="sourceLineNo">4654</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value1, delete);<a name="line.4654"></a>
+<span class="sourceLineNo">4655</span>    assertEquals(ok, true);<a name="line.4655"></a>
+<span class="sourceLineNo">4656</span>    table.put(put2);<a name="line.4656"></a>
+<span class="sourceLineNo">4657</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value1, delete);<a name="line.4657"></a>
+<span class="sourceLineNo">4658</span>    assertEquals(ok, true);<a name="line.4658"></a>
+<span class="sourceLineNo">4659</span><a name="line.4659"></a>
+<span class="sourceLineNo">4660</span>    // cell = "cccc", using "dddd" to compare only LARGER/LARGER_OR_EQUAL/NOT_EQUAL<a name="line.4660"></a>
+<span class="sourceLineNo">4661</span>    // turns out "match"<a name="line.4661"></a>
+<span class="sourceLineNo">4662</span>    table.put(put3);<a name="line.4662"></a>
+<span class="sourceLineNo">4663</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value4, delete);<a name="line.4663"></a>
+<span class="sourceLineNo">4664</span>    assertEquals(ok, false);<a name="line.4664"></a>
+<span class="sourceLineNo">4665</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value4, delete);<a name="line.4665"></a>
+<span class="sourceLineNo">4666</span>    assertEquals(ok, false);<a name="line.4666"></a>
+<span class="sourceLineNo">4667</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value4, delete);<a name="line.4667"></a>
+<span class="sourceLineNo">4668</span>    assertEquals(ok, false);<a name="line.4668"></a>
+<span class="sourceLineNo">4669</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value4, delete);<a name="line.4669"></a>
+<span class="sourceLineNo">4670</span>    assertEquals(ok, true);<a name="line.4670"></a>
+<span class="sourceLineNo">4671</span>    table.put(put3);<a name="line.4671"></a>
+<span class="sourceLineNo">4672</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value4, delete);<a name="line.4672"></a>
+<span class="sourceLineNo">4673</span>    assertEquals(ok, true);<a name="line.4673"></a>
+<span class="sourceLineNo">4674</span>    table.put(put3);<a name="line.4674"></a>
+<span class="sourceLineNo">4675</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value4, delete);<a name="line.4675"></a>
+<span class="sourceLineNo">4676</span>    assertEquals(ok, true);<a name="line.4676"></a>
+<span class="sourceLineNo">4677</span><a name="line.4677"></a>
+<span class="sourceLineNo">4678</span>    // cell = "bbbb", using "bbbb" to compare only GREATER_OR_EQUAL/LESS_OR_EQUAL/EQUAL<a name="line.4678"></a>
+<span class="sourceLineNo">4679</span>    // turns out "match"<a name="line.4679"></a>
+<span class="sourceLineNo">4680</span>    table.put(put2);<a name="line.4680"></a>
+<span class="sourceLineNo">4681</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER, value2, delete);<a name="line.4681"></a>
+<span class="sourceLineNo">4682</span>    assertEquals(ok, false);<a name="line.4682"></a>
+<span class="sourceLineNo">4683</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.NOT_EQUAL, value2, delete);<a name="line.4683"></a>
+<span class="sourceLineNo">4684</span>    assertEquals(ok, false);<a name="line.4684"></a>
+<span class="sourceLineNo">4685</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS, value2, delete);<a name="line.4685"></a>
+<span class="sourceLineNo">4686</span>    assertEquals(ok, false);<a name="line.4686"></a>
+<span class="sourceLineNo">4687</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.GREATER_OR_EQUAL, value2, delete);<a name="line.4687"></a>
+<span class="sourceLineNo">4688</span>    assertEquals(ok, true);<a name="line.4688"></a>
+<span class="sourceLineNo">4689</span>    table.put(put2);<a name="line.4689"></a>
+<span class="sourceLineNo">4690</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.LESS_OR_EQUAL, value2, delete);<a name="line.4690"></a>
+<span class="sourceLineNo">4691</span>    assertEquals(ok, true);<a name="line.4691"></a>
+<span class="sourceLineNo">4692</span>    table.put(put2);<a name="line.4692"></a>
+<span class="sourceLineNo">4693</span>    ok = table.checkAndDelete(ROW, FAMILY, QUALIFIER, CompareOp.EQUAL, value2, delete);<a name="line.4693"></a>
+<span class="sourceLineNo">4694</span>    assertEquals(ok, true);<a name="line.4694"></a>
+<span class="sourceLineNo">4695</span>  }<a name="line.4695"></a>
+<span class="sourceLineNo">4696</span><a name="line.4696"></a>
+<span class="sourceLineNo">4697</span>  /**<a name="line.4697"></a>
+<span class="sourceLineNo">4698</span>  * Test ScanMetrics<a name="line.4698"></a>
+<span class="sourceLineNo">4699</span>  * @throws Exception<a name="line.4699"></a>
+<span class="sourceLineNo">4700</span>  */<a name="line.4700"></a>
+<span class="sourceLineNo">4701</span>  @Test<a name="line.4701"></a>
+<span class="sourceLineNo">4702</span>  @SuppressWarnings ("unused")<a name="line.4702"></a>
+<span class="sourceLineNo">4703</span>  public void testScanMetrics() throws Exception {<a name="line.4703"></a>
+<span class="sourceLineNo">4704</span>    TableName TABLENAME = TableName.valueOf("testScanMetrics");<a name="line.4704"></a>
+<span class="sourceLineNo">4705</span><a name="line.4705"></a>
+<span class="sourceLineNo">4706</span>    // Set up test table:<a name="line.4706"></a>
+<span class="sourceLineNo">4707</span>    // Create table:<a name="line.4707"></a>
+<span class="sourceLineNo">4708</span>    Table ht = TEST_UTIL.createMultiRegionTable(TABLENAME, FAMILY);<a name="line.4708"></a>
+<span class="sourceLineNo">4709</span>    int numOfRegions = -1;<a name="line.4709"></a>
+<span class="sourceLineNo">4710</span>    try (RegionLocator r = TEST_UTIL.getConnection().getRegionLocator(TABLENAME)) {<a name="line.4710"></a>
+<span class="sourceLineNo">4711</span>      numOfRegions = r.getStartKeys().length;<a name="line.4711"></a>
+<span class="sourceLineNo">4712</span>    }<a name="line.4712"></a>
+<span class="sourceLineNo">4713</span>    // Create 3 rows in the table, with rowkeys starting with "zzz*" so that<a name="line.4713"></a>
+<span class="sourceLineNo">4714</span>    // scan are forced to hit all the regions.<a name="line.4714"></a>
+<span class="sourceLineNo">4715</span>    Put put1 = new Put(Bytes.toBytes("zzz1"));<a name="line.4715"></a>
+<span class="sourceLineNo">4716</span>    put1.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.4716"></a>
+<span class="sourceLineNo">4717</span>    Put put2 = new Put(Bytes.toBytes("zzz2"));<a name="line.4717"></a>
+<span class="sourceLineNo">4718</span>    put2.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.4718"></a>
+<span class="sourceLineNo">4719</span>    Put put3 = new Put(Bytes.toBytes("zzz3"));<a name="line.4719"></a>
+<span class="sourceLineNo">4720</span>    put3.addColumn(FAMILY, QUALIFIER, VALUE);<a name="line.4720"></a>
+<span class="sourceLineNo">4721</span>    ht.put(Arrays.asList(put1, put2, put3));<a name="line.4721"></a>
+<span class="sourceLineNo">4722</span><a name="line.4722"></a>
+<span class="sourceLineNo">4723</span>    Scan scan1 = new Scan();<a name="line.4723"></a>
+<span class="sourceLineNo">4724</span>    int numRecords = 0;<a name="line.4724"></a>
+<span class="sourceLineNo">4725</span>    ResultScanner scanner = ht.getScanner(scan1);<a name="line.4725"></a>
+<span class="sourceLineNo">4726</span>    for(Result result : scanner) {<a name="line.4726"></a>
+<span class="sourceLineNo">4727</span>      numRecords++;<a name="line.4727"></a>
 <span class="sourceLineNo">4728</span>    }<a name="line.4728"></a>
-<span class="sourceLineNo">4729</span><a name="line.4729"></a>
-<span class="sourceLineNo">4730</span>    final Object waitLock = new Object();<a name="line.4730"></a>
-<span class="sourceLineNo">4731</span>    ExecutorService executorService = Executors.newFixedThreadPool(numVersions);<a name="line.4731"></a>
-<span class="sourceLineNo">4732</span>    final AtomicReference&lt;AssertionError&gt; error = new AtomicReference&lt;AssertionError&gt;(null);<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span>    for (int versions = numVersions; versions &lt; numVersions * 2; versions++) {<a name="line.4733"></a>
-<span class="sourceLineNo">4734</span>      final int versionsCopy = versions;<a name="line.4734"></a>
-<span class="sourceLineNo">4735</span>      executorService.submit(new Callable&lt;Void&gt;() {<a name="line.4735"></a>
-<span class="sourceLineNo">4736</span>        @Override<a name="line.4736"></a>
-<span class="sourceLineNo">4737</span>        public Void call() {<a name="line.4737"></a>
-<span class="sourceLineNo">4738</span>          try {<a name="line.4738"></a>
-<span class="sourceLineNo">4739</span>            Put put = new Put(ROW);<a name="line.4739"></a>
-<span class="sourceLineNo">4740</span>            put.addColumn(FAMILY, QUALIFIER, ts + versionsCopy, VALUE);<a name="line.4740"></a>
-<span class="sourceLineNo">4741</span>            table.put(put);<a name="line.4741"></a>
-<span class="sourceLineNo">4742</span><a name="line.4742"></a>
-<span class="sourceLineNo">4743</span>            Result result = table.get(get);<a name="line.4743"></a>
-<span class="sourceLineNo">4744</span>            NavigableMap&lt;Long, byte[]&gt; navigableMap = result.getMap()<a name="line.4744"></a>
-<span class="sourceLineNo">4745</span>                .get(FAMILY).get(QUALIFIER);<a name="line.4745"></a>
-<span class="sourceLineNo">4746</span><a name="line.4746"></a>
-<span class="sourceLineNo">4747</span>            assertEquals("The number of versions of '" + Bytes.toString(FAMILY) + ":"<a name="line.4747"></a>
-<span class="sourceLineNo">4748</span>                + Bytes.toString(QUALIFIER) + " did not match " + versionsCopy, versionsCopy,<a name="line.4748"></a>
-<span class="sourceLineNo">4749</span>                navigableMap.size());<a name="line.4749"></a>
-<span class="sourceLineNo">4750</span>            for (Map.Entry&lt;Long, byte[]&gt; entry : navigableMap.entrySet()) {<a name="line.4750"></a>
-<span class="sourceLineNo">4751</span>              assertTrue("The value at time " + entry.getKey()<a name="line.4751"></a>
-<span class="sourceLineNo">4752</span>                  + " did not match what was put",<a name="line.4752"></a>
-<span class="sourceLineNo">4753</span>                  Bytes.equals(VALUE, entry.getValue()));<a name="line.4753"></a>
-<span class="sourceLineNo">4754</span>            }<a name="line.4754"></a>
-<span class="sourceLineNo">4755</span>            synchronized (waitLock) {<a name="line.4755"></a>
-<span class="sourceLineNo">4756</span>              waitLock.wait();<a name="line.4756"></a>
-<span class="sourceLineNo">4757</span>            }<a name="line.4757"></a>
-<span class="sourceLineNo">4758</span>          } catch (Exception e) {<a name="line.4758"></a>
-<span class="sourceLineNo">4759</span>          } catch (AssertionError e) {<a name="line.4759"></a>
-<span class="sourceLineNo">4760</span>            // the error happens in a thread, it won't fail the test,<a name="line.4760"></a>
-<span class="sourceLineNo">4761</span>            // need to pass it to the caller for proper handling.<a name="line.4761"></a>
-<span class="sourceLineNo">4762</span>            error.set(e);<a name="line.4762"></a>
-<span class="sourceLineNo">4763</span>            LOG.error(e);<a name="line.4763"></a>
-<span class="sourceLineNo">4764</span>          }<a name="line.4764"></a>
-<span class="sourceLineNo">4765</span><a name="line.4765"></a>
-<span class="sourceLineNo">4766</span>          return null;<a name="line.4766"></a>
-<span class="sourceLineNo">4767</span>        }<a name="line.4767"></a>
-<span class="sourceLineNo">4768</span>      });<a name="line.4768"></a>
-<span class="sourceLineNo">4769</span>    }<a name="line.4769"></a>
-<span class="sourceLineNo">4770</span>    synchronized (waitLock) {<a name="line.4770"></a>
-<span class="sourceLineNo">4771</span>      waitLock.notifyAll()

<TRUNCATED>