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 && right == null) return true;<a name="line.3274"></a>
<span class="sourceLineNo">3275</span> if (left == null && right.length == 0) return true;<a name="line.3275"></a>
<span class="sourceLineNo">3276</span> if (right == null && 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 <= 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<Long, byte[]> 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<Long, byte[]> 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<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 <= 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<Long, byte[]> 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<Long, byte[]> 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<AssertionError> error = new AtomicReference<AssertionError>(null);<a name="line.4474"></a>
+<span class="sourceLineNo">4475</span> for (int versions = numVersions; versions < 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<Void>() {<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<Long, byte[]> 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<Long, byte[]> 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<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 < 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 < 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<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<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<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<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 <= 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<Long, byte[]> 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<Long, byte[]> 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 <= 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<Long, byte[]> 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<Long, byte[]> 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<AssertionError> error = new AtomicReference<AssertionError>(null);<a name="line.4732"></a>
-<span class="sourceLineNo">4733</span> for (int versions = numVersions; versions < 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<Void>() {<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<Long, byte[]> 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<Long, byte[]> 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>