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

(hbase-site) branch asf-site updated: Published site at f4aafaf4d5092f761465a9f4d44234dc4919331d.

This is an automated email from the ASF dual-hosted git repository.

git-site-role pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/hbase-site.git


The following commit(s) were added to refs/heads/asf-site by this push:
     new 512a8da9d90 Published site at f4aafaf4d5092f761465a9f4d44234dc4919331d.
512a8da9d90 is described below

commit 512a8da9d903937a28efc92a843707ad24aece90
Author: jenkins <bu...@apache.org>
AuthorDate: Wed Oct 23 14:50:22 2024 +0000

    Published site at f4aafaf4d5092f761465a9f4d44234dc4919331d.
---
 acid-semantics.html                                |    2 +-
 apache_hbase_reference_guide.pdf                   |    4 +-
 apidocs/index-all.html                             |   36 +-
 apidocs/member-search-index.js                     |    2 +-
 .../hbase/PerformanceEvaluation.Counter.html       | 5531 ++++++++++----------
 .../PerformanceEvaluation.EvaluationMapTask.html   | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.RunResult.html     | 5531 ++++++++++----------
 .../apache/hadoop/hbase/PerformanceEvaluation.html | 5531 ++++++++++----------
 .../hadoop/hbase/util/LoadTestKVGenerator.html     |   31 +-
 .../org/apache/hadoop/hbase/util/LoadTestTool.html |    2 +-
 .../MultiThreadedAction.DefaultDataGenerator.html  |   16 +-
 .../hadoop/hbase/util/MultiThreadedAction.html     |   16 +-
 .../MultiThreadedReader.HBaseReaderThread.html     |    8 +-
 .../hadoop/hbase/util/MultiThreadedReader.html     |    8 +-
 ...adedReaderWithACL.HBaseReaderThreadWithACL.html |  120 +-
 .../hbase/util/MultiThreadedReaderWithACL.html     |  120 +-
 .../MultiThreadedUpdater.HBaseUpdaterThread.html   |    2 +-
 .../hadoop/hbase/util/MultiThreadedUpdater.html    |    2 +-
 ...edUpdaterWithACL.HBaseUpdaterThreadWithACL.html |  380 +-
 .../hbase/util/MultiThreadedUpdaterWithACL.html    |  380 +-
 .../hadoop/hbase/wal/WALPerformanceEvaluation.html |    6 +-
 book.html                                          |    2 +-
 bulk-loads.html                                    |    2 +-
 checkstyle-aggregate.html                          |  416 +-
 checkstyle.rss                                     |  698 +--
 coc.html                                           |    2 +-
 dependencies.html                                  |    2 +-
 dependency-convergence.html                        |    2 +-
 dependency-info.html                               |    2 +-
 dependency-management.html                         |    2 +-
 devapidocs/constant-values.html                    |  291 +-
 devapidocs/index-all.html                          |    6 +-
 devapidocs/member-search-index.js                  |    2 +-
 .../hbase/PerformanceEvaluation.AppendTest.html    |    6 +-
 .../PerformanceEvaluation.AsyncRandomReadTest.html |   18 +-
 ...PerformanceEvaluation.AsyncRandomWriteTest.html |    6 +-
 .../hbase/PerformanceEvaluation.AsyncScanTest.html |   14 +-
 ...formanceEvaluation.AsyncSequentialReadTest.html |    6 +-
 ...ormanceEvaluation.AsyncSequentialWriteTest.html |   10 +-
 .../PerformanceEvaluation.AsyncTableTest.html      |   10 +-
 .../hbase/PerformanceEvaluation.AsyncTest.html     |    6 +-
 .../PerformanceEvaluation.BufferedMutatorTest.html |   12 +-
 .../hbase/PerformanceEvaluation.CASTableTest.html  |   12 +-
 .../PerformanceEvaluation.CheckAndDeleteTest.html  |    6 +-
 .../PerformanceEvaluation.CheckAndMutateTest.html  |    6 +-
 .../PerformanceEvaluation.CheckAndPutTest.html     |    6 +-
 .../hbase/PerformanceEvaluation.CleanMetaTest.html |    6 +-
 .../hbase/PerformanceEvaluation.CmdDescriptor.html |   16 +-
 .../PerformanceEvaluation.EvaluationMapTask.html   |   16 +-
 .../PerformanceEvaluation.FilteredScanTest.html    |   10 +-
 .../hbase/PerformanceEvaluation.IncrementTest.html |    6 +-
 .../PerformanceEvaluation.MetaRandomReadTest.html  |   14 +-
 .../hbase/PerformanceEvaluation.MetaTest.html      |   10 +-
 .../hbase/PerformanceEvaluation.MetaWriteTest.html |    6 +-
 .../PerformanceEvaluation.RandomDeleteTest.html    |    6 +-
 .../PerformanceEvaluation.RandomReadTest.html      |   14 +-
 ...nceEvaluation.RandomScanWithRange10000Test.html |    6 +-
 ...anceEvaluation.RandomScanWithRange1000Test.html |    6 +-
 ...manceEvaluation.RandomScanWithRange100Test.html |    6 +-
 ...rmanceEvaluation.RandomScanWithRange10Test.html |    6 +-
 ...formanceEvaluation.RandomScanWithRangeTest.html |   12 +-
 .../PerformanceEvaluation.RandomSeekScanTest.html  |    8 +-
 .../PerformanceEvaluation.RandomWriteTest.html     |    6 +-
 .../PerformanceEvaluation.ReverseScanTest.html     |   10 +-
 .../hbase/PerformanceEvaluation.RunResult.html     |   28 +-
 .../hbase/PerformanceEvaluation.ScanTest.html      |   10 +-
 ...PerformanceEvaluation.SequentialDeleteTest.html |    8 +-
 .../PerformanceEvaluation.SequentialReadTest.html  |    6 +-
 .../PerformanceEvaluation.SequentialWriteTest.html |   10 +-
 .../hadoop/hbase/PerformanceEvaluation.Status.html |    4 +-
 .../hbase/PerformanceEvaluation.TableTest.html     |   10 +-
 .../hadoop/hbase/PerformanceEvaluation.Test.html   |    6 +-
 .../hbase/PerformanceEvaluation.TestBase.html      |   88 +-
 .../hbase/PerformanceEvaluation.TestOptions.html   |  276 +-
 .../apache/hadoop/hbase/PerformanceEvaluation.html |   64 +-
 .../hadoop/hbase/client/class-use/Table.html       |   11 +-
 .../org/apache/hadoop/hbase/util/LoadTestTool.html |   12 +-
 ...adedReaderWithACL.HBaseReaderThreadWithACL.html |    2 +-
 ...aseUpdaterThreadWithACL.MutateAccessAction.html |   36 +-
 ...edUpdaterWithACL.HBaseUpdaterThreadWithACL.html |   26 +-
 .../hbase/PerformanceEvaluation.AppendTest.html    | 5531 ++++++++++----------
 .../PerformanceEvaluation.AsyncRandomReadTest.html | 5531 ++++++++++----------
 ...PerformanceEvaluation.AsyncRandomWriteTest.html | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.AsyncScanTest.html | 5531 ++++++++++----------
 ...formanceEvaluation.AsyncSequentialReadTest.html | 5531 ++++++++++----------
 ...ormanceEvaluation.AsyncSequentialWriteTest.html | 5531 ++++++++++----------
 .../PerformanceEvaluation.AsyncTableTest.html      | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.AsyncTest.html     | 5531 ++++++++++----------
 .../PerformanceEvaluation.BufferedMutatorTest.html | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.CASTableTest.html  | 5531 ++++++++++----------
 .../PerformanceEvaluation.CheckAndDeleteTest.html  | 5531 ++++++++++----------
 .../PerformanceEvaluation.CheckAndMutateTest.html  | 5531 ++++++++++----------
 .../PerformanceEvaluation.CheckAndPutTest.html     | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.CleanMetaTest.html | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.CmdDescriptor.html | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.Counter.html       | 5531 ++++++++++----------
 .../PerformanceEvaluation.EvaluationMapTask.html   | 5531 ++++++++++----------
 .../PerformanceEvaluation.FilteredScanTest.html    | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.IncrementTest.html | 5531 ++++++++++----------
 .../PerformanceEvaluation.MetaRandomReadTest.html  | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.MetaTest.html      | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.MetaWriteTest.html | 5531 ++++++++++----------
 .../PerformanceEvaluation.RandomDeleteTest.html    | 5531 ++++++++++----------
 .../PerformanceEvaluation.RandomReadTest.html      | 5531 ++++++++++----------
 ...nceEvaluation.RandomScanWithRange10000Test.html | 5531 ++++++++++----------
 ...anceEvaluation.RandomScanWithRange1000Test.html | 5531 ++++++++++----------
 ...manceEvaluation.RandomScanWithRange100Test.html | 5531 ++++++++++----------
 ...rmanceEvaluation.RandomScanWithRange10Test.html | 5531 ++++++++++----------
 ...formanceEvaluation.RandomScanWithRangeTest.html | 5531 ++++++++++----------
 .../PerformanceEvaluation.RandomSeekScanTest.html  | 5531 ++++++++++----------
 .../PerformanceEvaluation.RandomWriteTest.html     | 5531 ++++++++++----------
 .../PerformanceEvaluation.ReverseScanTest.html     | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.RunResult.html     | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.ScanTest.html      | 5531 ++++++++++----------
 ...PerformanceEvaluation.SequentialDeleteTest.html | 5531 ++++++++++----------
 .../PerformanceEvaluation.SequentialReadTest.html  | 5531 ++++++++++----------
 .../PerformanceEvaluation.SequentialWriteTest.html | 5531 ++++++++++----------
 .../hadoop/hbase/PerformanceEvaluation.Status.html | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.TableTest.html     | 5531 ++++++++++----------
 .../hadoop/hbase/PerformanceEvaluation.Test.html   | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.TestBase.html      | 5531 ++++++++++----------
 .../hbase/PerformanceEvaluation.TestOptions.html   | 5531 ++++++++++----------
 .../apache/hadoop/hbase/PerformanceEvaluation.html | 5531 ++++++++++----------
 .../hadoop/hbase/util/LoadTestKVGenerator.html     |   31 +-
 .../hbase/util/LoadTestTool.WorkerThread.html      |    2 +-
 .../org/apache/hadoop/hbase/util/LoadTestTool.html |    2 +-
 .../MultiThreadedAction.DefaultDataGenerator.html  |   16 +-
 .../util/MultiThreadedAction.ProgressReporter.html |   16 +-
 .../hadoop/hbase/util/MultiThreadedAction.html     |   16 +-
 .../MultiThreadedReader.HBaseReaderThread.html     |    8 +-
 .../hadoop/hbase/util/MultiThreadedReader.html     |    8 +-
 ...adedReaderWithACL.HBaseReaderThreadWithACL.html |  120 +-
 .../hbase/util/MultiThreadedReaderWithACL.html     |  120 +-
 .../MultiThreadedUpdater.HBaseUpdaterThread.html   |    2 +-
 .../hadoop/hbase/util/MultiThreadedUpdater.html    |    2 +-
 ...aseUpdaterThreadWithACL.MutateAccessAction.html |  380 +-
 ...edUpdaterWithACL.HBaseUpdaterThreadWithACL.html |  380 +-
 .../hbase/util/MultiThreadedUpdaterWithACL.html    |  380 +-
 .../WALPerformanceEvaluation.WALPutBenchmark.html  |    6 +-
 .../hadoop/hbase/wal/WALPerformanceEvaluation.html |    6 +-
 downloads.html                                     |    2 +-
 export_control.html                                |    2 +-
 index.html                                         |    2 +-
 issue-management.html                              |    2 +-
 licenses.html                                      |    2 +-
 mailing-lists.html                                 |    2 +-
 metrics.html                                       |    2 +-
 old_news.html                                      |    2 +-
 plugin-management.html                             |    2 +-
 plugins.html                                       |    2 +-
 poweredbyhbase.html                                |    2 +-
 project-info.html                                  |    2 +-
 project-reports.html                               |    2 +-
 pseudo-distributed.html                            |    2 +-
 replication.html                                   |    2 +-
 resources.html                                     |    2 +-
 scm.html                                           |    2 +-
 sponsors.html                                      |    2 +-
 summary.html                                       |    2 +-
 supportingprojects.html                            |    2 +-
 team.html                                          |    2 +-
 testapidocs/index-all.html                         |   92 +-
 testapidocs/member-search-index.js                 |    2 +-
 testdevapidocs/index-all.html                      |    2 +-
 testdevapidocs/member-search-index.js              |    2 +-
 165 files changed, 132922 insertions(+), 132111 deletions(-)

diff --git a/acid-semantics.html b/acid-semantics.html
index e6f23b839b9..a13211213ac 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -468,7 +468,7 @@
         All other marks mentioned may be trademarks or registered trademarks of their respective owners.
       </div>
       <div style="float: right">
-        Last Published: 2024-10-22
+        Last Published: 2024-10-23
       </div>
         </div>
         <p id="poweredBy" class="pull-right"><a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index d2eeab81d8a..31541a8b4a6 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 2.0.6, based on Prawn 2.4.0)
 /Producer (Apache HBase Team)
-/ModDate (D:20241022142955+00'00')
-/CreationDate (D:20241022144319+00'00')
+/ModDate (D:20241023143158+00'00')
+/CreationDate (D:20241023144713+00'00')
 >>
 endobj
 2 0 obj
diff --git a/apidocs/index-all.html b/apidocs/index-all.html
index d0d4a4de436..7c867d6af57 100644
--- a/apidocs/index-all.html
+++ b/apidocs/index-all.html
@@ -1486,9 +1486,9 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>affixShutdownHook(Thread, int) - Static method in class org.apache.hadoop.hbase.util.ShutdownHookManager</dt>
 <dd>&nbsp;</dd>
-<dt>afterDecodingKeyValue(DataInputStream, ByteBuffer, HFileBlockDefaultDecodingContext) - Method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>afterDecodingKeyValue(DataInputStream, ByteBuffer, HFileBlockDefaultDecodingContext) - Method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
-<dt>afterEncodingKeyValue(ExtendedCell, DataOutputStream, HFileBlockDefaultEncodingContext) - Method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>afterEncodingKeyValue(ExtendedCell, DataOutputStream, HFileBlockDefaultEncodingContext) - Method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>
 <div class="block">Returns unencoded size added</div>
 </dd>
@@ -8501,11 +8501,11 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Compares the family and qualifier part of the cell</div>
 </dd>
-<dt>compareCommonFamilyPrefix(Cell, Cell, int) - Static method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>compareCommonFamilyPrefix(Cell, Cell, int) - Static method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
-<dt>compareCommonQualifierPrefix(Cell, Cell, int) - Static method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>compareCommonQualifierPrefix(Cell, Cell, int) - Static method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
-<dt>compareCommonRowPrefix(Cell, Cell, int) - Static method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>compareCommonRowPrefix(Cell, Cell, int) - Static method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>
 <div class="block">common prefixes</div>
 </dd>
@@ -9188,7 +9188,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>conf - Variable in class org.apache.hadoop.hbase.regionserver.StoreFileReader</dt>
 <dd>&nbsp;</dd>
-<dt>conf - Variable in class org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher</dt>
+<dt>conf - Variable in class org.apache.hadoop.hbase.regionserver.StripeStoreFlusher</dt>
 <dd>&nbsp;</dd>
 <dt>conf - Variable in class org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL</dt>
 <dd>
@@ -11854,7 +11854,7 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Create a new Scan with a cursor.</div>
 </dd>
-<dt>createScanner(List&lt;KeyValueScanner&gt;, FlushLifeCycleTracker) - Method in class org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher</dt>
+<dt>createScanner(List&lt;KeyValueScanner&gt;, FlushLifeCycleTracker) - Method in class org.apache.hadoop.hbase.regionserver.StripeStoreFlusher</dt>
 <dd>
 <div class="block">Creates the scanner for flushing snapshot.</div>
 </dd>
@@ -12388,7 +12388,7 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Create a writer for writing new store files.</div>
 </dd>
-<dt>createWriter(MemStoreSnapshot, boolean, Consumer&lt;Path&gt;) - Method in class org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher</dt>
+<dt>createWriter(MemStoreSnapshot, boolean, Consumer&lt;Path&gt;) - Method in class org.apache.hadoop.hbase.regionserver.StripeStoreFlusher</dt>
 <dd>&nbsp;</dd>
 <dt>createWriterInstance(FileSystem, Path) - Method in class org.apache.hadoop.hbase.regionserver.wal.AbstractFSWAL</dt>
 <dd>&nbsp;</dd>
@@ -12980,7 +12980,7 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Decode an <code>int8</code> value.</div>
 </dd>
-<dt>decodeKeyValues(DataInputStream, HFileBlockDecodingContext) - Method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>decodeKeyValues(DataInputStream, HFileBlockDecodingContext) - Method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
 <dt>decodeKeyValues(DataInputStream, HFileBlockDecodingContext) - Method in interface org.apache.hadoop.hbase.io.encoding.DataBlockEncoder</dt>
 <dd>
@@ -15808,7 +15808,7 @@ loadScripts(document, 'script');</script>
 <dd>
 <div class="block">Separator used to demarcate the encodedName in a region name in the new format.</div>
 </dd>
-<dt>encode(ExtendedCell, HFileBlockEncodingContext, DataOutputStream) - Method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>encode(ExtendedCell, HFileBlockEncodingContext, DataOutputStream) - Method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
 <dt>encode(ExtendedCell, HFileBlockEncodingContext, DataOutputStream) - Method in interface org.apache.hadoop.hbase.io.encoding.DataBlockEncoder</dt>
 <dd>
@@ -16222,7 +16222,7 @@ loadScripts(document, 'script');</script>
 </dd>
 <dt>END_TIME_KEY - Static variable in class org.apache.hadoop.hbase.mapreduce.WALInputFormat</dt>
 <dd>&nbsp;</dd>
-<dt>endBlockEncoding(HFileBlockEncodingContext, DataOutputStream, byte[]) - Method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>endBlockEncoding(HFileBlockEncodingContext, DataOutputStream, byte[]) - Method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
 <dt>endBlockEncoding(HFileBlockEncodingContext, DataOutputStream, byte[]) - Method in interface org.apache.hadoop.hbase.io.encoding.DataBlockEncoder</dt>
 <dd>
@@ -16333,7 +16333,7 @@ loadScripts(document, 'script');</script>
 <div class="deprecation-block"><span class="deprecated-label">Deprecated.</span></div>
 <div class="block">Make sure that at least the specified number of region servers are running</div>
 </dd>
-<dt>ensureSpace(ByteBuffer, int) - Static method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>ensureSpace(ByteBuffer, int) - Static method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>
 <div class="block">Asserts that there is at least the given amount of unfilled space remaining in the given
  buffer.</div>
@@ -16576,6 +16576,8 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>equals(Object) - Method in class org.apache.hadoop.hbase.nio.SingleByteBuff</dt>
 <dd>&nbsp;</dd>
+<dt>equals(Object) - Method in class org.apache.hadoop.hbase.PerformanceEvaluation.RunResult</dt>
+<dd>&nbsp;</dd>
 <dt>equals(Object) - Method in class org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot</dt>
 <dd>&nbsp;</dd>
 <dt>equals(Object) - Method in class org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot.SpaceQuotaStatus</dt>
@@ -18401,7 +18403,7 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>finalizeWriter(StoreFileWriter, long, MonitoredTask) - Method in class org.apache.hadoop.hbase.mob.DefaultMobStoreFlusher</dt>
 <dd>&nbsp;</dd>
-<dt>finalizeWriter(StoreFileWriter, long, MonitoredTask) - Method in class org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher</dt>
+<dt>finalizeWriter(StoreFileWriter, long, MonitoredTask) - Method in class org.apache.hadoop.hbase.regionserver.StripeStoreFlusher</dt>
 <dd>&nbsp;</dd>
 <dt>findArchivedLog(Path, Configuration) - Static method in class org.apache.hadoop.hbase.wal.AbstractFSWALProvider</dt>
 <dd>
@@ -35874,6 +35876,8 @@ loadScripts(document, 'script');</script>
 <dd>&nbsp;</dd>
 <dt>hashCode() - Method in class org.apache.hadoop.hbase.nio.SingleByteBuff</dt>
 <dd>&nbsp;</dd>
+<dt>hashCode() - Method in class org.apache.hadoop.hbase.PerformanceEvaluation.RunResult</dt>
+<dd>&nbsp;</dd>
 <dt>hashCode() - Method in class org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot</dt>
 <dd>&nbsp;</dd>
 <dt>hashCode() - Method in class org.apache.hadoop.hbase.quotas.SpaceQuotaSnapshot.SpaceQuotaStatus</dt>
@@ -51756,7 +51760,7 @@ service.</div>
 <dd>
 <div class="block">Performs compaction on a column family with the mob flag enabled.</div>
 </dd>
-<dt>performFlush(InternalScanner, CellSink, ThroughputController) - Method in class org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher</dt>
+<dt>performFlush(InternalScanner, CellSink, ThroughputController) - Method in class org.apache.hadoop.hbase.regionserver.StripeStoreFlusher</dt>
 <dd>
 <div class="block">Performs memstore flush, writing data from scanner into sink.</div>
 </dd>
@@ -67045,7 +67049,7 @@ service.</div>
 &nbsp;</dd>
 <dt>START_TIME_KEY - Static variable in class org.apache.hadoop.hbase.mapreduce.WALInputFormat</dt>
 <dd>&nbsp;</dd>
-<dt>startBlockEncoding(HFileBlockEncodingContext, DataOutputStream) - Method in class org.apache.hadoop.hbase.io.encoding.PrefixKeyDeltaEncoder</dt>
+<dt>startBlockEncoding(HFileBlockEncodingContext, DataOutputStream) - Method in class org.apache.hadoop.hbase.io.encoding.DiffKeyDeltaEncoder</dt>
 <dd>&nbsp;</dd>
 <dt>startBlockEncoding(HFileBlockEncodingContext, DataOutputStream) - Method in class org.apache.hadoop.hbase.io.encoding.CopyKeyDataBlockEncoder</dt>
 <dd>&nbsp;</dd>
@@ -67939,7 +67943,7 @@ service.</div>
 </dd>
 <dt>store - Variable in class org.apache.hadoop.hbase.io.crypto.KeyStoreKeyProvider</dt>
 <dd>&nbsp;</dd>
-<dt>store - Variable in class org.apache.hadoop.hbase.regionserver.DefaultStoreFlusher</dt>
+<dt>store - Variable in class org.apache.hadoop.hbase.regionserver.StripeStoreFlusher</dt>
 <dd>&nbsp;</dd>
 <dt>store - Variable in class org.apache.hadoop.hbase.regionserver.StoreScanner</dt>
 <dd>&nbsp;</dd>
diff --git a/apidocs/member-search-index.js b/apidocs/member-search-index.js
index cbd1536dfe2..6caa0cf12da 100644
--- a/apidocs/member-search-index.js
+++ b/apidocs/member-search-index.js
@@ -1 +1 @@
-memberSearchIndex = [{"p":"org.apache.hadoop.hbase.filter","c":"ParseConstants","l":"A"},{"p":"org.apache.hadoop.hbase.master","c":"RegionState.State","l":"ABNORMALLY_CLOSED"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"CoprocessorHost","l":"ABORT_ON_ERROR_KEY"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String)","u":"abort(java.lang.String)"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String, Throwable)","u":"abort(java.lang.String,java.lang.Throwable)" [...]
\ No newline at end of file
+memberSearchIndex = [{"p":"org.apache.hadoop.hbase.filter","c":"ParseConstants","l":"A"},{"p":"org.apache.hadoop.hbase.master","c":"RegionState.State","l":"ABNORMALLY_CLOSED"},{"p":"org.apache.hadoop.hbase.coprocessor","c":"CoprocessorHost","l":"ABORT_ON_ERROR_KEY"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String)","u":"abort(java.lang.String)"},{"p":"org.apache.hadoop.hbase","c":"Abortable","l":"abort(String, Throwable)","u":"abort(java.lang.String,java.lang.Throwable)" [...]
\ No newline at end of file
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html b/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
index 500342251a6..a30f5aa61a8 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -262,2991 +262,3008 @@
 <span class="source-line-no">249</span><span id="line-249">    public int compareTo(RunResult o) {</span>
 <span class="source-line-no">250</span><span id="line-250">      return Long.compare(this.duration, o.duration);</span>
 <span class="source-line-no">251</span><span id="line-251">    }</span>
-<span class="source-line-no">252</span><span id="line-252">  }</span>
-<span class="source-line-no">253</span><span id="line-253"></span>
-<span class="source-line-no">254</span><span id="line-254">  /**</span>
-<span class="source-line-no">255</span><span id="line-255">   * Constructor</span>
-<span class="source-line-no">256</span><span id="line-256">   * @param conf Configuration object</span>
-<span class="source-line-no">257</span><span id="line-257">   */</span>
-<span class="source-line-no">258</span><span id="line-258">  public PerformanceEvaluation(final Configuration conf) {</span>
-<span class="source-line-no">259</span><span id="line-259">    super(conf);</span>
-<span class="source-line-no">260</span><span id="line-260">  }</span>
-<span class="source-line-no">261</span><span id="line-261"></span>
-<span class="source-line-no">262</span><span id="line-262">  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name,</span>
-<span class="source-line-no">263</span><span id="line-263">    String description) {</span>
-<span class="source-line-no">264</span><span id="line-264">    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);</span>
-<span class="source-line-no">265</span><span id="line-265">    COMMANDS.put(name, cmdDescriptor);</span>
-<span class="source-line-no">266</span><span id="line-266">  }</span>
-<span class="source-line-no">267</span><span id="line-267"></span>
-<span class="source-line-no">268</span><span id="line-268">  /**</span>
-<span class="source-line-no">269</span><span id="line-269">   * Implementations can have their status set.</span>
-<span class="source-line-no">270</span><span id="line-270">   */</span>
-<span class="source-line-no">271</span><span id="line-271">  interface Status {</span>
-<span class="source-line-no">272</span><span id="line-272">    /**</span>
-<span class="source-line-no">273</span><span id="line-273">     * Sets status</span>
-<span class="source-line-no">274</span><span id="line-274">     * @param msg status message</span>
-<span class="source-line-no">275</span><span id="line-275">     */</span>
-<span class="source-line-no">276</span><span id="line-276">    void setStatus(final String msg) throws IOException;</span>
-<span class="source-line-no">277</span><span id="line-277">  }</span>
-<span class="source-line-no">278</span><span id="line-278"></span>
-<span class="source-line-no">279</span><span id="line-279">  /**</span>
-<span class="source-line-no">280</span><span id="line-280">   * MapReduce job that runs a performance evaluation client in each map task.</span>
-<span class="source-line-no">281</span><span id="line-281">   */</span>
-<span class="source-line-no">282</span><span id="line-282">  public static class EvaluationMapTask</span>
-<span class="source-line-no">283</span><span id="line-283">    extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {</span>
-<span class="source-line-no">284</span><span id="line-284"></span>
-<span class="source-line-no">285</span><span id="line-285">    /** configuration parameter name that contains the command */</span>
-<span class="source-line-no">286</span><span id="line-286">    public final static String CMD_KEY = "EvaluationMapTask.command";</span>
-<span class="source-line-no">287</span><span id="line-287">    /** configuration parameter name that contains the PE impl */</span>
-<span class="source-line-no">288</span><span id="line-288">    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";</span>
-<span class="source-line-no">289</span><span id="line-289"></span>
-<span class="source-line-no">290</span><span id="line-290">    private Class&lt;? extends Test&gt; cmd;</span>
-<span class="source-line-no">291</span><span id="line-291"></span>
-<span class="source-line-no">292</span><span id="line-292">    @Override</span>
-<span class="source-line-no">293</span><span id="line-293">    protected void setup(Context context) throws IOException, InterruptedException {</span>
-<span class="source-line-no">294</span><span id="line-294">      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);</span>
-<span class="source-line-no">295</span><span id="line-295"></span>
-<span class="source-line-no">296</span><span id="line-296">      // this is required so that extensions of PE are instantiated within the</span>
-<span class="source-line-no">297</span><span id="line-297">      // map reduce task...</span>
-<span class="source-line-no">298</span><span id="line-298">      Class&lt;? extends PerformanceEvaluation&gt; peClass =</span>
-<span class="source-line-no">299</span><span id="line-299">        forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);</span>
-<span class="source-line-no">300</span><span id="line-300">      try {</span>
-<span class="source-line-no">301</span><span id="line-301">        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());</span>
-<span class="source-line-no">302</span><span id="line-302">      } catch (Exception e) {</span>
-<span class="source-line-no">303</span><span id="line-303">        throw new IllegalStateException("Could not instantiate PE instance", e);</span>
-<span class="source-line-no">304</span><span id="line-304">      }</span>
-<span class="source-line-no">305</span><span id="line-305">    }</span>
-<span class="source-line-no">306</span><span id="line-306"></span>
-<span class="source-line-no">307</span><span id="line-307">    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {</span>
-<span class="source-line-no">308</span><span id="line-308">      try {</span>
-<span class="source-line-no">309</span><span id="line-309">        return Class.forName(className).asSubclass(type);</span>
-<span class="source-line-no">310</span><span id="line-310">      } catch (ClassNotFoundException e) {</span>
-<span class="source-line-no">311</span><span id="line-311">        throw new IllegalStateException("Could not find class for name: " + className, e);</span>
-<span class="source-line-no">312</span><span id="line-312">      }</span>
-<span class="source-line-no">313</span><span id="line-313">    }</span>
-<span class="source-line-no">314</span><span id="line-314"></span>
-<span class="source-line-no">315</span><span id="line-315">    @Override</span>
-<span class="source-line-no">316</span><span id="line-316">    protected void map(LongWritable key, Text value, final Context context)</span>
-<span class="source-line-no">317</span><span id="line-317">      throws IOException, InterruptedException {</span>
-<span class="source-line-no">318</span><span id="line-318"></span>
-<span class="source-line-no">319</span><span id="line-319">      Status status = new Status() {</span>
-<span class="source-line-no">320</span><span id="line-320">        @Override</span>
-<span class="source-line-no">321</span><span id="line-321">        public void setStatus(String msg) {</span>
-<span class="source-line-no">322</span><span id="line-322">          context.setStatus(msg);</span>
-<span class="source-line-no">323</span><span id="line-323">        }</span>
-<span class="source-line-no">324</span><span id="line-324">      };</span>
-<span class="source-line-no">325</span><span id="line-325"></span>
-<span class="source-line-no">326</span><span id="line-326">      TestOptions opts = GSON.fromJson(value.toString(), TestOptions.class);</span>
-<span class="source-line-no">327</span><span id="line-327">      Configuration conf = HBaseConfiguration.create(context.getConfiguration());</span>
-<span class="source-line-no">328</span><span id="line-328">      final Connection con = ConnectionFactory.createConnection(conf);</span>
-<span class="source-line-no">329</span><span id="line-329">      AsyncConnection asyncCon = null;</span>
-<span class="source-line-no">330</span><span id="line-330">      try {</span>
-<span class="source-line-no">331</span><span id="line-331">        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();</span>
-<span class="source-line-no">332</span><span id="line-332">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">333</span><span id="line-333">        throw new IOException(e);</span>
-<span class="source-line-no">334</span><span id="line-334">      }</span>
-<span class="source-line-no">335</span><span id="line-335"></span>
-<span class="source-line-no">336</span><span id="line-336">      // Evaluation task</span>
-<span class="source-line-no">337</span><span id="line-337">      RunResult result =</span>
-<span class="source-line-no">338</span><span id="line-338">        PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);</span>
-<span class="source-line-no">339</span><span id="line-339">      // Collect how much time the thing took. Report as map output and</span>
-<span class="source-line-no">340</span><span id="line-340">      // to the ELAPSED_TIME counter.</span>
-<span class="source-line-no">341</span><span id="line-341">      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);</span>
-<span class="source-line-no">342</span><span id="line-342">      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);</span>
-<span class="source-line-no">343</span><span id="line-343">      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));</span>
-<span class="source-line-no">344</span><span id="line-344">      context.progress();</span>
-<span class="source-line-no">345</span><span id="line-345">    }</span>
-<span class="source-line-no">346</span><span id="line-346">  }</span>
-<span class="source-line-no">347</span><span id="line-347"></span>
-<span class="source-line-no">348</span><span id="line-348">  /*</span>
-<span class="source-line-no">349</span><span id="line-349">   * If table does not already exist, create. Also create a table when {@code opts.presplitRegions}</span>
-<span class="source-line-no">350</span><span id="line-350">   * is specified or when the existing table's region replica count doesn't match {@code</span>
-<span class="source-line-no">351</span><span id="line-351">   * opts.replicas}.</span>
-<span class="source-line-no">352</span><span id="line-352">   */</span>
-<span class="source-line-no">353</span><span id="line-353">  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {</span>
-<span class="source-line-no">354</span><span id="line-354">    TableName tableName = TableName.valueOf(opts.tableName);</span>
-<span class="source-line-no">355</span><span id="line-355">    boolean needsDelete = false, exists = admin.tableExists(tableName);</span>
-<span class="source-line-no">356</span><span id="line-356">    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")</span>
-<span class="source-line-no">357</span><span id="line-357">      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");</span>
-<span class="source-line-no">358</span><span id="line-358">    boolean isDeleteCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("delete");</span>
-<span class="source-line-no">359</span><span id="line-359">    if (!exists &amp;&amp; (isReadCmd || isDeleteCmd)) {</span>
-<span class="source-line-no">360</span><span id="line-360">      throw new IllegalStateException(</span>
-<span class="source-line-no">361</span><span id="line-361">        "Must specify an existing table for read commands. Run a write command first.");</span>
-<span class="source-line-no">362</span><span id="line-362">    }</span>
-<span class="source-line-no">363</span><span id="line-363">    TableDescriptor desc = exists ? admin.getDescriptor(TableName.valueOf(opts.tableName)) : null;</span>
-<span class="source-line-no">364</span><span id="line-364">    byte[][] splits = getSplits(opts);</span>
-<span class="source-line-no">365</span><span id="line-365"></span>
-<span class="source-line-no">366</span><span id="line-366">    // recreate the table when user has requested presplit or when existing</span>
-<span class="source-line-no">367</span><span id="line-367">    // {RegionSplitPolicy,replica count} does not match requested, or when the</span>
-<span class="source-line-no">368</span><span id="line-368">    // number of column families does not match requested.</span>
-<span class="source-line-no">369</span><span id="line-369">    if (</span>
-<span class="source-line-no">370</span><span id="line-370">      (exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions</span>
-<span class="source-line-no">371</span><span id="line-371">        &amp;&amp; opts.presplitRegions != admin.getRegions(tableName).size())</span>
-<span class="source-line-no">372</span><span id="line-372">        || (!isReadCmd &amp;&amp; desc != null</span>
-<span class="source-line-no">373</span><span id="line-373">          &amp;&amp; !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))</span>
-<span class="source-line-no">374</span><span id="line-374">        || (!(isReadCmd || isDeleteCmd) &amp;&amp; desc != null</span>
-<span class="source-line-no">375</span><span id="line-375">          &amp;&amp; desc.getRegionReplication() != opts.replicas)</span>
-<span class="source-line-no">376</span><span id="line-376">        || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)</span>
-<span class="source-line-no">377</span><span id="line-377">    ) {</span>
-<span class="source-line-no">378</span><span id="line-378">      needsDelete = true;</span>
-<span class="source-line-no">379</span><span id="line-379">      // wait, why did it delete my table?!?</span>
-<span class="source-line-no">380</span><span id="line-380">      LOG.debug(MoreObjects.toStringHelper("needsDelete").add("needsDelete", needsDelete)</span>
-<span class="source-line-no">381</span><span id="line-381">        .add("isReadCmd", isReadCmd).add("exists", exists).add("desc", desc)</span>
-<span class="source-line-no">382</span><span id="line-382">        .add("presplit", opts.presplitRegions).add("splitPolicy", opts.splitPolicy)</span>
-<span class="source-line-no">383</span><span id="line-383">        .add("replicas", opts.replicas).add("families", opts.families).toString());</span>
-<span class="source-line-no">384</span><span id="line-384">    }</span>
-<span class="source-line-no">385</span><span id="line-385"></span>
-<span class="source-line-no">386</span><span id="line-386">    // remove an existing table</span>
-<span class="source-line-no">387</span><span id="line-387">    if (needsDelete) {</span>
-<span class="source-line-no">388</span><span id="line-388">      if (admin.isTableEnabled(tableName)) {</span>
-<span class="source-line-no">389</span><span id="line-389">        admin.disableTable(tableName);</span>
-<span class="source-line-no">390</span><span id="line-390">      }</span>
-<span class="source-line-no">391</span><span id="line-391">      admin.deleteTable(tableName);</span>
-<span class="source-line-no">392</span><span id="line-392">    }</span>
-<span class="source-line-no">393</span><span id="line-393"></span>
-<span class="source-line-no">394</span><span id="line-394">    // table creation is necessary</span>
-<span class="source-line-no">395</span><span id="line-395">    if (!exists || needsDelete) {</span>
-<span class="source-line-no">396</span><span id="line-396">      desc = getTableDescriptor(opts);</span>
-<span class="source-line-no">397</span><span id="line-397">      if (splits != null) {</span>
-<span class="source-line-no">398</span><span id="line-398">        if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">399</span><span id="line-399">          for (int i = 0; i &lt; splits.length; i++) {</span>
-<span class="source-line-no">400</span><span id="line-400">            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));</span>
-<span class="source-line-no">401</span><span id="line-401">          }</span>
-<span class="source-line-no">402</span><span id="line-402">        }</span>
-<span class="source-line-no">403</span><span id="line-403">      }</span>
-<span class="source-line-no">404</span><span id="line-404">      if (splits != null) {</span>
-<span class="source-line-no">405</span><span id="line-405">        admin.createTable(desc, splits);</span>
-<span class="source-line-no">406</span><span id="line-406">      } else {</span>
-<span class="source-line-no">407</span><span id="line-407">        admin.createTable(desc);</span>
-<span class="source-line-no">408</span><span id="line-408">      }</span>
-<span class="source-line-no">409</span><span id="line-409">      LOG.info("Table " + desc + " created");</span>
-<span class="source-line-no">410</span><span id="line-410">    }</span>
-<span class="source-line-no">411</span><span id="line-411">    return admin.tableExists(tableName);</span>
-<span class="source-line-no">412</span><span id="line-412">  }</span>
-<span class="source-line-no">413</span><span id="line-413"></span>
-<span class="source-line-no">414</span><span id="line-414">  /**</span>
-<span class="source-line-no">415</span><span id="line-415">   * Create an HTableDescriptor from provided TestOptions.</span>
-<span class="source-line-no">416</span><span id="line-416">   */</span>
-<span class="source-line-no">417</span><span id="line-417">  protected static TableDescriptor getTableDescriptor(TestOptions opts) {</span>
-<span class="source-line-no">418</span><span id="line-418">    TableDescriptorBuilder builder =</span>
-<span class="source-line-no">419</span><span id="line-419">      TableDescriptorBuilder.newBuilder(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">420</span><span id="line-420"></span>
-<span class="source-line-no">421</span><span id="line-421">    for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">422</span><span id="line-422">      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">423</span><span id="line-423">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">424</span><span id="line-424">        ColumnFamilyDescriptorBuilder.newBuilder(familyName);</span>
-<span class="source-line-no">425</span><span id="line-425">      cfBuilder.setDataBlockEncoding(opts.blockEncoding);</span>
-<span class="source-line-no">426</span><span id="line-426">      cfBuilder.setCompressionType(opts.compression);</span>
-<span class="source-line-no">427</span><span id="line-427">      cfBuilder.setEncryptionType(opts.encryption);</span>
-<span class="source-line-no">428</span><span id="line-428">      cfBuilder.setBloomFilterType(opts.bloomType);</span>
-<span class="source-line-no">429</span><span id="line-429">      cfBuilder.setBlocksize(opts.blockSize);</span>
-<span class="source-line-no">430</span><span id="line-430">      if (opts.inMemoryCF) {</span>
-<span class="source-line-no">431</span><span id="line-431">        cfBuilder.setInMemory(true);</span>
-<span class="source-line-no">432</span><span id="line-432">      }</span>
-<span class="source-line-no">433</span><span id="line-433">      cfBuilder.setInMemoryCompaction(opts.inMemoryCompaction);</span>
-<span class="source-line-no">434</span><span id="line-434">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">435</span><span id="line-435">    }</span>
-<span class="source-line-no">436</span><span id="line-436">    if (opts.replicas != DEFAULT_OPTS.replicas) {</span>
-<span class="source-line-no">437</span><span id="line-437">      builder.setRegionReplication(opts.replicas);</span>
-<span class="source-line-no">438</span><span id="line-438">    }</span>
-<span class="source-line-no">439</span><span id="line-439">    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {</span>
-<span class="source-line-no">440</span><span id="line-440">      builder.setRegionSplitPolicyClassName(opts.splitPolicy);</span>
-<span class="source-line-no">441</span><span id="line-441">    }</span>
-<span class="source-line-no">442</span><span id="line-442">    return builder.build();</span>
-<span class="source-line-no">443</span><span id="line-443">  }</span>
-<span class="source-line-no">444</span><span id="line-444"></span>
-<span class="source-line-no">445</span><span id="line-445">  /**</span>
-<span class="source-line-no">446</span><span id="line-446">   * generates splits based on total number of rows and specified split regions</span>
-<span class="source-line-no">447</span><span id="line-447">   */</span>
-<span class="source-line-no">448</span><span id="line-448">  protected static byte[][] getSplits(TestOptions opts) {</span>
-<span class="source-line-no">449</span><span id="line-449">    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions) return null;</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">    int numSplitPoints = opts.presplitRegions - 1;</span>
-<span class="source-line-no">452</span><span id="line-452">    byte[][] splits = new byte[numSplitPoints][];</span>
-<span class="source-line-no">453</span><span id="line-453">    int jump = opts.totalRows / opts.presplitRegions;</span>
-<span class="source-line-no">454</span><span id="line-454">    for (int i = 0; i &lt; numSplitPoints; i++) {</span>
-<span class="source-line-no">455</span><span id="line-455">      int rowkey = jump * (1 + i);</span>
-<span class="source-line-no">456</span><span id="line-456">      splits[i] = format(rowkey);</span>
+<span class="source-line-no">252</span><span id="line-252"></span>
+<span class="source-line-no">253</span><span id="line-253">    @Override</span>
+<span class="source-line-no">254</span><span id="line-254">    public boolean equals(Object obj) {</span>
+<span class="source-line-no">255</span><span id="line-255">      if (this == obj) {</span>
+<span class="source-line-no">256</span><span id="line-256">        return true;</span>
+<span class="source-line-no">257</span><span id="line-257">      }</span>
+<span class="source-line-no">258</span><span id="line-258">      if (obj == null || getClass() != obj.getClass()) {</span>
+<span class="source-line-no">259</span><span id="line-259">        return false;</span>
+<span class="source-line-no">260</span><span id="line-260">      }</span>
+<span class="source-line-no">261</span><span id="line-261">      return this.compareTo((RunResult) obj) == 0;</span>
+<span class="source-line-no">262</span><span id="line-262">    }</span>
+<span class="source-line-no">263</span><span id="line-263"></span>
+<span class="source-line-no">264</span><span id="line-264">    @Override</span>
+<span class="source-line-no">265</span><span id="line-265">    public int hashCode() {</span>
+<span class="source-line-no">266</span><span id="line-266">      return Long.hashCode(duration);</span>
+<span class="source-line-no">267</span><span id="line-267">    }</span>
+<span class="source-line-no">268</span><span id="line-268">  }</span>
+<span class="source-line-no">269</span><span id="line-269"></span>
+<span class="source-line-no">270</span><span id="line-270">  /**</span>
+<span class="source-line-no">271</span><span id="line-271">   * Constructor</span>
+<span class="source-line-no">272</span><span id="line-272">   * @param conf Configuration object</span>
+<span class="source-line-no">273</span><span id="line-273">   */</span>
+<span class="source-line-no">274</span><span id="line-274">  public PerformanceEvaluation(final Configuration conf) {</span>
+<span class="source-line-no">275</span><span id="line-275">    super(conf);</span>
+<span class="source-line-no">276</span><span id="line-276">  }</span>
+<span class="source-line-no">277</span><span id="line-277"></span>
+<span class="source-line-no">278</span><span id="line-278">  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name,</span>
+<span class="source-line-no">279</span><span id="line-279">    String description) {</span>
+<span class="source-line-no">280</span><span id="line-280">    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);</span>
+<span class="source-line-no">281</span><span id="line-281">    COMMANDS.put(name, cmdDescriptor);</span>
+<span class="source-line-no">282</span><span id="line-282">  }</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">  /**</span>
+<span class="source-line-no">285</span><span id="line-285">   * Implementations can have their status set.</span>
+<span class="source-line-no">286</span><span id="line-286">   */</span>
+<span class="source-line-no">287</span><span id="line-287">  interface Status {</span>
+<span class="source-line-no">288</span><span id="line-288">    /**</span>
+<span class="source-line-no">289</span><span id="line-289">     * Sets status</span>
+<span class="source-line-no">290</span><span id="line-290">     * @param msg status message</span>
+<span class="source-line-no">291</span><span id="line-291">     */</span>
+<span class="source-line-no">292</span><span id="line-292">    void setStatus(final String msg) throws IOException;</span>
+<span class="source-line-no">293</span><span id="line-293">  }</span>
+<span class="source-line-no">294</span><span id="line-294"></span>
+<span class="source-line-no">295</span><span id="line-295">  /**</span>
+<span class="source-line-no">296</span><span id="line-296">   * MapReduce job that runs a performance evaluation client in each map task.</span>
+<span class="source-line-no">297</span><span id="line-297">   */</span>
+<span class="source-line-no">298</span><span id="line-298">  public static class EvaluationMapTask</span>
+<span class="source-line-no">299</span><span id="line-299">    extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {</span>
+<span class="source-line-no">300</span><span id="line-300"></span>
+<span class="source-line-no">301</span><span id="line-301">    /** configuration parameter name that contains the command */</span>
+<span class="source-line-no">302</span><span id="line-302">    public final static String CMD_KEY = "EvaluationMapTask.command";</span>
+<span class="source-line-no">303</span><span id="line-303">    /** configuration parameter name that contains the PE impl */</span>
+<span class="source-line-no">304</span><span id="line-304">    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";</span>
+<span class="source-line-no">305</span><span id="line-305"></span>
+<span class="source-line-no">306</span><span id="line-306">    private Class&lt;? extends Test&gt; cmd;</span>
+<span class="source-line-no">307</span><span id="line-307"></span>
+<span class="source-line-no">308</span><span id="line-308">    @Override</span>
+<span class="source-line-no">309</span><span id="line-309">    protected void setup(Context context) throws IOException, InterruptedException {</span>
+<span class="source-line-no">310</span><span id="line-310">      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);</span>
+<span class="source-line-no">311</span><span id="line-311"></span>
+<span class="source-line-no">312</span><span id="line-312">      // this is required so that extensions of PE are instantiated within the</span>
+<span class="source-line-no">313</span><span id="line-313">      // map reduce task...</span>
+<span class="source-line-no">314</span><span id="line-314">      Class&lt;? extends PerformanceEvaluation&gt; peClass =</span>
+<span class="source-line-no">315</span><span id="line-315">        forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);</span>
+<span class="source-line-no">316</span><span id="line-316">      try {</span>
+<span class="source-line-no">317</span><span id="line-317">        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());</span>
+<span class="source-line-no">318</span><span id="line-318">      } catch (Exception e) {</span>
+<span class="source-line-no">319</span><span id="line-319">        throw new IllegalStateException("Could not instantiate PE instance", e);</span>
+<span class="source-line-no">320</span><span id="line-320">      }</span>
+<span class="source-line-no">321</span><span id="line-321">    }</span>
+<span class="source-line-no">322</span><span id="line-322"></span>
+<span class="source-line-no">323</span><span id="line-323">    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {</span>
+<span class="source-line-no">324</span><span id="line-324">      try {</span>
+<span class="source-line-no">325</span><span id="line-325">        return Class.forName(className).asSubclass(type);</span>
+<span class="source-line-no">326</span><span id="line-326">      } catch (ClassNotFoundException e) {</span>
+<span class="source-line-no">327</span><span id="line-327">        throw new IllegalStateException("Could not find class for name: " + className, e);</span>
+<span class="source-line-no">328</span><span id="line-328">      }</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330"></span>
+<span class="source-line-no">331</span><span id="line-331">    @Override</span>
+<span class="source-line-no">332</span><span id="line-332">    protected void map(LongWritable key, Text value, final Context context)</span>
+<span class="source-line-no">333</span><span id="line-333">      throws IOException, InterruptedException {</span>
+<span class="source-line-no">334</span><span id="line-334"></span>
+<span class="source-line-no">335</span><span id="line-335">      Status status = new Status() {</span>
+<span class="source-line-no">336</span><span id="line-336">        @Override</span>
+<span class="source-line-no">337</span><span id="line-337">        public void setStatus(String msg) {</span>
+<span class="source-line-no">338</span><span id="line-338">          context.setStatus(msg);</span>
+<span class="source-line-no">339</span><span id="line-339">        }</span>
+<span class="source-line-no">340</span><span id="line-340">      };</span>
+<span class="source-line-no">341</span><span id="line-341"></span>
+<span class="source-line-no">342</span><span id="line-342">      TestOptions opts = GSON.fromJson(value.toString(), TestOptions.class);</span>
+<span class="source-line-no">343</span><span id="line-343">      Configuration conf = HBaseConfiguration.create(context.getConfiguration());</span>
+<span class="source-line-no">344</span><span id="line-344">      final Connection con = ConnectionFactory.createConnection(conf);</span>
+<span class="source-line-no">345</span><span id="line-345">      AsyncConnection asyncCon = null;</span>
+<span class="source-line-no">346</span><span id="line-346">      try {</span>
+<span class="source-line-no">347</span><span id="line-347">        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();</span>
+<span class="source-line-no">348</span><span id="line-348">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">349</span><span id="line-349">        throw new IOException(e);</span>
+<span class="source-line-no">350</span><span id="line-350">      }</span>
+<span class="source-line-no">351</span><span id="line-351"></span>
+<span class="source-line-no">352</span><span id="line-352">      // Evaluation task</span>
+<span class="source-line-no">353</span><span id="line-353">      RunResult result =</span>
+<span class="source-line-no">354</span><span id="line-354">        PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);</span>
+<span class="source-line-no">355</span><span id="line-355">      // Collect how much time the thing took. Report as map output and</span>
+<span class="source-line-no">356</span><span id="line-356">      // to the ELAPSED_TIME counter.</span>
+<span class="source-line-no">357</span><span id="line-357">      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);</span>
+<span class="source-line-no">358</span><span id="line-358">      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);</span>
+<span class="source-line-no">359</span><span id="line-359">      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));</span>
+<span class="source-line-no">360</span><span id="line-360">      context.progress();</span>
+<span class="source-line-no">361</span><span id="line-361">    }</span>
+<span class="source-line-no">362</span><span id="line-362">  }</span>
+<span class="source-line-no">363</span><span id="line-363"></span>
+<span class="source-line-no">364</span><span id="line-364">  /*</span>
+<span class="source-line-no">365</span><span id="line-365">   * If table does not already exist, create. Also create a table when {@code opts.presplitRegions}</span>
+<span class="source-line-no">366</span><span id="line-366">   * is specified or when the existing table's region replica count doesn't match {@code</span>
+<span class="source-line-no">367</span><span id="line-367">   * opts.replicas}.</span>
+<span class="source-line-no">368</span><span id="line-368">   */</span>
+<span class="source-line-no">369</span><span id="line-369">  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {</span>
+<span class="source-line-no">370</span><span id="line-370">    TableName tableName = TableName.valueOf(opts.tableName);</span>
+<span class="source-line-no">371</span><span id="line-371">    boolean needsDelete = false, exists = admin.tableExists(tableName);</span>
+<span class="source-line-no">372</span><span id="line-372">    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")</span>
+<span class="source-line-no">373</span><span id="line-373">      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");</span>
+<span class="source-line-no">374</span><span id="line-374">    boolean isDeleteCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("delete");</span>
+<span class="source-line-no">375</span><span id="line-375">    if (!exists &amp;&amp; (isReadCmd || isDeleteCmd)) {</span>
+<span class="source-line-no">376</span><span id="line-376">      throw new IllegalStateException(</span>
+<span class="source-line-no">377</span><span id="line-377">        "Must specify an existing table for read commands. Run a write command first.");</span>
+<span class="source-line-no">378</span><span id="line-378">    }</span>
+<span class="source-line-no">379</span><span id="line-379">    TableDescriptor desc = exists ? admin.getDescriptor(TableName.valueOf(opts.tableName)) : null;</span>
+<span class="source-line-no">380</span><span id="line-380">    byte[][] splits = getSplits(opts);</span>
+<span class="source-line-no">381</span><span id="line-381"></span>
+<span class="source-line-no">382</span><span id="line-382">    // recreate the table when user has requested presplit or when existing</span>
+<span class="source-line-no">383</span><span id="line-383">    // {RegionSplitPolicy,replica count} does not match requested, or when the</span>
+<span class="source-line-no">384</span><span id="line-384">    // number of column families does not match requested.</span>
+<span class="source-line-no">385</span><span id="line-385">    if (</span>
+<span class="source-line-no">386</span><span id="line-386">      (exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions</span>
+<span class="source-line-no">387</span><span id="line-387">        &amp;&amp; opts.presplitRegions != admin.getRegions(tableName).size())</span>
+<span class="source-line-no">388</span><span id="line-388">        || (!isReadCmd &amp;&amp; desc != null</span>
+<span class="source-line-no">389</span><span id="line-389">          &amp;&amp; !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))</span>
+<span class="source-line-no">390</span><span id="line-390">        || (!(isReadCmd || isDeleteCmd) &amp;&amp; desc != null</span>
+<span class="source-line-no">391</span><span id="line-391">          &amp;&amp; desc.getRegionReplication() != opts.replicas)</span>
+<span class="source-line-no">392</span><span id="line-392">        || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)</span>
+<span class="source-line-no">393</span><span id="line-393">    ) {</span>
+<span class="source-line-no">394</span><span id="line-394">      needsDelete = true;</span>
+<span class="source-line-no">395</span><span id="line-395">      // wait, why did it delete my table?!?</span>
+<span class="source-line-no">396</span><span id="line-396">      LOG.debug(MoreObjects.toStringHelper("needsDelete").add("needsDelete", needsDelete)</span>
+<span class="source-line-no">397</span><span id="line-397">        .add("isReadCmd", isReadCmd).add("exists", exists).add("desc", desc)</span>
+<span class="source-line-no">398</span><span id="line-398">        .add("presplit", opts.presplitRegions).add("splitPolicy", opts.splitPolicy)</span>
+<span class="source-line-no">399</span><span id="line-399">        .add("replicas", opts.replicas).add("families", opts.families).toString());</span>
+<span class="source-line-no">400</span><span id="line-400">    }</span>
+<span class="source-line-no">401</span><span id="line-401"></span>
+<span class="source-line-no">402</span><span id="line-402">    // remove an existing table</span>
+<span class="source-line-no">403</span><span id="line-403">    if (needsDelete) {</span>
+<span class="source-line-no">404</span><span id="line-404">      if (admin.isTableEnabled(tableName)) {</span>
+<span class="source-line-no">405</span><span id="line-405">        admin.disableTable(tableName);</span>
+<span class="source-line-no">406</span><span id="line-406">      }</span>
+<span class="source-line-no">407</span><span id="line-407">      admin.deleteTable(tableName);</span>
+<span class="source-line-no">408</span><span id="line-408">    }</span>
+<span class="source-line-no">409</span><span id="line-409"></span>
+<span class="source-line-no">410</span><span id="line-410">    // table creation is necessary</span>
+<span class="source-line-no">411</span><span id="line-411">    if (!exists || needsDelete) {</span>
+<span class="source-line-no">412</span><span id="line-412">      desc = getTableDescriptor(opts);</span>
+<span class="source-line-no">413</span><span id="line-413">      if (splits != null) {</span>
+<span class="source-line-no">414</span><span id="line-414">        if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">415</span><span id="line-415">          for (int i = 0; i &lt; splits.length; i++) {</span>
+<span class="source-line-no">416</span><span id="line-416">            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));</span>
+<span class="source-line-no">417</span><span id="line-417">          }</span>
+<span class="source-line-no">418</span><span id="line-418">        }</span>
+<span class="source-line-no">419</span><span id="line-419">      }</span>
+<span class="source-line-no">420</span><span id="line-420">      if (splits != null) {</span>
+<span class="source-line-no">421</span><span id="line-421">        admin.createTable(desc, splits);</span>
+<span class="source-line-no">422</span><span id="line-422">      } else {</span>
+<span class="source-line-no">423</span><span id="line-423">        admin.createTable(desc);</span>
+<span class="source-line-no">424</span><span id="line-424">      }</span>
+<span class="source-line-no">425</span><span id="line-425">      LOG.info("Table " + desc + " created");</span>
+<span class="source-line-no">426</span><span id="line-426">    }</span>
+<span class="source-line-no">427</span><span id="line-427">    return admin.tableExists(tableName);</span>
+<span class="source-line-no">428</span><span id="line-428">  }</span>
+<span class="source-line-no">429</span><span id="line-429"></span>
+<span class="source-line-no">430</span><span id="line-430">  /**</span>
+<span class="source-line-no">431</span><span id="line-431">   * Create an HTableDescriptor from provided TestOptions.</span>
+<span class="source-line-no">432</span><span id="line-432">   */</span>
+<span class="source-line-no">433</span><span id="line-433">  protected static TableDescriptor getTableDescriptor(TestOptions opts) {</span>
+<span class="source-line-no">434</span><span id="line-434">    TableDescriptorBuilder builder =</span>
+<span class="source-line-no">435</span><span id="line-435">      TableDescriptorBuilder.newBuilder(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">436</span><span id="line-436"></span>
+<span class="source-line-no">437</span><span id="line-437">    for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">438</span><span id="line-438">      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">439</span><span id="line-439">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">440</span><span id="line-440">        ColumnFamilyDescriptorBuilder.newBuilder(familyName);</span>
+<span class="source-line-no">441</span><span id="line-441">      cfBuilder.setDataBlockEncoding(opts.blockEncoding);</span>
+<span class="source-line-no">442</span><span id="line-442">      cfBuilder.setCompressionType(opts.compression);</span>
+<span class="source-line-no">443</span><span id="line-443">      cfBuilder.setEncryptionType(opts.encryption);</span>
+<span class="source-line-no">444</span><span id="line-444">      cfBuilder.setBloomFilterType(opts.bloomType);</span>
+<span class="source-line-no">445</span><span id="line-445">      cfBuilder.setBlocksize(opts.blockSize);</span>
+<span class="source-line-no">446</span><span id="line-446">      if (opts.inMemoryCF) {</span>
+<span class="source-line-no">447</span><span id="line-447">        cfBuilder.setInMemory(true);</span>
+<span class="source-line-no">448</span><span id="line-448">      }</span>
+<span class="source-line-no">449</span><span id="line-449">      cfBuilder.setInMemoryCompaction(opts.inMemoryCompaction);</span>
+<span class="source-line-no">450</span><span id="line-450">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">451</span><span id="line-451">    }</span>
+<span class="source-line-no">452</span><span id="line-452">    if (opts.replicas != DEFAULT_OPTS.replicas) {</span>
+<span class="source-line-no">453</span><span id="line-453">      builder.setRegionReplication(opts.replicas);</span>
+<span class="source-line-no">454</span><span id="line-454">    }</span>
+<span class="source-line-no">455</span><span id="line-455">    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {</span>
+<span class="source-line-no">456</span><span id="line-456">      builder.setRegionSplitPolicyClassName(opts.splitPolicy);</span>
 <span class="source-line-no">457</span><span id="line-457">    }</span>
-<span class="source-line-no">458</span><span id="line-458">    return splits;</span>
+<span class="source-line-no">458</span><span id="line-458">    return builder.build();</span>
 <span class="source-line-no">459</span><span id="line-459">  }</span>
 <span class="source-line-no">460</span><span id="line-460"></span>
-<span class="source-line-no">461</span><span id="line-461">  static void setupConnectionCount(final TestOptions opts) {</span>
-<span class="source-line-no">462</span><span id="line-462">    if (opts.oneCon) {</span>
-<span class="source-line-no">463</span><span id="line-463">      opts.connCount = 1;</span>
-<span class="source-line-no">464</span><span id="line-464">    } else {</span>
-<span class="source-line-no">465</span><span id="line-465">      if (opts.connCount == -1) {</span>
-<span class="source-line-no">466</span><span id="line-466">        // set to thread number if connCount is not set</span>
-<span class="source-line-no">467</span><span id="line-467">        opts.connCount = opts.numClientThreads;</span>
-<span class="source-line-no">468</span><span id="line-468">      }</span>
-<span class="source-line-no">469</span><span id="line-469">    }</span>
-<span class="source-line-no">470</span><span id="line-470">  }</span>
-<span class="source-line-no">471</span><span id="line-471"></span>
-<span class="source-line-no">472</span><span id="line-472">  /*</span>
-<span class="source-line-no">473</span><span id="line-473">   * Run all clients in this vm each to its own thread.</span>
-<span class="source-line-no">474</span><span id="line-474">   */</span>
-<span class="source-line-no">475</span><span id="line-475">  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)</span>
-<span class="source-line-no">476</span><span id="line-476">    throws IOException, InterruptedException, ExecutionException {</span>
-<span class="source-line-no">477</span><span id="line-477">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
-<span class="source-line-no">478</span><span id="line-478">    assert cmd != null;</span>
-<span class="source-line-no">479</span><span id="line-479">    @SuppressWarnings("unchecked")</span>
-<span class="source-line-no">480</span><span id="line-480">    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];</span>
-<span class="source-line-no">481</span><span id="line-481">    RunResult[] results = new RunResult[opts.numClientThreads];</span>
-<span class="source-line-no">482</span><span id="line-482">    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,</span>
-<span class="source-line-no">483</span><span id="line-483">      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());</span>
-<span class="source-line-no">484</span><span id="line-484">    setupConnectionCount(opts);</span>
-<span class="source-line-no">485</span><span id="line-485">    final Connection[] cons = new Connection[opts.connCount];</span>
-<span class="source-line-no">486</span><span id="line-486">    final AsyncConnection[] asyncCons = new AsyncConnection[opts.connCount];</span>
-<span class="source-line-no">487</span><span id="line-487">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
-<span class="source-line-no">488</span><span id="line-488">      cons[i] = ConnectionFactory.createConnection(conf);</span>
-<span class="source-line-no">489</span><span id="line-489">      asyncCons[i] = ConnectionFactory.createAsyncConnection(conf).get();</span>
-<span class="source-line-no">490</span><span id="line-490">    }</span>
-<span class="source-line-no">491</span><span id="line-491">    LOG</span>
-<span class="source-line-no">492</span><span id="line-492">      .info("Created " + opts.connCount + " connections for " + opts.numClientThreads + " threads");</span>
-<span class="source-line-no">493</span><span id="line-493">    for (int i = 0; i &lt; threads.length; i++) {</span>
-<span class="source-line-no">494</span><span id="line-494">      final int index = i;</span>
-<span class="source-line-no">495</span><span id="line-495">      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {</span>
-<span class="source-line-no">496</span><span id="line-496">        @Override</span>
-<span class="source-line-no">497</span><span id="line-497">        public RunResult call() throws Exception {</span>
-<span class="source-line-no">498</span><span id="line-498">          TestOptions threadOpts = new TestOptions(opts);</span>
-<span class="source-line-no">499</span><span id="line-499">          final Connection con = cons[index % cons.length];</span>
-<span class="source-line-no">500</span><span id="line-500">          final AsyncConnection asyncCon = asyncCons[index % asyncCons.length];</span>
-<span class="source-line-no">501</span><span id="line-501">          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;</span>
-<span class="source-line-no">502</span><span id="line-502">          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {</span>
-<span class="source-line-no">503</span><span id="line-503">            @Override</span>
-<span class="source-line-no">504</span><span id="line-504">            public void setStatus(final String msg) throws IOException {</span>
-<span class="source-line-no">505</span><span id="line-505">              LOG.info(msg);</span>
-<span class="source-line-no">506</span><span id="line-506">            }</span>
-<span class="source-line-no">507</span><span id="line-507">          });</span>
-<span class="source-line-no">508</span><span id="line-508">          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration</span>
-<span class="source-line-no">509</span><span id="line-509">            + "ms over " + threadOpts.perClientRunRows + " rows");</span>
-<span class="source-line-no">510</span><span id="line-510">          if (opts.latencyThreshold &gt; 0) {</span>
-<span class="source-line-no">511</span><span id="line-511">            LOG.info("Number of replies over latency threshold " + opts.latencyThreshold</span>
-<span class="source-line-no">512</span><span id="line-512">              + "(ms) is " + run.numbOfReplyOverThreshold);</span>
-<span class="source-line-no">513</span><span id="line-513">          }</span>
-<span class="source-line-no">514</span><span id="line-514">          return run;</span>
-<span class="source-line-no">515</span><span id="line-515">        }</span>
-<span class="source-line-no">516</span><span id="line-516">      });</span>
-<span class="source-line-no">517</span><span id="line-517">    }</span>
-<span class="source-line-no">518</span><span id="line-518">    pool.shutdown();</span>
-<span class="source-line-no">519</span><span id="line-519"></span>
-<span class="source-line-no">520</span><span id="line-520">    for (int i = 0; i &lt; threads.length; i++) {</span>
-<span class="source-line-no">521</span><span id="line-521">      try {</span>
-<span class="source-line-no">522</span><span id="line-522">        results[i] = threads[i].get();</span>
-<span class="source-line-no">523</span><span id="line-523">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">524</span><span id="line-524">        throw new IOException(e.getCause());</span>
-<span class="source-line-no">525</span><span id="line-525">      }</span>
-<span class="source-line-no">526</span><span id="line-526">    }</span>
-<span class="source-line-no">527</span><span id="line-527">    final String test = cmd.getSimpleName();</span>
-<span class="source-line-no">528</span><span id="line-528">    LOG.info("[" + test + "] Summary of timings (ms): " + Arrays.toString(results));</span>
-<span class="source-line-no">529</span><span id="line-529">    Arrays.sort(results);</span>
-<span class="source-line-no">530</span><span id="line-530">    long total = 0;</span>
-<span class="source-line-no">531</span><span id="line-531">    float avgLatency = 0;</span>
-<span class="source-line-no">532</span><span id="line-532">    float avgTPS = 0;</span>
-<span class="source-line-no">533</span><span id="line-533">    long replicaWins = 0;</span>
-<span class="source-line-no">534</span><span id="line-534">    for (RunResult result : results) {</span>
-<span class="source-line-no">535</span><span id="line-535">      total += result.duration;</span>
-<span class="source-line-no">536</span><span id="line-536">      avgLatency += result.hist.getSnapshot().getMean();</span>
-<span class="source-line-no">537</span><span id="line-537">      avgTPS += opts.perClientRunRows * 1.0f / result.duration;</span>
-<span class="source-line-no">538</span><span id="line-538">      replicaWins += result.numOfReplyFromReplica;</span>
-<span class="source-line-no">539</span><span id="line-539">    }</span>
-<span class="source-line-no">540</span><span id="line-540">    avgTPS *= 1000; // ms to second</span>
-<span class="source-line-no">541</span><span id="line-541">    avgLatency = avgLatency / results.length;</span>
-<span class="source-line-no">542</span><span id="line-542">    LOG.info("[" + test + " duration ]" + "\tMin: " + results[0] + "ms" + "\tMax: "</span>
-<span class="source-line-no">543</span><span id="line-543">      + results[results.length - 1] + "ms" + "\tAvg: " + (total / results.length) + "ms");</span>
-<span class="source-line-no">544</span><span id="line-544">    LOG.info("[ Avg latency (us)]\t" + Math.round(avgLatency));</span>
-<span class="source-line-no">545</span><span id="line-545">    LOG.info("[ Avg TPS/QPS]\t" + Math.round(avgTPS) + "\t row per second");</span>
-<span class="source-line-no">546</span><span id="line-546">    if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">547</span><span id="line-547">      LOG.info("[results from replica regions] " + replicaWins);</span>
-<span class="source-line-no">548</span><span id="line-548">    }</span>
-<span class="source-line-no">549</span><span id="line-549"></span>
-<span class="source-line-no">550</span><span id="line-550">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
-<span class="source-line-no">551</span><span id="line-551">      cons[i].close();</span>
-<span class="source-line-no">552</span><span id="line-552">      asyncCons[i].close();</span>
-<span class="source-line-no">553</span><span id="line-553">    }</span>
-<span class="source-line-no">554</span><span id="line-554"></span>
-<span class="source-line-no">555</span><span id="line-555">    return results;</span>
-<span class="source-line-no">556</span><span id="line-556">  }</span>
-<span class="source-line-no">557</span><span id="line-557"></span>
-<span class="source-line-no">558</span><span id="line-558">  /*</span>
-<span class="source-line-no">559</span><span id="line-559">   * Run a mapreduce job. Run as many maps as asked-for clients. Before we start up the job, write</span>
-<span class="source-line-no">560</span><span id="line-560">   * out an input file with instruction per client regards which row they are to start on.</span>
-<span class="source-line-no">561</span><span id="line-561">   * @param cmd Command to run.</span>
-<span class="source-line-no">562</span><span id="line-562">   */</span>
-<span class="source-line-no">563</span><span id="line-563">  static Job doMapReduce(TestOptions opts, final Configuration conf)</span>
-<span class="source-line-no">564</span><span id="line-564">    throws IOException, InterruptedException, ClassNotFoundException {</span>
-<span class="source-line-no">565</span><span id="line-565">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
-<span class="source-line-no">566</span><span id="line-566">    assert cmd != null;</span>
-<span class="source-line-no">567</span><span id="line-567">    Path inputDir = writeInputFile(conf, opts);</span>
-<span class="source-line-no">568</span><span id="line-568">    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());</span>
-<span class="source-line-no">569</span><span id="line-569">    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());</span>
-<span class="source-line-no">570</span><span id="line-570">    Job job = Job.getInstance(conf);</span>
-<span class="source-line-no">571</span><span id="line-571">    job.setJarByClass(PerformanceEvaluation.class);</span>
-<span class="source-line-no">572</span><span id="line-572">    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);</span>
+<span class="source-line-no">461</span><span id="line-461">  /**</span>
+<span class="source-line-no">462</span><span id="line-462">   * generates splits based on total number of rows and specified split regions</span>
+<span class="source-line-no">463</span><span id="line-463">   */</span>
+<span class="source-line-no">464</span><span id="line-464">  protected static byte[][] getSplits(TestOptions opts) {</span>
+<span class="source-line-no">465</span><span id="line-465">    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions) return null;</span>
+<span class="source-line-no">466</span><span id="line-466"></span>
+<span class="source-line-no">467</span><span id="line-467">    int numSplitPoints = opts.presplitRegions - 1;</span>
+<span class="source-line-no">468</span><span id="line-468">    byte[][] splits = new byte[numSplitPoints][];</span>
+<span class="source-line-no">469</span><span id="line-469">    int jump = opts.totalRows / opts.presplitRegions;</span>
+<span class="source-line-no">470</span><span id="line-470">    for (int i = 0; i &lt; numSplitPoints; i++) {</span>
+<span class="source-line-no">471</span><span id="line-471">      int rowkey = jump * (1 + i);</span>
+<span class="source-line-no">472</span><span id="line-472">      splits[i] = format(rowkey);</span>
+<span class="source-line-no">473</span><span id="line-473">    }</span>
+<span class="source-line-no">474</span><span id="line-474">    return splits;</span>
+<span class="source-line-no">475</span><span id="line-475">  }</span>
+<span class="source-line-no">476</span><span id="line-476"></span>
+<span class="source-line-no">477</span><span id="line-477">  static void setupConnectionCount(final TestOptions opts) {</span>
+<span class="source-line-no">478</span><span id="line-478">    if (opts.oneCon) {</span>
+<span class="source-line-no">479</span><span id="line-479">      opts.connCount = 1;</span>
+<span class="source-line-no">480</span><span id="line-480">    } else {</span>
+<span class="source-line-no">481</span><span id="line-481">      if (opts.connCount == -1) {</span>
+<span class="source-line-no">482</span><span id="line-482">        // set to thread number if connCount is not set</span>
+<span class="source-line-no">483</span><span id="line-483">        opts.connCount = opts.numClientThreads;</span>
+<span class="source-line-no">484</span><span id="line-484">      }</span>
+<span class="source-line-no">485</span><span id="line-485">    }</span>
+<span class="source-line-no">486</span><span id="line-486">  }</span>
+<span class="source-line-no">487</span><span id="line-487"></span>
+<span class="source-line-no">488</span><span id="line-488">  /*</span>
+<span class="source-line-no">489</span><span id="line-489">   * Run all clients in this vm each to its own thread.</span>
+<span class="source-line-no">490</span><span id="line-490">   */</span>
+<span class="source-line-no">491</span><span id="line-491">  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)</span>
+<span class="source-line-no">492</span><span id="line-492">    throws IOException, InterruptedException, ExecutionException {</span>
+<span class="source-line-no">493</span><span id="line-493">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
+<span class="source-line-no">494</span><span id="line-494">    assert cmd != null;</span>
+<span class="source-line-no">495</span><span id="line-495">    @SuppressWarnings("unchecked")</span>
+<span class="source-line-no">496</span><span id="line-496">    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];</span>
+<span class="source-line-no">497</span><span id="line-497">    RunResult[] results = new RunResult[opts.numClientThreads];</span>
+<span class="source-line-no">498</span><span id="line-498">    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,</span>
+<span class="source-line-no">499</span><span id="line-499">      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());</span>
+<span class="source-line-no">500</span><span id="line-500">    setupConnectionCount(opts);</span>
+<span class="source-line-no">501</span><span id="line-501">    final Connection[] cons = new Connection[opts.connCount];</span>
+<span class="source-line-no">502</span><span id="line-502">    final AsyncConnection[] asyncCons = new AsyncConnection[opts.connCount];</span>
+<span class="source-line-no">503</span><span id="line-503">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
+<span class="source-line-no">504</span><span id="line-504">      cons[i] = ConnectionFactory.createConnection(conf);</span>
+<span class="source-line-no">505</span><span id="line-505">      asyncCons[i] = ConnectionFactory.createAsyncConnection(conf).get();</span>
+<span class="source-line-no">506</span><span id="line-506">    }</span>
+<span class="source-line-no">507</span><span id="line-507">    LOG</span>
+<span class="source-line-no">508</span><span id="line-508">      .info("Created " + opts.connCount + " connections for " + opts.numClientThreads + " threads");</span>
+<span class="source-line-no">509</span><span id="line-509">    for (int i = 0; i &lt; threads.length; i++) {</span>
+<span class="source-line-no">510</span><span id="line-510">      final int index = i;</span>
+<span class="source-line-no">511</span><span id="line-511">      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {</span>
+<span class="source-line-no">512</span><span id="line-512">        @Override</span>
+<span class="source-line-no">513</span><span id="line-513">        public RunResult call() throws Exception {</span>
+<span class="source-line-no">514</span><span id="line-514">          TestOptions threadOpts = new TestOptions(opts);</span>
+<span class="source-line-no">515</span><span id="line-515">          final Connection con = cons[index % cons.length];</span>
+<span class="source-line-no">516</span><span id="line-516">          final AsyncConnection asyncCon = asyncCons[index % asyncCons.length];</span>
+<span class="source-line-no">517</span><span id="line-517">          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;</span>
+<span class="source-line-no">518</span><span id="line-518">          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {</span>
+<span class="source-line-no">519</span><span id="line-519">            @Override</span>
+<span class="source-line-no">520</span><span id="line-520">            public void setStatus(final String msg) throws IOException {</span>
+<span class="source-line-no">521</span><span id="line-521">              LOG.info(msg);</span>
+<span class="source-line-no">522</span><span id="line-522">            }</span>
+<span class="source-line-no">523</span><span id="line-523">          });</span>
+<span class="source-line-no">524</span><span id="line-524">          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration</span>
+<span class="source-line-no">525</span><span id="line-525">            + "ms over " + threadOpts.perClientRunRows + " rows");</span>
+<span class="source-line-no">526</span><span id="line-526">          if (opts.latencyThreshold &gt; 0) {</span>
+<span class="source-line-no">527</span><span id="line-527">            LOG.info("Number of replies over latency threshold " + opts.latencyThreshold</span>
+<span class="source-line-no">528</span><span id="line-528">              + "(ms) is " + run.numbOfReplyOverThreshold);</span>
+<span class="source-line-no">529</span><span id="line-529">          }</span>
+<span class="source-line-no">530</span><span id="line-530">          return run;</span>
+<span class="source-line-no">531</span><span id="line-531">        }</span>
+<span class="source-line-no">532</span><span id="line-532">      });</span>
+<span class="source-line-no">533</span><span id="line-533">    }</span>
+<span class="source-line-no">534</span><span id="line-534">    pool.shutdown();</span>
+<span class="source-line-no">535</span><span id="line-535"></span>
+<span class="source-line-no">536</span><span id="line-536">    for (int i = 0; i &lt; threads.length; i++) {</span>
+<span class="source-line-no">537</span><span id="line-537">      try {</span>
+<span class="source-line-no">538</span><span id="line-538">        results[i] = threads[i].get();</span>
+<span class="source-line-no">539</span><span id="line-539">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">540</span><span id="line-540">        throw new IOException(e.getCause());</span>
+<span class="source-line-no">541</span><span id="line-541">      }</span>
+<span class="source-line-no">542</span><span id="line-542">    }</span>
+<span class="source-line-no">543</span><span id="line-543">    final String test = cmd.getSimpleName();</span>
+<span class="source-line-no">544</span><span id="line-544">    LOG.info("[" + test + "] Summary of timings (ms): " + Arrays.toString(results));</span>
+<span class="source-line-no">545</span><span id="line-545">    Arrays.sort(results);</span>
+<span class="source-line-no">546</span><span id="line-546">    long total = 0;</span>
+<span class="source-line-no">547</span><span id="line-547">    float avgLatency = 0;</span>
+<span class="source-line-no">548</span><span id="line-548">    float avgTPS = 0;</span>
+<span class="source-line-no">549</span><span id="line-549">    long replicaWins = 0;</span>
+<span class="source-line-no">550</span><span id="line-550">    for (RunResult result : results) {</span>
+<span class="source-line-no">551</span><span id="line-551">      total += result.duration;</span>
+<span class="source-line-no">552</span><span id="line-552">      avgLatency += result.hist.getSnapshot().getMean();</span>
+<span class="source-line-no">553</span><span id="line-553">      avgTPS += opts.perClientRunRows * 1.0f / result.duration;</span>
+<span class="source-line-no">554</span><span id="line-554">      replicaWins += result.numOfReplyFromReplica;</span>
+<span class="source-line-no">555</span><span id="line-555">    }</span>
+<span class="source-line-no">556</span><span id="line-556">    avgTPS *= 1000; // ms to second</span>
+<span class="source-line-no">557</span><span id="line-557">    avgLatency = avgLatency / results.length;</span>
+<span class="source-line-no">558</span><span id="line-558">    LOG.info("[" + test + " duration ]" + "\tMin: " + results[0] + "ms" + "\tMax: "</span>
+<span class="source-line-no">559</span><span id="line-559">      + results[results.length - 1] + "ms" + "\tAvg: " + (total / results.length) + "ms");</span>
+<span class="source-line-no">560</span><span id="line-560">    LOG.info("[ Avg latency (us)]\t" + Math.round(avgLatency));</span>
+<span class="source-line-no">561</span><span id="line-561">    LOG.info("[ Avg TPS/QPS]\t" + Math.round(avgTPS) + "\t row per second");</span>
+<span class="source-line-no">562</span><span id="line-562">    if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">563</span><span id="line-563">      LOG.info("[results from replica regions] " + replicaWins);</span>
+<span class="source-line-no">564</span><span id="line-564">    }</span>
+<span class="source-line-no">565</span><span id="line-565"></span>
+<span class="source-line-no">566</span><span id="line-566">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
+<span class="source-line-no">567</span><span id="line-567">      cons[i].close();</span>
+<span class="source-line-no">568</span><span id="line-568">      asyncCons[i].close();</span>
+<span class="source-line-no">569</span><span id="line-569">    }</span>
+<span class="source-line-no">570</span><span id="line-570"></span>
+<span class="source-line-no">571</span><span id="line-571">    return results;</span>
+<span class="source-line-no">572</span><span id="line-572">  }</span>
 <span class="source-line-no">573</span><span id="line-573"></span>
-<span class="source-line-no">574</span><span id="line-574">    job.setInputFormatClass(NLineInputFormat.class);</span>
-<span class="source-line-no">575</span><span id="line-575">    NLineInputFormat.setInputPaths(job, inputDir);</span>
-<span class="source-line-no">576</span><span id="line-576">    // this is default, but be explicit about it just in case.</span>
-<span class="source-line-no">577</span><span id="line-577">    NLineInputFormat.setNumLinesPerSplit(job, 1);</span>
-<span class="source-line-no">578</span><span id="line-578"></span>
-<span class="source-line-no">579</span><span id="line-579">    job.setOutputKeyClass(LongWritable.class);</span>
-<span class="source-line-no">580</span><span id="line-580">    job.setOutputValueClass(LongWritable.class);</span>
-<span class="source-line-no">581</span><span id="line-581"></span>
-<span class="source-line-no">582</span><span id="line-582">    job.setMapperClass(EvaluationMapTask.class);</span>
-<span class="source-line-no">583</span><span id="line-583">    job.setReducerClass(LongSumReducer.class);</span>
-<span class="source-line-no">584</span><span id="line-584"></span>
-<span class="source-line-no">585</span><span id="line-585">    job.setNumReduceTasks(1);</span>
-<span class="source-line-no">586</span><span id="line-586"></span>
-<span class="source-line-no">587</span><span id="line-587">    job.setOutputFormatClass(TextOutputFormat.class);</span>
-<span class="source-line-no">588</span><span id="line-588">    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));</span>
+<span class="source-line-no">574</span><span id="line-574">  /*</span>
+<span class="source-line-no">575</span><span id="line-575">   * Run a mapreduce job. Run as many maps as asked-for clients. Before we start up the job, write</span>
+<span class="source-line-no">576</span><span id="line-576">   * out an input file with instruction per client regards which row they are to start on.</span>
+<span class="source-line-no">577</span><span id="line-577">   * @param cmd Command to run.</span>
+<span class="source-line-no">578</span><span id="line-578">   */</span>
+<span class="source-line-no">579</span><span id="line-579">  static Job doMapReduce(TestOptions opts, final Configuration conf)</span>
+<span class="source-line-no">580</span><span id="line-580">    throws IOException, InterruptedException, ClassNotFoundException {</span>
+<span class="source-line-no">581</span><span id="line-581">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
+<span class="source-line-no">582</span><span id="line-582">    assert cmd != null;</span>
+<span class="source-line-no">583</span><span id="line-583">    Path inputDir = writeInputFile(conf, opts);</span>
+<span class="source-line-no">584</span><span id="line-584">    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());</span>
+<span class="source-line-no">585</span><span id="line-585">    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());</span>
+<span class="source-line-no">586</span><span id="line-586">    Job job = Job.getInstance(conf);</span>
+<span class="source-line-no">587</span><span id="line-587">    job.setJarByClass(PerformanceEvaluation.class);</span>
+<span class="source-line-no">588</span><span id="line-588">    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);</span>
 <span class="source-line-no">589</span><span id="line-589"></span>
-<span class="source-line-no">590</span><span id="line-590">    TableMapReduceUtil.addDependencyJars(job);</span>
-<span class="source-line-no">591</span><span id="line-591">    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(), Histogram.class, // yammer</span>
-<span class="source-line-no">592</span><span id="line-592">                                                                                            // metrics</span>
-<span class="source-line-no">593</span><span id="line-593">      Gson.class, // gson</span>
-<span class="source-line-no">594</span><span id="line-594">      FilterAllFilter.class // hbase-server tests jar</span>
-<span class="source-line-no">595</span><span id="line-595">    );</span>
-<span class="source-line-no">596</span><span id="line-596"></span>
-<span class="source-line-no">597</span><span id="line-597">    TableMapReduceUtil.initCredentials(job);</span>
-<span class="source-line-no">598</span><span id="line-598"></span>
-<span class="source-line-no">599</span><span id="line-599">    job.waitForCompletion(true);</span>
-<span class="source-line-no">600</span><span id="line-600">    return job;</span>
-<span class="source-line-no">601</span><span id="line-601">  }</span>
+<span class="source-line-no">590</span><span id="line-590">    job.setInputFormatClass(NLineInputFormat.class);</span>
+<span class="source-line-no">591</span><span id="line-591">    NLineInputFormat.setInputPaths(job, inputDir);</span>
+<span class="source-line-no">592</span><span id="line-592">    // this is default, but be explicit about it just in case.</span>
+<span class="source-line-no">593</span><span id="line-593">    NLineInputFormat.setNumLinesPerSplit(job, 1);</span>
+<span class="source-line-no">594</span><span id="line-594"></span>
+<span class="source-line-no">595</span><span id="line-595">    job.setOutputKeyClass(LongWritable.class);</span>
+<span class="source-line-no">596</span><span id="line-596">    job.setOutputValueClass(LongWritable.class);</span>
+<span class="source-line-no">597</span><span id="line-597"></span>
+<span class="source-line-no">598</span><span id="line-598">    job.setMapperClass(EvaluationMapTask.class);</span>
+<span class="source-line-no">599</span><span id="line-599">    job.setReducerClass(LongSumReducer.class);</span>
+<span class="source-line-no">600</span><span id="line-600"></span>
+<span class="source-line-no">601</span><span id="line-601">    job.setNumReduceTasks(1);</span>
 <span class="source-line-no">602</span><span id="line-602"></span>
-<span class="source-line-no">603</span><span id="line-603">  /**</span>
-<span class="source-line-no">604</span><span id="line-604">   * Each client has one mapper to do the work, and client do the resulting count in a map task.</span>
-<span class="source-line-no">605</span><span id="line-605">   */</span>
-<span class="source-line-no">606</span><span id="line-606"></span>
-<span class="source-line-no">607</span><span id="line-607">  static String JOB_INPUT_FILENAME = "input.txt";</span>
-<span class="source-line-no">608</span><span id="line-608"></span>
-<span class="source-line-no">609</span><span id="line-609">  /*</span>
-<span class="source-line-no">610</span><span id="line-610">   * Write input file of offsets-per-client for the mapreduce job.</span>
-<span class="source-line-no">611</span><span id="line-611">   * @param c Configuration</span>
-<span class="source-line-no">612</span><span id="line-612">   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME</span>
-<span class="source-line-no">613</span><span id="line-613">   */</span>
-<span class="source-line-no">614</span><span id="line-614">  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {</span>
-<span class="source-line-no">615</span><span id="line-615">    return writeInputFile(c, opts, new Path("."));</span>
-<span class="source-line-no">616</span><span id="line-616">  }</span>
-<span class="source-line-no">617</span><span id="line-617"></span>
-<span class="source-line-no">618</span><span id="line-618">  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)</span>
-<span class="source-line-no">619</span><span id="line-619">    throws IOException {</span>
-<span class="source-line-no">620</span><span id="line-620">    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");</span>
-<span class="source-line-no">621</span><span id="line-621">    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));</span>
-<span class="source-line-no">622</span><span id="line-622">    Path inputDir = new Path(jobdir, "inputs");</span>
-<span class="source-line-no">623</span><span id="line-623"></span>
-<span class="source-line-no">624</span><span id="line-624">    FileSystem fs = FileSystem.get(c);</span>
-<span class="source-line-no">625</span><span id="line-625">    fs.mkdirs(inputDir);</span>
-<span class="source-line-no">626</span><span id="line-626"></span>
-<span class="source-line-no">627</span><span id="line-627">    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);</span>
-<span class="source-line-no">628</span><span id="line-628">    PrintStream out = new PrintStream(fs.create(inputFile));</span>
-<span class="source-line-no">629</span><span id="line-629">    // Make input random.</span>
-<span class="source-line-no">630</span><span id="line-630">    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();</span>
-<span class="source-line-no">631</span><span id="line-631">    Hash h = MurmurHash.getInstance();</span>
-<span class="source-line-no">632</span><span id="line-632">    int perClientRows = (opts.totalRows / opts.numClientThreads);</span>
-<span class="source-line-no">633</span><span id="line-633">    try {</span>
-<span class="source-line-no">634</span><span id="line-634">      for (int j = 0; j &lt; opts.numClientThreads; j++) {</span>
-<span class="source-line-no">635</span><span id="line-635">        TestOptions next = new TestOptions(opts);</span>
-<span class="source-line-no">636</span><span id="line-636">        next.startRow = j * perClientRows;</span>
-<span class="source-line-no">637</span><span id="line-637">        next.perClientRunRows = perClientRows;</span>
-<span class="source-line-no">638</span><span id="line-638">        String s = GSON.toJson(next);</span>
-<span class="source-line-no">639</span><span id="line-639">        LOG.info("Client=" + j + ", input=" + s);</span>
-<span class="source-line-no">640</span><span id="line-640">        byte[] b = Bytes.toBytes(s);</span>
-<span class="source-line-no">641</span><span id="line-641">        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);</span>
-<span class="source-line-no">642</span><span id="line-642">        m.put(hash, s);</span>
-<span class="source-line-no">643</span><span id="line-643">      }</span>
-<span class="source-line-no">644</span><span id="line-644">      for (Map.Entry&lt;Integer, String&gt; e : m.entrySet()) {</span>
-<span class="source-line-no">645</span><span id="line-645">        out.println(e.getValue());</span>
-<span class="source-line-no">646</span><span id="line-646">      }</span>
-<span class="source-line-no">647</span><span id="line-647">    } finally {</span>
-<span class="source-line-no">648</span><span id="line-648">      out.close();</span>
-<span class="source-line-no">649</span><span id="line-649">    }</span>
-<span class="source-line-no">650</span><span id="line-650">    return inputDir;</span>
-<span class="source-line-no">651</span><span id="line-651">  }</span>
-<span class="source-line-no">652</span><span id="line-652"></span>
-<span class="source-line-no">653</span><span id="line-653">  /**</span>
-<span class="source-line-no">654</span><span id="line-654">   * Describes a command.</span>
-<span class="source-line-no">655</span><span id="line-655">   */</span>
-<span class="source-line-no">656</span><span id="line-656">  static class CmdDescriptor {</span>
-<span class="source-line-no">657</span><span id="line-657">    private Class&lt;? extends TestBase&gt; cmdClass;</span>
-<span class="source-line-no">658</span><span id="line-658">    private String name;</span>
-<span class="source-line-no">659</span><span id="line-659">    private String description;</span>
-<span class="source-line-no">660</span><span id="line-660"></span>
-<span class="source-line-no">661</span><span id="line-661">    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {</span>
-<span class="source-line-no">662</span><span id="line-662">      this.cmdClass = cmdClass;</span>
-<span class="source-line-no">663</span><span id="line-663">      this.name = name;</span>
-<span class="source-line-no">664</span><span id="line-664">      this.description = description;</span>
+<span class="source-line-no">603</span><span id="line-603">    job.setOutputFormatClass(TextOutputFormat.class);</span>
+<span class="source-line-no">604</span><span id="line-604">    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));</span>
+<span class="source-line-no">605</span><span id="line-605"></span>
+<span class="source-line-no">606</span><span id="line-606">    TableMapReduceUtil.addDependencyJars(job);</span>
+<span class="source-line-no">607</span><span id="line-607">    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(), Histogram.class, // yammer</span>
+<span class="source-line-no">608</span><span id="line-608">                                                                                            // metrics</span>
+<span class="source-line-no">609</span><span id="line-609">      Gson.class, // gson</span>
+<span class="source-line-no">610</span><span id="line-610">      FilterAllFilter.class // hbase-server tests jar</span>
+<span class="source-line-no">611</span><span id="line-611">    );</span>
+<span class="source-line-no">612</span><span id="line-612"></span>
+<span class="source-line-no">613</span><span id="line-613">    TableMapReduceUtil.initCredentials(job);</span>
+<span class="source-line-no">614</span><span id="line-614"></span>
+<span class="source-line-no">615</span><span id="line-615">    job.waitForCompletion(true);</span>
+<span class="source-line-no">616</span><span id="line-616">    return job;</span>
+<span class="source-line-no">617</span><span id="line-617">  }</span>
+<span class="source-line-no">618</span><span id="line-618"></span>
+<span class="source-line-no">619</span><span id="line-619">  /**</span>
+<span class="source-line-no">620</span><span id="line-620">   * Each client has one mapper to do the work, and client do the resulting count in a map task.</span>
+<span class="source-line-no">621</span><span id="line-621">   */</span>
+<span class="source-line-no">622</span><span id="line-622"></span>
+<span class="source-line-no">623</span><span id="line-623">  static String JOB_INPUT_FILENAME = "input.txt";</span>
+<span class="source-line-no">624</span><span id="line-624"></span>
+<span class="source-line-no">625</span><span id="line-625">  /*</span>
+<span class="source-line-no">626</span><span id="line-626">   * Write input file of offsets-per-client for the mapreduce job.</span>
+<span class="source-line-no">627</span><span id="line-627">   * @param c Configuration</span>
+<span class="source-line-no">628</span><span id="line-628">   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME</span>
+<span class="source-line-no">629</span><span id="line-629">   */</span>
+<span class="source-line-no">630</span><span id="line-630">  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {</span>
+<span class="source-line-no">631</span><span id="line-631">    return writeInputFile(c, opts, new Path("."));</span>
+<span class="source-line-no">632</span><span id="line-632">  }</span>
+<span class="source-line-no">633</span><span id="line-633"></span>
+<span class="source-line-no">634</span><span id="line-634">  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)</span>
+<span class="source-line-no">635</span><span id="line-635">    throws IOException {</span>
+<span class="source-line-no">636</span><span id="line-636">    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");</span>
+<span class="source-line-no">637</span><span id="line-637">    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));</span>
+<span class="source-line-no">638</span><span id="line-638">    Path inputDir = new Path(jobdir, "inputs");</span>
+<span class="source-line-no">639</span><span id="line-639"></span>
+<span class="source-line-no">640</span><span id="line-640">    FileSystem fs = FileSystem.get(c);</span>
+<span class="source-line-no">641</span><span id="line-641">    fs.mkdirs(inputDir);</span>
+<span class="source-line-no">642</span><span id="line-642"></span>
+<span class="source-line-no">643</span><span id="line-643">    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);</span>
+<span class="source-line-no">644</span><span id="line-644">    PrintStream out = new PrintStream(fs.create(inputFile));</span>
+<span class="source-line-no">645</span><span id="line-645">    // Make input random.</span>
+<span class="source-line-no">646</span><span id="line-646">    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();</span>
+<span class="source-line-no">647</span><span id="line-647">    Hash h = MurmurHash.getInstance();</span>
+<span class="source-line-no">648</span><span id="line-648">    int perClientRows = (opts.totalRows / opts.numClientThreads);</span>
+<span class="source-line-no">649</span><span id="line-649">    try {</span>
+<span class="source-line-no">650</span><span id="line-650">      for (int j = 0; j &lt; opts.numClientThreads; j++) {</span>
+<span class="source-line-no">651</span><span id="line-651">        TestOptions next = new TestOptions(opts);</span>
+<span class="source-line-no">652</span><span id="line-652">        next.startRow = j * perClientRows;</span>
+<span class="source-line-no">653</span><span id="line-653">        next.perClientRunRows = perClientRows;</span>
+<span class="source-line-no">654</span><span id="line-654">        String s = GSON.toJson(next);</span>
+<span class="source-line-no">655</span><span id="line-655">        LOG.info("Client=" + j + ", input=" + s);</span>
+<span class="source-line-no">656</span><span id="line-656">        byte[] b = Bytes.toBytes(s);</span>
+<span class="source-line-no">657</span><span id="line-657">        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);</span>
+<span class="source-line-no">658</span><span id="line-658">        m.put(hash, s);</span>
+<span class="source-line-no">659</span><span id="line-659">      }</span>
+<span class="source-line-no">660</span><span id="line-660">      for (Map.Entry&lt;Integer, String&gt; e : m.entrySet()) {</span>
+<span class="source-line-no">661</span><span id="line-661">        out.println(e.getValue());</span>
+<span class="source-line-no">662</span><span id="line-662">      }</span>
+<span class="source-line-no">663</span><span id="line-663">    } finally {</span>
+<span class="source-line-no">664</span><span id="line-664">      out.close();</span>
 <span class="source-line-no">665</span><span id="line-665">    }</span>
-<span class="source-line-no">666</span><span id="line-666"></span>
-<span class="source-line-no">667</span><span id="line-667">    public Class&lt;? extends TestBase&gt; getCmdClass() {</span>
-<span class="source-line-no">668</span><span id="line-668">      return cmdClass;</span>
-<span class="source-line-no">669</span><span id="line-669">    }</span>
-<span class="source-line-no">670</span><span id="line-670"></span>
-<span class="source-line-no">671</span><span id="line-671">    public String getName() {</span>
-<span class="source-line-no">672</span><span id="line-672">      return name;</span>
-<span class="source-line-no">673</span><span id="line-673">    }</span>
-<span class="source-line-no">674</span><span id="line-674"></span>
-<span class="source-line-no">675</span><span id="line-675">    public String getDescription() {</span>
-<span class="source-line-no">676</span><span id="line-676">      return description;</span>
-<span class="source-line-no">677</span><span id="line-677">    }</span>
-<span class="source-line-no">678</span><span id="line-678">  }</span>
-<span class="source-line-no">679</span><span id="line-679"></span>
-<span class="source-line-no">680</span><span id="line-680">  /**</span>
-<span class="source-line-no">681</span><span id="line-681">   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}. This makes</span>
-<span class="source-line-no">682</span><span id="line-682">   * tracking all these arguments a little easier. NOTE: ADDING AN OPTION, you need to add a data</span>
-<span class="source-line-no">683</span><span id="line-683">   * member, a getter/setter (to make JSON serialization of this TestOptions class behave), and you</span>
-<span class="source-line-no">684</span><span id="line-684">   * need to add to the clone constructor below copying your new option from the 'that' to the</span>
-<span class="source-line-no">685</span><span id="line-685">   * 'this'. Look for 'clone' below.</span>
-<span class="source-line-no">686</span><span id="line-686">   */</span>
-<span class="source-line-no">687</span><span id="line-687">  static class TestOptions {</span>
-<span class="source-line-no">688</span><span id="line-688">    String cmdName = null;</span>
-<span class="source-line-no">689</span><span id="line-689">    boolean nomapred = false;</span>
-<span class="source-line-no">690</span><span id="line-690">    boolean filterAll = false;</span>
-<span class="source-line-no">691</span><span id="line-691">    int startRow = 0;</span>
-<span class="source-line-no">692</span><span id="line-692">    float size = 1.0f;</span>
-<span class="source-line-no">693</span><span id="line-693">    int perClientRunRows = DEFAULT_ROWS_PER_GB;</span>
-<span class="source-line-no">694</span><span id="line-694">    int numClientThreads = 1;</span>
-<span class="source-line-no">695</span><span id="line-695">    int totalRows = DEFAULT_ROWS_PER_GB;</span>
-<span class="source-line-no">696</span><span id="line-696">    int measureAfter = 0;</span>
-<span class="source-line-no">697</span><span id="line-697">    float sampleRate = 1.0f;</span>
-<span class="source-line-no">698</span><span id="line-698">    /**</span>
-<span class="source-line-no">699</span><span id="line-699">     * @deprecated Useless after switching to OpenTelemetry</span>
-<span class="source-line-no">700</span><span id="line-700">     */</span>
-<span class="source-line-no">701</span><span id="line-701">    @Deprecated</span>
-<span class="source-line-no">702</span><span id="line-702">    double traceRate = 0.0;</span>
-<span class="source-line-no">703</span><span id="line-703">    String tableName = TABLE_NAME;</span>
-<span class="source-line-no">704</span><span id="line-704">    boolean flushCommits = true;</span>
-<span class="source-line-no">705</span><span id="line-705">    boolean writeToWAL = true;</span>
-<span class="source-line-no">706</span><span id="line-706">    boolean autoFlush = false;</span>
-<span class="source-line-no">707</span><span id="line-707">    boolean oneCon = false;</span>
-<span class="source-line-no">708</span><span id="line-708">    int connCount = -1; // wil decide the actual num later</span>
-<span class="source-line-no">709</span><span id="line-709">    boolean useTags = false;</span>
-<span class="source-line-no">710</span><span id="line-710">    int noOfTags = 1;</span>
-<span class="source-line-no">711</span><span id="line-711">    boolean reportLatency = false;</span>
-<span class="source-line-no">712</span><span id="line-712">    int multiGet = 0;</span>
-<span class="source-line-no">713</span><span id="line-713">    int multiPut = 0;</span>
-<span class="source-line-no">714</span><span id="line-714">    int randomSleep = 0;</span>
-<span class="source-line-no">715</span><span id="line-715">    boolean inMemoryCF = false;</span>
-<span class="source-line-no">716</span><span id="line-716">    int presplitRegions = 0;</span>
-<span class="source-line-no">717</span><span id="line-717">    int replicas = TableDescriptorBuilder.DEFAULT_REGION_REPLICATION;</span>
-<span class="source-line-no">718</span><span id="line-718">    String splitPolicy = null;</span>
-<span class="source-line-no">719</span><span id="line-719">    Compression.Algorithm compression = Compression.Algorithm.NONE;</span>
-<span class="source-line-no">720</span><span id="line-720">    String encryption = null;</span>
-<span class="source-line-no">721</span><span id="line-721">    BloomType bloomType = BloomType.ROW;</span>
-<span class="source-line-no">722</span><span id="line-722">    int blockSize = HConstants.DEFAULT_BLOCKSIZE;</span>
-<span class="source-line-no">723</span><span id="line-723">    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;</span>
-<span class="source-line-no">724</span><span id="line-724">    boolean valueRandom = false;</span>
-<span class="source-line-no">725</span><span id="line-725">    boolean valueZipf = false;</span>
-<span class="source-line-no">726</span><span id="line-726">    int valueSize = DEFAULT_VALUE_LENGTH;</span>
-<span class="source-line-no">727</span><span id="line-727">    int period = (this.perClientRunRows / 10) == 0 ? perClientRunRows : perClientRunRows / 10;</span>
-<span class="source-line-no">728</span><span id="line-728">    int cycles = 1;</span>
-<span class="source-line-no">729</span><span id="line-729">    int columns = 1;</span>
-<span class="source-line-no">730</span><span id="line-730">    int families = 1;</span>
-<span class="source-line-no">731</span><span id="line-731">    int caching = 30;</span>
-<span class="source-line-no">732</span><span id="line-732">    int latencyThreshold = 0; // in millsecond</span>
-<span class="source-line-no">733</span><span id="line-733">    boolean addColumns = true;</span>
-<span class="source-line-no">734</span><span id="line-734">    MemoryCompactionPolicy inMemoryCompaction =</span>
-<span class="source-line-no">735</span><span id="line-735">      MemoryCompactionPolicy.valueOf(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);</span>
-<span class="source-line-no">736</span><span id="line-736">    boolean asyncPrefetch = false;</span>
-<span class="source-line-no">737</span><span id="line-737">    boolean cacheBlocks = true;</span>
-<span class="source-line-no">738</span><span id="line-738">    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;</span>
-<span class="source-line-no">739</span><span id="line-739">    long bufferSize = 2l * 1024l * 1024l;</span>
-<span class="source-line-no">740</span><span id="line-740">    Properties commandProperties;</span>
-<span class="source-line-no">741</span><span id="line-741"></span>
-<span class="source-line-no">742</span><span id="line-742">    public TestOptions() {</span>
-<span class="source-line-no">743</span><span id="line-743">    }</span>
-<span class="source-line-no">744</span><span id="line-744"></span>
-<span class="source-line-no">745</span><span id="line-745">    /**</span>
-<span class="source-line-no">746</span><span id="line-746">     * Clone constructor.</span>
-<span class="source-line-no">747</span><span id="line-747">     * @param that Object to copy from.</span>
-<span class="source-line-no">748</span><span id="line-748">     */</span>
-<span class="source-line-no">749</span><span id="line-749">    public TestOptions(TestOptions that) {</span>
-<span class="source-line-no">750</span><span id="line-750">      this.cmdName = that.cmdName;</span>
-<span class="source-line-no">751</span><span id="line-751">      this.cycles = that.cycles;</span>
-<span class="source-line-no">752</span><span id="line-752">      this.nomapred = that.nomapred;</span>
-<span class="source-line-no">753</span><span id="line-753">      this.startRow = that.startRow;</span>
-<span class="source-line-no">754</span><span id="line-754">      this.size = that.size;</span>
-<span class="source-line-no">755</span><span id="line-755">      this.perClientRunRows = that.perClientRunRows;</span>
-<span class="source-line-no">756</span><span id="line-756">      this.numClientThreads = that.numClientThreads;</span>
-<span class="source-line-no">757</span><span id="line-757">      this.totalRows = that.totalRows;</span>
-<span class="source-line-no">758</span><span id="line-758">      this.sampleRate = that.sampleRate;</span>
-<span class="source-line-no">759</span><span id="line-759">      this.traceRate = that.traceRate;</span>
-<span class="source-line-no">760</span><span id="line-760">      this.tableName = that.tableName;</span>
-<span class="source-line-no">761</span><span id="line-761">      this.flushCommits = that.flushCommits;</span>
-<span class="source-line-no">762</span><span id="line-762">      this.writeToWAL = that.writeToWAL;</span>
-<span class="source-line-no">763</span><span id="line-763">      this.autoFlush = that.autoFlush;</span>
-<span class="source-line-no">764</span><span id="line-764">      this.oneCon = that.oneCon;</span>
-<span class="source-line-no">765</span><span id="line-765">      this.connCount = that.connCount;</span>
-<span class="source-line-no">766</span><span id="line-766">      this.useTags = that.useTags;</span>
-<span class="source-line-no">767</span><span id="line-767">      this.noOfTags = that.noOfTags;</span>
-<span class="source-line-no">768</span><span id="line-768">      this.reportLatency = that.reportLatency;</span>
-<span class="source-line-no">769</span><span id="line-769">      this.latencyThreshold = that.latencyThreshold;</span>
-<span class="source-line-no">770</span><span id="line-770">      this.multiGet = that.multiGet;</span>
-<span class="source-line-no">771</span><span id="line-771">      this.multiPut = that.multiPut;</span>
-<span class="source-line-no">772</span><span id="line-772">      this.inMemoryCF = that.inMemoryCF;</span>
-<span class="source-line-no">773</span><span id="line-773">      this.presplitRegions = that.presplitRegions;</span>
-<span class="source-line-no">774</span><span id="line-774">      this.replicas = that.replicas;</span>
-<span class="source-line-no">775</span><span id="line-775">      this.splitPolicy = that.splitPolicy;</span>
-<span class="source-line-no">776</span><span id="line-776">      this.compression = that.compression;</span>
-<span class="source-line-no">777</span><span id="line-777">      this.encryption = that.encryption;</span>
-<span class="source-line-no">778</span><span id="line-778">      this.blockEncoding = that.blockEncoding;</span>
-<span class="source-line-no">779</span><span id="line-779">      this.filterAll = that.filterAll;</span>
-<span class="source-line-no">780</span><span id="line-780">      this.bloomType = that.bloomType;</span>
-<span class="source-line-no">781</span><span id="line-781">      this.blockSize = that.blockSize;</span>
-<span class="source-line-no">782</span><span id="line-782">      this.valueRandom = that.valueRandom;</span>
-<span class="source-line-no">783</span><span id="line-783">      this.valueZipf = that.valueZipf;</span>
-<span class="source-line-no">784</span><span id="line-784">      this.valueSize = that.valueSize;</span>
-<span class="source-line-no">785</span><span id="line-785">      this.period = that.period;</span>
-<span class="source-line-no">786</span><span id="line-786">      this.randomSleep = that.randomSleep;</span>
-<span class="source-line-no">787</span><span id="line-787">      this.measureAfter = that.measureAfter;</span>
-<span class="source-line-no">788</span><span id="line-788">      this.addColumns = that.addColumns;</span>
-<span class="source-line-no">789</span><span id="line-789">      this.columns = that.columns;</span>
-<span class="source-line-no">790</span><span id="line-790">      this.families = that.families;</span>
-<span class="source-line-no">791</span><span id="line-791">      this.caching = that.caching;</span>
-<span class="source-line-no">792</span><span id="line-792">      this.inMemoryCompaction = that.inMemoryCompaction;</span>
-<span class="source-line-no">793</span><span id="line-793">      this.asyncPrefetch = that.asyncPrefetch;</span>
-<span class="source-line-no">794</span><span id="line-794">      this.cacheBlocks = that.cacheBlocks;</span>
-<span class="source-line-no">795</span><span id="line-795">      this.scanReadType = that.scanReadType;</span>
-<span class="source-line-no">796</span><span id="line-796">      this.bufferSize = that.bufferSize;</span>
-<span class="source-line-no">797</span><span id="line-797">      this.commandProperties = that.commandProperties;</span>
-<span class="source-line-no">798</span><span id="line-798">    }</span>
-<span class="source-line-no">799</span><span id="line-799"></span>
-<span class="source-line-no">800</span><span id="line-800">    public Properties getCommandProperties() {</span>
-<span class="source-line-no">801</span><span id="line-801">      return commandProperties;</span>
-<span class="source-line-no">802</span><span id="line-802">    }</span>
-<span class="source-line-no">803</span><span id="line-803"></span>
-<span class="source-line-no">804</span><span id="line-804">    public int getCaching() {</span>
-<span class="source-line-no">805</span><span id="line-805">      return this.caching;</span>
-<span class="source-line-no">806</span><span id="line-806">    }</span>
-<span class="source-line-no">807</span><span id="line-807"></span>
-<span class="source-line-no">808</span><span id="line-808">    public void setCaching(final int caching) {</span>
-<span class="source-line-no">809</span><span id="line-809">      this.caching = caching;</span>
-<span class="source-line-no">810</span><span id="line-810">    }</span>
-<span class="source-line-no">811</span><span id="line-811"></span>
-<span class="source-line-no">812</span><span id="line-812">    public int getColumns() {</span>
-<span class="source-line-no">813</span><span id="line-813">      return this.columns;</span>
+<span class="source-line-no">666</span><span id="line-666">    return inputDir;</span>
+<span class="source-line-no">667</span><span id="line-667">  }</span>
+<span class="source-line-no">668</span><span id="line-668"></span>
+<span class="source-line-no">669</span><span id="line-669">  /**</span>
+<span class="source-line-no">670</span><span id="line-670">   * Describes a command.</span>
+<span class="source-line-no">671</span><span id="line-671">   */</span>
+<span class="source-line-no">672</span><span id="line-672">  static class CmdDescriptor {</span>
+<span class="source-line-no">673</span><span id="line-673">    private Class&lt;? extends TestBase&gt; cmdClass;</span>
+<span class="source-line-no">674</span><span id="line-674">    private String name;</span>
+<span class="source-line-no">675</span><span id="line-675">    private String description;</span>
+<span class="source-line-no">676</span><span id="line-676"></span>
+<span class="source-line-no">677</span><span id="line-677">    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {</span>
+<span class="source-line-no">678</span><span id="line-678">      this.cmdClass = cmdClass;</span>
+<span class="source-line-no">679</span><span id="line-679">      this.name = name;</span>
+<span class="source-line-no">680</span><span id="line-680">      this.description = description;</span>
+<span class="source-line-no">681</span><span id="line-681">    }</span>
+<span class="source-line-no">682</span><span id="line-682"></span>
+<span class="source-line-no">683</span><span id="line-683">    public Class&lt;? extends TestBase&gt; getCmdClass() {</span>
+<span class="source-line-no">684</span><span id="line-684">      return cmdClass;</span>
+<span class="source-line-no">685</span><span id="line-685">    }</span>
+<span class="source-line-no">686</span><span id="line-686"></span>
+<span class="source-line-no">687</span><span id="line-687">    public String getName() {</span>
+<span class="source-line-no">688</span><span id="line-688">      return name;</span>
+<span class="source-line-no">689</span><span id="line-689">    }</span>
+<span class="source-line-no">690</span><span id="line-690"></span>
+<span class="source-line-no">691</span><span id="line-691">    public String getDescription() {</span>
+<span class="source-line-no">692</span><span id="line-692">      return description;</span>
+<span class="source-line-no">693</span><span id="line-693">    }</span>
+<span class="source-line-no">694</span><span id="line-694">  }</span>
+<span class="source-line-no">695</span><span id="line-695"></span>
+<span class="source-line-no">696</span><span id="line-696">  /**</span>
+<span class="source-line-no">697</span><span id="line-697">   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}. This makes</span>
+<span class="source-line-no">698</span><span id="line-698">   * tracking all these arguments a little easier. NOTE: ADDING AN OPTION, you need to add a data</span>
+<span class="source-line-no">699</span><span id="line-699">   * member, a getter/setter (to make JSON serialization of this TestOptions class behave), and you</span>
+<span class="source-line-no">700</span><span id="line-700">   * need to add to the clone constructor below copying your new option from the 'that' to the</span>
+<span class="source-line-no">701</span><span id="line-701">   * 'this'. Look for 'clone' below.</span>
+<span class="source-line-no">702</span><span id="line-702">   */</span>
+<span class="source-line-no">703</span><span id="line-703">  static class TestOptions {</span>
+<span class="source-line-no">704</span><span id="line-704">    String cmdName = null;</span>
+<span class="source-line-no">705</span><span id="line-705">    boolean nomapred = false;</span>
+<span class="source-line-no">706</span><span id="line-706">    boolean filterAll = false;</span>
+<span class="source-line-no">707</span><span id="line-707">    int startRow = 0;</span>
+<span class="source-line-no">708</span><span id="line-708">    float size = 1.0f;</span>
+<span class="source-line-no">709</span><span id="line-709">    int perClientRunRows = DEFAULT_ROWS_PER_GB;</span>
+<span class="source-line-no">710</span><span id="line-710">    int numClientThreads = 1;</span>
+<span class="source-line-no">711</span><span id="line-711">    int totalRows = DEFAULT_ROWS_PER_GB;</span>
+<span class="source-line-no">712</span><span id="line-712">    int measureAfter = 0;</span>
+<span class="source-line-no">713</span><span id="line-713">    float sampleRate = 1.0f;</span>
+<span class="source-line-no">714</span><span id="line-714">    /**</span>
+<span class="source-line-no">715</span><span id="line-715">     * @deprecated Useless after switching to OpenTelemetry</span>
+<span class="source-line-no">716</span><span id="line-716">     */</span>
+<span class="source-line-no">717</span><span id="line-717">    @Deprecated</span>
+<span class="source-line-no">718</span><span id="line-718">    double traceRate = 0.0;</span>
+<span class="source-line-no">719</span><span id="line-719">    String tableName = TABLE_NAME;</span>
+<span class="source-line-no">720</span><span id="line-720">    boolean flushCommits = true;</span>
+<span class="source-line-no">721</span><span id="line-721">    boolean writeToWAL = true;</span>
+<span class="source-line-no">722</span><span id="line-722">    boolean autoFlush = false;</span>
+<span class="source-line-no">723</span><span id="line-723">    boolean oneCon = false;</span>
+<span class="source-line-no">724</span><span id="line-724">    int connCount = -1; // wil decide the actual num later</span>
+<span class="source-line-no">725</span><span id="line-725">    boolean useTags = false;</span>
+<span class="source-line-no">726</span><span id="line-726">    int noOfTags = 1;</span>
+<span class="source-line-no">727</span><span id="line-727">    boolean reportLatency = false;</span>
+<span class="source-line-no">728</span><span id="line-728">    int multiGet = 0;</span>
+<span class="source-line-no">729</span><span id="line-729">    int multiPut = 0;</span>
+<span class="source-line-no">730</span><span id="line-730">    int randomSleep = 0;</span>
+<span class="source-line-no">731</span><span id="line-731">    boolean inMemoryCF = false;</span>
+<span class="source-line-no">732</span><span id="line-732">    int presplitRegions = 0;</span>
+<span class="source-line-no">733</span><span id="line-733">    int replicas = TableDescriptorBuilder.DEFAULT_REGION_REPLICATION;</span>
+<span class="source-line-no">734</span><span id="line-734">    String splitPolicy = null;</span>
+<span class="source-line-no">735</span><span id="line-735">    Compression.Algorithm compression = Compression.Algorithm.NONE;</span>
+<span class="source-line-no">736</span><span id="line-736">    String encryption = null;</span>
+<span class="source-line-no">737</span><span id="line-737">    BloomType bloomType = BloomType.ROW;</span>
+<span class="source-line-no">738</span><span id="line-738">    int blockSize = HConstants.DEFAULT_BLOCKSIZE;</span>
+<span class="source-line-no">739</span><span id="line-739">    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;</span>
+<span class="source-line-no">740</span><span id="line-740">    boolean valueRandom = false;</span>
+<span class="source-line-no">741</span><span id="line-741">    boolean valueZipf = false;</span>
+<span class="source-line-no">742</span><span id="line-742">    int valueSize = DEFAULT_VALUE_LENGTH;</span>
+<span class="source-line-no">743</span><span id="line-743">    int period = (this.perClientRunRows / 10) == 0 ? perClientRunRows : perClientRunRows / 10;</span>
+<span class="source-line-no">744</span><span id="line-744">    int cycles = 1;</span>
+<span class="source-line-no">745</span><span id="line-745">    int columns = 1;</span>
+<span class="source-line-no">746</span><span id="line-746">    int families = 1;</span>
+<span class="source-line-no">747</span><span id="line-747">    int caching = 30;</span>
+<span class="source-line-no">748</span><span id="line-748">    int latencyThreshold = 0; // in millsecond</span>
+<span class="source-line-no">749</span><span id="line-749">    boolean addColumns = true;</span>
+<span class="source-line-no">750</span><span id="line-750">    MemoryCompactionPolicy inMemoryCompaction =</span>
+<span class="source-line-no">751</span><span id="line-751">      MemoryCompactionPolicy.valueOf(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);</span>
+<span class="source-line-no">752</span><span id="line-752">    boolean asyncPrefetch = false;</span>
+<span class="source-line-no">753</span><span id="line-753">    boolean cacheBlocks = true;</span>
+<span class="source-line-no">754</span><span id="line-754">    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;</span>
+<span class="source-line-no">755</span><span id="line-755">    long bufferSize = 2l * 1024l * 1024l;</span>
+<span class="source-line-no">756</span><span id="line-756">    Properties commandProperties;</span>
+<span class="source-line-no">757</span><span id="line-757"></span>
+<span class="source-line-no">758</span><span id="line-758">    public TestOptions() {</span>
+<span class="source-line-no">759</span><span id="line-759">    }</span>
+<span class="source-line-no">760</span><span id="line-760"></span>
+<span class="source-line-no">761</span><span id="line-761">    /**</span>
+<span class="source-line-no">762</span><span id="line-762">     * Clone constructor.</span>
+<span class="source-line-no">763</span><span id="line-763">     * @param that Object to copy from.</span>
+<span class="source-line-no">764</span><span id="line-764">     */</span>
+<span class="source-line-no">765</span><span id="line-765">    public TestOptions(TestOptions that) {</span>
+<span class="source-line-no">766</span><span id="line-766">      this.cmdName = that.cmdName;</span>
+<span class="source-line-no">767</span><span id="line-767">      this.cycles = that.cycles;</span>
+<span class="source-line-no">768</span><span id="line-768">      this.nomapred = that.nomapred;</span>
+<span class="source-line-no">769</span><span id="line-769">      this.startRow = that.startRow;</span>
+<span class="source-line-no">770</span><span id="line-770">      this.size = that.size;</span>
+<span class="source-line-no">771</span><span id="line-771">      this.perClientRunRows = that.perClientRunRows;</span>
+<span class="source-line-no">772</span><span id="line-772">      this.numClientThreads = that.numClientThreads;</span>
+<span class="source-line-no">773</span><span id="line-773">      this.totalRows = that.totalRows;</span>
+<span class="source-line-no">774</span><span id="line-774">      this.sampleRate = that.sampleRate;</span>
+<span class="source-line-no">775</span><span id="line-775">      this.traceRate = that.traceRate;</span>
+<span class="source-line-no">776</span><span id="line-776">      this.tableName = that.tableName;</span>
+<span class="source-line-no">777</span><span id="line-777">      this.flushCommits = that.flushCommits;</span>
+<span class="source-line-no">778</span><span id="line-778">      this.writeToWAL = that.writeToWAL;</span>
+<span class="source-line-no">779</span><span id="line-779">      this.autoFlush = that.autoFlush;</span>
+<span class="source-line-no">780</span><span id="line-780">      this.oneCon = that.oneCon;</span>
+<span class="source-line-no">781</span><span id="line-781">      this.connCount = that.connCount;</span>
+<span class="source-line-no">782</span><span id="line-782">      this.useTags = that.useTags;</span>
+<span class="source-line-no">783</span><span id="line-783">      this.noOfTags = that.noOfTags;</span>
+<span class="source-line-no">784</span><span id="line-784">      this.reportLatency = that.reportLatency;</span>
+<span class="source-line-no">785</span><span id="line-785">      this.latencyThreshold = that.latencyThreshold;</span>
+<span class="source-line-no">786</span><span id="line-786">      this.multiGet = that.multiGet;</span>
+<span class="source-line-no">787</span><span id="line-787">      this.multiPut = that.multiPut;</span>
+<span class="source-line-no">788</span><span id="line-788">      this.inMemoryCF = that.inMemoryCF;</span>
+<span class="source-line-no">789</span><span id="line-789">      this.presplitRegions = that.presplitRegions;</span>
+<span class="source-line-no">790</span><span id="line-790">      this.replicas = that.replicas;</span>
+<span class="source-line-no">791</span><span id="line-791">      this.splitPolicy = that.splitPolicy;</span>
+<span class="source-line-no">792</span><span id="line-792">      this.compression = that.compression;</span>
+<span class="source-line-no">793</span><span id="line-793">      this.encryption = that.encryption;</span>
+<span class="source-line-no">794</span><span id="line-794">      this.blockEncoding = that.blockEncoding;</span>
+<span class="source-line-no">795</span><span id="line-795">      this.filterAll = that.filterAll;</span>
+<span class="source-line-no">796</span><span id="line-796">      this.bloomType = that.bloomType;</span>
+<span class="source-line-no">797</span><span id="line-797">      this.blockSize = that.blockSize;</span>
+<span class="source-line-no">798</span><span id="line-798">      this.valueRandom = that.valueRandom;</span>
+<span class="source-line-no">799</span><span id="line-799">      this.valueZipf = that.valueZipf;</span>
+<span class="source-line-no">800</span><span id="line-800">      this.valueSize = that.valueSize;</span>
+<span class="source-line-no">801</span><span id="line-801">      this.period = that.period;</span>
+<span class="source-line-no">802</span><span id="line-802">      this.randomSleep = that.randomSleep;</span>
+<span class="source-line-no">803</span><span id="line-803">      this.measureAfter = that.measureAfter;</span>
+<span class="source-line-no">804</span><span id="line-804">      this.addColumns = that.addColumns;</span>
+<span class="source-line-no">805</span><span id="line-805">      this.columns = that.columns;</span>
+<span class="source-line-no">806</span><span id="line-806">      this.families = that.families;</span>
+<span class="source-line-no">807</span><span id="line-807">      this.caching = that.caching;</span>
+<span class="source-line-no">808</span><span id="line-808">      this.inMemoryCompaction = that.inMemoryCompaction;</span>
+<span class="source-line-no">809</span><span id="line-809">      this.asyncPrefetch = that.asyncPrefetch;</span>
+<span class="source-line-no">810</span><span id="line-810">      this.cacheBlocks = that.cacheBlocks;</span>
+<span class="source-line-no">811</span><span id="line-811">      this.scanReadType = that.scanReadType;</span>
+<span class="source-line-no">812</span><span id="line-812">      this.bufferSize = that.bufferSize;</span>
+<span class="source-line-no">813</span><span id="line-813">      this.commandProperties = that.commandProperties;</span>
 <span class="source-line-no">814</span><span id="line-814">    }</span>
 <span class="source-line-no">815</span><span id="line-815"></span>
-<span class="source-line-no">816</span><span id="line-816">    public void setColumns(final int columns) {</span>
-<span class="source-line-no">817</span><span id="line-817">      this.columns = columns;</span>
+<span class="source-line-no">816</span><span id="line-816">    public Properties getCommandProperties() {</span>
+<span class="source-line-no">817</span><span id="line-817">      return commandProperties;</span>
 <span class="source-line-no">818</span><span id="line-818">    }</span>
 <span class="source-line-no">819</span><span id="line-819"></span>
-<span class="source-line-no">820</span><span id="line-820">    public int getFamilies() {</span>
-<span class="source-line-no">821</span><span id="line-821">      return this.families;</span>
+<span class="source-line-no">820</span><span id="line-820">    public int getCaching() {</span>
+<span class="source-line-no">821</span><span id="line-821">      return this.caching;</span>
 <span class="source-line-no">822</span><span id="line-822">    }</span>
 <span class="source-line-no">823</span><span id="line-823"></span>
-<span class="source-line-no">824</span><span id="line-824">    public void setFamilies(final int families) {</span>
-<span class="source-line-no">825</span><span id="line-825">      this.families = families;</span>
+<span class="source-line-no">824</span><span id="line-824">    public void setCaching(final int caching) {</span>
+<span class="source-line-no">825</span><span id="line-825">      this.caching = caching;</span>
 <span class="source-line-no">826</span><span id="line-826">    }</span>
 <span class="source-line-no">827</span><span id="line-827"></span>
-<span class="source-line-no">828</span><span id="line-828">    public int getCycles() {</span>
-<span class="source-line-no">829</span><span id="line-829">      return this.cycles;</span>
+<span class="source-line-no">828</span><span id="line-828">    public int getColumns() {</span>
+<span class="source-line-no">829</span><span id="line-829">      return this.columns;</span>
 <span class="source-line-no">830</span><span id="line-830">    }</span>
 <span class="source-line-no">831</span><span id="line-831"></span>
-<span class="source-line-no">832</span><span id="line-832">    public void setCycles(final int cycles) {</span>
-<span class="source-line-no">833</span><span id="line-833">      this.cycles = cycles;</span>
+<span class="source-line-no">832</span><span id="line-832">    public void setColumns(final int columns) {</span>
+<span class="source-line-no">833</span><span id="line-833">      this.columns = columns;</span>
 <span class="source-line-no">834</span><span id="line-834">    }</span>
 <span class="source-line-no">835</span><span id="line-835"></span>
-<span class="source-line-no">836</span><span id="line-836">    public boolean isValueZipf() {</span>
-<span class="source-line-no">837</span><span id="line-837">      return valueZipf;</span>
+<span class="source-line-no">836</span><span id="line-836">    public int getFamilies() {</span>
+<span class="source-line-no">837</span><span id="line-837">      return this.families;</span>
 <span class="source-line-no">838</span><span id="line-838">    }</span>
 <span class="source-line-no">839</span><span id="line-839"></span>
-<span class="source-line-no">840</span><span id="line-840">    public void setValueZipf(boolean valueZipf) {</span>
-<span class="source-line-no">841</span><span id="line-841">      this.valueZipf = valueZipf;</span>
+<span class="source-line-no">840</span><span id="line-840">    public void setFamilies(final int families) {</span>
+<span class="source-line-no">841</span><span id="line-841">      this.families = families;</span>
 <span class="source-line-no">842</span><span id="line-842">    }</span>
 <span class="source-line-no">843</span><span id="line-843"></span>
-<span class="source-line-no">844</span><span id="line-844">    public String getCmdName() {</span>
-<span class="source-line-no">845</span><span id="line-845">      return cmdName;</span>
+<span class="source-line-no">844</span><span id="line-844">    public int getCycles() {</span>
+<span class="source-line-no">845</span><span id="line-845">      return this.cycles;</span>
 <span class="source-line-no">846</span><span id="line-846">    }</span>
 <span class="source-line-no">847</span><span id="line-847"></span>
-<span class="source-line-no">848</span><span id="line-848">    public void setCmdName(String cmdName) {</span>
-<span class="source-line-no">849</span><span id="line-849">      this.cmdName = cmdName;</span>
+<span class="source-line-no">848</span><span id="line-848">    public void setCycles(final int cycles) {</span>
+<span class="source-line-no">849</span><span id="line-849">      this.cycles = cycles;</span>
 <span class="source-line-no">850</span><span id="line-850">    }</span>
 <span class="source-line-no">851</span><span id="line-851"></span>
-<span class="source-line-no">852</span><span id="line-852">    public int getRandomSleep() {</span>
-<span class="source-line-no">853</span><span id="line-853">      return randomSleep;</span>
+<span class="source-line-no">852</span><span id="line-852">    public boolean isValueZipf() {</span>
+<span class="source-line-no">853</span><span id="line-853">      return valueZipf;</span>
 <span class="source-line-no">854</span><span id="line-854">    }</span>
 <span class="source-line-no">855</span><span id="line-855"></span>
-<span class="source-line-no">856</span><span id="line-856">    public void setRandomSleep(int randomSleep) {</span>
-<span class="source-line-no">857</span><span id="line-857">      this.randomSleep = randomSleep;</span>
+<span class="source-line-no">856</span><span id="line-856">    public void setValueZipf(boolean valueZipf) {</span>
+<span class="source-line-no">857</span><span id="line-857">      this.valueZipf = valueZipf;</span>
 <span class="source-line-no">858</span><span id="line-858">    }</span>
 <span class="source-line-no">859</span><span id="line-859"></span>
-<span class="source-line-no">860</span><span id="line-860">    public int getReplicas() {</span>
-<span class="source-line-no">861</span><span id="line-861">      return replicas;</span>
+<span class="source-line-no">860</span><span id="line-860">    public String getCmdName() {</span>
+<span class="source-line-no">861</span><span id="line-861">      return cmdName;</span>
 <span class="source-line-no">862</span><span id="line-862">    }</span>
 <span class="source-line-no">863</span><span id="line-863"></span>
-<span class="source-line-no">864</span><span id="line-864">    public void setReplicas(int replicas) {</span>
-<span class="source-line-no">865</span><span id="line-865">      this.replicas = replicas;</span>
+<span class="source-line-no">864</span><span id="line-864">    public void setCmdName(String cmdName) {</span>
+<span class="source-line-no">865</span><span id="line-865">      this.cmdName = cmdName;</span>
 <span class="source-line-no">866</span><span id="line-866">    }</span>
 <span class="source-line-no">867</span><span id="line-867"></span>
-<span class="source-line-no">868</span><span id="line-868">    public String getSplitPolicy() {</span>
-<span class="source-line-no">869</span><span id="line-869">      return splitPolicy;</span>
+<span class="source-line-no">868</span><span id="line-868">    public int getRandomSleep() {</span>
+<span class="source-line-no">869</span><span id="line-869">      return randomSleep;</span>
 <span class="source-line-no">870</span><span id="line-870">    }</span>
 <span class="source-line-no">871</span><span id="line-871"></span>
-<span class="source-line-no">872</span><span id="line-872">    public void setSplitPolicy(String splitPolicy) {</span>
-<span class="source-line-no">873</span><span id="line-873">      this.splitPolicy = splitPolicy;</span>
+<span class="source-line-no">872</span><span id="line-872">    public void setRandomSleep(int randomSleep) {</span>
+<span class="source-line-no">873</span><span id="line-873">      this.randomSleep = randomSleep;</span>
 <span class="source-line-no">874</span><span id="line-874">    }</span>
 <span class="source-line-no">875</span><span id="line-875"></span>
-<span class="source-line-no">876</span><span id="line-876">    public void setNomapred(boolean nomapred) {</span>
-<span class="source-line-no">877</span><span id="line-877">      this.nomapred = nomapred;</span>
+<span class="source-line-no">876</span><span id="line-876">    public int getReplicas() {</span>
+<span class="source-line-no">877</span><span id="line-877">      return replicas;</span>
 <span class="source-line-no">878</span><span id="line-878">    }</span>
 <span class="source-line-no">879</span><span id="line-879"></span>
-<span class="source-line-no">880</span><span id="line-880">    public void setFilterAll(boolean filterAll) {</span>
-<span class="source-line-no">881</span><span id="line-881">      this.filterAll = filterAll;</span>
+<span class="source-line-no">880</span><span id="line-880">    public void setReplicas(int replicas) {</span>
+<span class="source-line-no">881</span><span id="line-881">      this.replicas = replicas;</span>
 <span class="source-line-no">882</span><span id="line-882">    }</span>
 <span class="source-line-no">883</span><span id="line-883"></span>
-<span class="source-line-no">884</span><span id="line-884">    public void setStartRow(int startRow) {</span>
-<span class="source-line-no">885</span><span id="line-885">      this.startRow = startRow;</span>
+<span class="source-line-no">884</span><span id="line-884">    public String getSplitPolicy() {</span>
+<span class="source-line-no">885</span><span id="line-885">      return splitPolicy;</span>
 <span class="source-line-no">886</span><span id="line-886">    }</span>
 <span class="source-line-no">887</span><span id="line-887"></span>
-<span class="source-line-no">888</span><span id="line-888">    public void setSize(float size) {</span>
-<span class="source-line-no">889</span><span id="line-889">      this.size = size;</span>
+<span class="source-line-no">888</span><span id="line-888">    public void setSplitPolicy(String splitPolicy) {</span>
+<span class="source-line-no">889</span><span id="line-889">      this.splitPolicy = splitPolicy;</span>
 <span class="source-line-no">890</span><span id="line-890">    }</span>
 <span class="source-line-no">891</span><span id="line-891"></span>
-<span class="source-line-no">892</span><span id="line-892">    public void setPerClientRunRows(int perClientRunRows) {</span>
-<span class="source-line-no">893</span><span id="line-893">      this.perClientRunRows = perClientRunRows;</span>
+<span class="source-line-no">892</span><span id="line-892">    public void setNomapred(boolean nomapred) {</span>
+<span class="source-line-no">893</span><span id="line-893">      this.nomapred = nomapred;</span>
 <span class="source-line-no">894</span><span id="line-894">    }</span>
 <span class="source-line-no">895</span><span id="line-895"></span>
-<span class="source-line-no">896</span><span id="line-896">    public void setNumClientThreads(int numClientThreads) {</span>
-<span class="source-line-no">897</span><span id="line-897">      this.numClientThreads = numClientThreads;</span>
+<span class="source-line-no">896</span><span id="line-896">    public void setFilterAll(boolean filterAll) {</span>
+<span class="source-line-no">897</span><span id="line-897">      this.filterAll = filterAll;</span>
 <span class="source-line-no">898</span><span id="line-898">    }</span>
 <span class="source-line-no">899</span><span id="line-899"></span>
-<span class="source-line-no">900</span><span id="line-900">    public void setTotalRows(int totalRows) {</span>
-<span class="source-line-no">901</span><span id="line-901">      this.totalRows = totalRows;</span>
+<span class="source-line-no">900</span><span id="line-900">    public void setStartRow(int startRow) {</span>
+<span class="source-line-no">901</span><span id="line-901">      this.startRow = startRow;</span>
 <span class="source-line-no">902</span><span id="line-902">    }</span>
 <span class="source-line-no">903</span><span id="line-903"></span>
-<span class="source-line-no">904</span><span id="line-904">    public void setSampleRate(float sampleRate) {</span>
-<span class="source-line-no">905</span><span id="line-905">      this.sampleRate = sampleRate;</span>
+<span class="source-line-no">904</span><span id="line-904">    public void setSize(float size) {</span>
+<span class="source-line-no">905</span><span id="line-905">      this.size = size;</span>
 <span class="source-line-no">906</span><span id="line-906">    }</span>
 <span class="source-line-no">907</span><span id="line-907"></span>
-<span class="source-line-no">908</span><span id="line-908">    public void setTraceRate(double traceRate) {</span>
-<span class="source-line-no">909</span><span id="line-909">      this.traceRate = traceRate;</span>
+<span class="source-line-no">908</span><span id="line-908">    public void setPerClientRunRows(int perClientRunRows) {</span>
+<span class="source-line-no">909</span><span id="line-909">      this.perClientRunRows = perClientRunRows;</span>
 <span class="source-line-no">910</span><span id="line-910">    }</span>
 <span class="source-line-no">911</span><span id="line-911"></span>
-<span class="source-line-no">912</span><span id="line-912">    public void setTableName(String tableName) {</span>
-<span class="source-line-no">913</span><span id="line-913">      this.tableName = tableName;</span>
+<span class="source-line-no">912</span><span id="line-912">    public void setNumClientThreads(int numClientThreads) {</span>
+<span class="source-line-no">913</span><span id="line-913">      this.numClientThreads = numClientThreads;</span>
 <span class="source-line-no">914</span><span id="line-914">    }</span>
 <span class="source-line-no">915</span><span id="line-915"></span>
-<span class="source-line-no">916</span><span id="line-916">    public void setFlushCommits(boolean flushCommits) {</span>
-<span class="source-line-no">917</span><span id="line-917">      this.flushCommits = flushCommits;</span>
+<span class="source-line-no">916</span><span id="line-916">    public void setTotalRows(int totalRows) {</span>
+<span class="source-line-no">917</span><span id="line-917">      this.totalRows = totalRows;</span>
 <span class="source-line-no">918</span><span id="line-918">    }</span>
 <span class="source-line-no">919</span><span id="line-919"></span>
-<span class="source-line-no">920</span><span id="line-920">    public void setWriteToWAL(boolean writeToWAL) {</span>
-<span class="source-line-no">921</span><span id="line-921">      this.writeToWAL = writeToWAL;</span>
+<span class="source-line-no">920</span><span id="line-920">    public void setSampleRate(float sampleRate) {</span>
+<span class="source-line-no">921</span><span id="line-921">      this.sampleRate = sampleRate;</span>
 <span class="source-line-no">922</span><span id="line-922">    }</span>
 <span class="source-line-no">923</span><span id="line-923"></span>
-<span class="source-line-no">924</span><span id="line-924">    public void setAutoFlush(boolean autoFlush) {</span>
-<span class="source-line-no">925</span><span id="line-925">      this.autoFlush = autoFlush;</span>
+<span class="source-line-no">924</span><span id="line-924">    public void setTraceRate(double traceRate) {</span>
+<span class="source-line-no">925</span><span id="line-925">      this.traceRate = traceRate;</span>
 <span class="source-line-no">926</span><span id="line-926">    }</span>
 <span class="source-line-no">927</span><span id="line-927"></span>
-<span class="source-line-no">928</span><span id="line-928">    public void setOneCon(boolean oneCon) {</span>
-<span class="source-line-no">929</span><span id="line-929">      this.oneCon = oneCon;</span>
+<span class="source-line-no">928</span><span id="line-928">    public void setTableName(String tableName) {</span>
+<span class="source-line-no">929</span><span id="line-929">      this.tableName = tableName;</span>
 <span class="source-line-no">930</span><span id="line-930">    }</span>
 <span class="source-line-no">931</span><span id="line-931"></span>
-<span class="source-line-no">932</span><span id="line-932">    public int getConnCount() {</span>
-<span class="source-line-no">933</span><span id="line-933">      return connCount;</span>
+<span class="source-line-no">932</span><span id="line-932">    public void setFlushCommits(boolean flushCommits) {</span>
+<span class="source-line-no">933</span><span id="line-933">      this.flushCommits = flushCommits;</span>
 <span class="source-line-no">934</span><span id="line-934">    }</span>
 <span class="source-line-no">935</span><span id="line-935"></span>
-<span class="source-line-no">936</span><span id="line-936">    public void setConnCount(int connCount) {</span>
-<span class="source-line-no">937</span><span id="line-937">      this.connCount = connCount;</span>
+<span class="source-line-no">936</span><span id="line-936">    public void setWriteToWAL(boolean writeToWAL) {</span>
+<span class="source-line-no">937</span><span id="line-937">      this.writeToWAL = writeToWAL;</span>
 <span class="source-line-no">938</span><span id="line-938">    }</span>
 <span class="source-line-no">939</span><span id="line-939"></span>
-<span class="source-line-no">940</span><span id="line-940">    public void setUseTags(boolean useTags) {</span>
-<span class="source-line-no">941</span><span id="line-941">      this.useTags = useTags;</span>
+<span class="source-line-no">940</span><span id="line-940">    public void setAutoFlush(boolean autoFlush) {</span>
+<span class="source-line-no">941</span><span id="line-941">      this.autoFlush = autoFlush;</span>
 <span class="source-line-no">942</span><span id="line-942">    }</span>
 <span class="source-line-no">943</span><span id="line-943"></span>
-<span class="source-line-no">944</span><span id="line-944">    public void setNoOfTags(int noOfTags) {</span>
-<span class="source-line-no">945</span><span id="line-945">      this.noOfTags = noOfTags;</span>
+<span class="source-line-no">944</span><span id="line-944">    public void setOneCon(boolean oneCon) {</span>
+<span class="source-line-no">945</span><span id="line-945">      this.oneCon = oneCon;</span>
 <span class="source-line-no">946</span><span id="line-946">    }</span>
 <span class="source-line-no">947</span><span id="line-947"></span>
-<span class="source-line-no">948</span><span id="line-948">    public void setReportLatency(boolean reportLatency) {</span>
-<span class="source-line-no">949</span><span id="line-949">      this.reportLatency = reportLatency;</span>
+<span class="source-line-no">948</span><span id="line-948">    public int getConnCount() {</span>
+<span class="source-line-no">949</span><span id="line-949">      return connCount;</span>
 <span class="source-line-no">950</span><span id="line-950">    }</span>
 <span class="source-line-no">951</span><span id="line-951"></span>
-<span class="source-line-no">952</span><span id="line-952">    public void setMultiGet(int multiGet) {</span>
-<span class="source-line-no">953</span><span id="line-953">      this.multiGet = multiGet;</span>
+<span class="source-line-no">952</span><span id="line-952">    public void setConnCount(int connCount) {</span>
+<span class="source-line-no">953</span><span id="line-953">      this.connCount = connCount;</span>
 <span class="source-line-no">954</span><span id="line-954">    }</span>
 <span class="source-line-no">955</span><span id="line-955"></span>
-<span class="source-line-no">956</span><span id="line-956">    public void setMultiPut(int multiPut) {</span>
-<span class="source-line-no">957</span><span id="line-957">      this.multiPut = multiPut;</span>
+<span class="source-line-no">956</span><span id="line-956">    public void setUseTags(boolean useTags) {</span>
+<span class="source-line-no">957</span><span id="line-957">      this.useTags = useTags;</span>
 <span class="source-line-no">958</span><span id="line-958">    }</span>
 <span class="source-line-no">959</span><span id="line-959"></span>
-<span class="source-line-no">960</span><span id="line-960">    public void setInMemoryCF(boolean inMemoryCF) {</span>
-<span class="source-line-no">961</span><span id="line-961">      this.inMemoryCF = inMemoryCF;</span>
+<span class="source-line-no">960</span><span id="line-960">    public void setNoOfTags(int noOfTags) {</span>
+<span class="source-line-no">961</span><span id="line-961">      this.noOfTags = noOfTags;</span>
 <span class="source-line-no">962</span><span id="line-962">    }</span>
 <span class="source-line-no">963</span><span id="line-963"></span>
-<span class="source-line-no">964</span><span id="line-964">    public void setPresplitRegions(int presplitRegions) {</span>
-<span class="source-line-no">965</span><span id="line-965">      this.presplitRegions = presplitRegions;</span>
+<span class="source-line-no">964</span><span id="line-964">    public void setReportLatency(boolean reportLatency) {</span>
+<span class="source-line-no">965</span><span id="line-965">      this.reportLatency = reportLatency;</span>
 <span class="source-line-no">966</span><span id="line-966">    }</span>
 <span class="source-line-no">967</span><span id="line-967"></span>
-<span class="source-line-no">968</span><span id="line-968">    public void setCompression(Compression.Algorithm compression) {</span>
-<span class="source-line-no">969</span><span id="line-969">      this.compression = compression;</span>
+<span class="source-line-no">968</span><span id="line-968">    public void setMultiGet(int multiGet) {</span>
+<span class="source-line-no">969</span><span id="line-969">      this.multiGet = multiGet;</span>
 <span class="source-line-no">970</span><span id="line-970">    }</span>
 <span class="source-line-no">971</span><span id="line-971"></span>
-<span class="source-line-no">972</span><span id="line-972">    public void setEncryption(String encryption) {</span>
-<span class="source-line-no">973</span><span id="line-973">      this.encryption = encryption;</span>
+<span class="source-line-no">972</span><span id="line-972">    public void setMultiPut(int multiPut) {</span>
+<span class="source-line-no">973</span><span id="line-973">      this.multiPut = multiPut;</span>
 <span class="source-line-no">974</span><span id="line-974">    }</span>
 <span class="source-line-no">975</span><span id="line-975"></span>
-<span class="source-line-no">976</span><span id="line-976">    public void setBloomType(BloomType bloomType) {</span>
-<span class="source-line-no">977</span><span id="line-977">      this.bloomType = bloomType;</span>
+<span class="source-line-no">976</span><span id="line-976">    public void setInMemoryCF(boolean inMemoryCF) {</span>
+<span class="source-line-no">977</span><span id="line-977">      this.inMemoryCF = inMemoryCF;</span>
 <span class="source-line-no">978</span><span id="line-978">    }</span>
 <span class="source-line-no">979</span><span id="line-979"></span>
-<span class="source-line-no">980</span><span id="line-980">    public void setBlockSize(int blockSize) {</span>
-<span class="source-line-no">981</span><span id="line-981">      this.blockSize = blockSize;</span>
+<span class="source-line-no">980</span><span id="line-980">    public void setPresplitRegions(int presplitRegions) {</span>
+<span class="source-line-no">981</span><span id="line-981">      this.presplitRegions = presplitRegions;</span>
 <span class="source-line-no">982</span><span id="line-982">    }</span>
 <span class="source-line-no">983</span><span id="line-983"></span>
-<span class="source-line-no">984</span><span id="line-984">    public void setBlockEncoding(DataBlockEncoding blockEncoding) {</span>
-<span class="source-line-no">985</span><span id="line-985">      this.blockEncoding = blockEncoding;</span>
+<span class="source-line-no">984</span><span id="line-984">    public void setCompression(Compression.Algorithm compression) {</span>
+<span class="source-line-no">985</span><span id="line-985">      this.compression = compression;</span>
 <span class="source-line-no">986</span><span id="line-986">    }</span>
 <span class="source-line-no">987</span><span id="line-987"></span>
-<span class="source-line-no">988</span><span id="line-988">    public void setValueRandom(boolean valueRandom) {</span>
-<span class="source-line-no">989</span><span id="line-989">      this.valueRandom = valueRandom;</span>
+<span class="source-line-no">988</span><span id="line-988">    public void setEncryption(String encryption) {</span>
+<span class="source-line-no">989</span><span id="line-989">      this.encryption = encryption;</span>
 <span class="source-line-no">990</span><span id="line-990">    }</span>
 <span class="source-line-no">991</span><span id="line-991"></span>
-<span class="source-line-no">992</span><span id="line-992">    public void setValueSize(int valueSize) {</span>
-<span class="source-line-no">993</span><span id="line-993">      this.valueSize = valueSize;</span>
+<span class="source-line-no">992</span><span id="line-992">    public void setBloomType(BloomType bloomType) {</span>
+<span class="source-line-no">993</span><span id="line-993">      this.bloomType = bloomType;</span>
 <span class="source-line-no">994</span><span id="line-994">    }</span>
 <span class="source-line-no">995</span><span id="line-995"></span>
-<span class="source-line-no">996</span><span id="line-996">    public void setBufferSize(long bufferSize) {</span>
-<span class="source-line-no">997</span><span id="line-997">      this.bufferSize = bufferSize;</span>
+<span class="source-line-no">996</span><span id="line-996">    public void setBlockSize(int blockSize) {</span>
+<span class="source-line-no">997</span><span id="line-997">      this.blockSize = blockSize;</span>
 <span class="source-line-no">998</span><span id="line-998">    }</span>
 <span class="source-line-no">999</span><span id="line-999"></span>
-<span class="source-line-no">1000</span><span id="line-1000">    public void setPeriod(int period) {</span>
-<span class="source-line-no">1001</span><span id="line-1001">      this.period = period;</span>
+<span class="source-line-no">1000</span><span id="line-1000">    public void setBlockEncoding(DataBlockEncoding blockEncoding) {</span>
+<span class="source-line-no">1001</span><span id="line-1001">      this.blockEncoding = blockEncoding;</span>
 <span class="source-line-no">1002</span><span id="line-1002">    }</span>
 <span class="source-line-no">1003</span><span id="line-1003"></span>
-<span class="source-line-no">1004</span><span id="line-1004">    public boolean isNomapred() {</span>
-<span class="source-line-no">1005</span><span id="line-1005">      return nomapred;</span>
+<span class="source-line-no">1004</span><span id="line-1004">    public void setValueRandom(boolean valueRandom) {</span>
+<span class="source-line-no">1005</span><span id="line-1005">      this.valueRandom = valueRandom;</span>
 <span class="source-line-no">1006</span><span id="line-1006">    }</span>
 <span class="source-line-no">1007</span><span id="line-1007"></span>
-<span class="source-line-no">1008</span><span id="line-1008">    public boolean isFilterAll() {</span>
-<span class="source-line-no">1009</span><span id="line-1009">      return filterAll;</span>
+<span class="source-line-no">1008</span><span id="line-1008">    public void setValueSize(int valueSize) {</span>
+<span class="source-line-no">1009</span><span id="line-1009">      this.valueSize = valueSize;</span>
 <span class="source-line-no">1010</span><span id="line-1010">    }</span>
 <span class="source-line-no">1011</span><span id="line-1011"></span>
-<span class="source-line-no">1012</span><span id="line-1012">    public int getStartRow() {</span>
-<span class="source-line-no">1013</span><span id="line-1013">      return startRow;</span>
+<span class="source-line-no">1012</span><span id="line-1012">    public void setBufferSize(long bufferSize) {</span>
+<span class="source-line-no">1013</span><span id="line-1013">      this.bufferSize = bufferSize;</span>
 <span class="source-line-no">1014</span><span id="line-1014">    }</span>
 <span class="source-line-no">1015</span><span id="line-1015"></span>
-<span class="source-line-no">1016</span><span id="line-1016">    public float getSize() {</span>
-<span class="source-line-no">1017</span><span id="line-1017">      return size;</span>
+<span class="source-line-no">1016</span><span id="line-1016">    public void setPeriod(int period) {</span>
+<span class="source-line-no">1017</span><span id="line-1017">      this.period = period;</span>
 <span class="source-line-no">1018</span><span id="line-1018">    }</span>
 <span class="source-line-no">1019</span><span id="line-1019"></span>
-<span class="source-line-no">1020</span><span id="line-1020">    public int getPerClientRunRows() {</span>
-<span class="source-line-no">1021</span><span id="line-1021">      return perClientRunRows;</span>
+<span class="source-line-no">1020</span><span id="line-1020">    public boolean isNomapred() {</span>
+<span class="source-line-no">1021</span><span id="line-1021">      return nomapred;</span>
 <span class="source-line-no">1022</span><span id="line-1022">    }</span>
 <span class="source-line-no">1023</span><span id="line-1023"></span>
-<span class="source-line-no">1024</span><span id="line-1024">    public int getNumClientThreads() {</span>
-<span class="source-line-no">1025</span><span id="line-1025">      return numClientThreads;</span>
+<span class="source-line-no">1024</span><span id="line-1024">    public boolean isFilterAll() {</span>
+<span class="source-line-no">1025</span><span id="line-1025">      return filterAll;</span>
 <span class="source-line-no">1026</span><span id="line-1026">    }</span>
 <span class="source-line-no">1027</span><span id="line-1027"></span>
-<span class="source-line-no">1028</span><span id="line-1028">    public int getTotalRows() {</span>
-<span class="source-line-no">1029</span><span id="line-1029">      return totalRows;</span>
+<span class="source-line-no">1028</span><span id="line-1028">    public int getStartRow() {</span>
+<span class="source-line-no">1029</span><span id="line-1029">      return startRow;</span>
 <span class="source-line-no">1030</span><span id="line-1030">    }</span>
 <span class="source-line-no">1031</span><span id="line-1031"></span>
-<span class="source-line-no">1032</span><span id="line-1032">    public float getSampleRate() {</span>
-<span class="source-line-no">1033</span><span id="line-1033">      return sampleRate;</span>
+<span class="source-line-no">1032</span><span id="line-1032">    public float getSize() {</span>
+<span class="source-line-no">1033</span><span id="line-1033">      return size;</span>
 <span class="source-line-no">1034</span><span id="line-1034">    }</span>
 <span class="source-line-no">1035</span><span id="line-1035"></span>
-<span class="source-line-no">1036</span><span id="line-1036">    public double getTraceRate() {</span>
-<span class="source-line-no">1037</span><span id="line-1037">      return traceRate;</span>
+<span class="source-line-no">1036</span><span id="line-1036">    public int getPerClientRunRows() {</span>
+<span class="source-line-no">1037</span><span id="line-1037">      return perClientRunRows;</span>
 <span class="source-line-no">1038</span><span id="line-1038">    }</span>
 <span class="source-line-no">1039</span><span id="line-1039"></span>
-<span class="source-line-no">1040</span><span id="line-1040">    public String getTableName() {</span>
-<span class="source-line-no">1041</span><span id="line-1041">      return tableName;</span>
+<span class="source-line-no">1040</span><span id="line-1040">    public int getNumClientThreads() {</span>
+<span class="source-line-no">1041</span><span id="line-1041">      return numClientThreads;</span>
 <span class="source-line-no">1042</span><span id="line-1042">    }</span>
 <span class="source-line-no">1043</span><span id="line-1043"></span>
-<span class="source-line-no">1044</span><span id="line-1044">    public boolean isFlushCommits() {</span>
-<span class="source-line-no">1045</span><span id="line-1045">      return flushCommits;</span>
+<span class="source-line-no">1044</span><span id="line-1044">    public int getTotalRows() {</span>
+<span class="source-line-no">1045</span><span id="line-1045">      return totalRows;</span>
 <span class="source-line-no">1046</span><span id="line-1046">    }</span>
 <span class="source-line-no">1047</span><span id="line-1047"></span>
-<span class="source-line-no">1048</span><span id="line-1048">    public boolean isWriteToWAL() {</span>
-<span class="source-line-no">1049</span><span id="line-1049">      return writeToWAL;</span>
+<span class="source-line-no">1048</span><span id="line-1048">    public float getSampleRate() {</span>
+<span class="source-line-no">1049</span><span id="line-1049">      return sampleRate;</span>
 <span class="source-line-no">1050</span><span id="line-1050">    }</span>
 <span class="source-line-no">1051</span><span id="line-1051"></span>
-<span class="source-line-no">1052</span><span id="line-1052">    public boolean isAutoFlush() {</span>
-<span class="source-line-no">1053</span><span id="line-1053">      return autoFlush;</span>
+<span class="source-line-no">1052</span><span id="line-1052">    public double getTraceRate() {</span>
+<span class="source-line-no">1053</span><span id="line-1053">      return traceRate;</span>
 <span class="source-line-no">1054</span><span id="line-1054">    }</span>
 <span class="source-line-no">1055</span><span id="line-1055"></span>
-<span class="source-line-no">1056</span><span id="line-1056">    public boolean isUseTags() {</span>
-<span class="source-line-no">1057</span><span id="line-1057">      return useTags;</span>
+<span class="source-line-no">1056</span><span id="line-1056">    public String getTableName() {</span>
+<span class="source-line-no">1057</span><span id="line-1057">      return tableName;</span>
 <span class="source-line-no">1058</span><span id="line-1058">    }</span>
 <span class="source-line-no">1059</span><span id="line-1059"></span>
-<span class="source-line-no">1060</span><span id="line-1060">    public int getNoOfTags() {</span>
-<span class="source-line-no">1061</span><span id="line-1061">      return noOfTags;</span>
+<span class="source-line-no">1060</span><span id="line-1060">    public boolean isFlushCommits() {</span>
+<span class="source-line-no">1061</span><span id="line-1061">      return flushCommits;</span>
 <span class="source-line-no">1062</span><span id="line-1062">    }</span>
 <span class="source-line-no">1063</span><span id="line-1063"></span>
-<span class="source-line-no">1064</span><span id="line-1064">    public boolean isReportLatency() {</span>
-<span class="source-line-no">1065</span><span id="line-1065">      return reportLatency;</span>
+<span class="source-line-no">1064</span><span id="line-1064">    public boolean isWriteToWAL() {</span>
+<span class="source-line-no">1065</span><span id="line-1065">      return writeToWAL;</span>
 <span class="source-line-no">1066</span><span id="line-1066">    }</span>
 <span class="source-line-no">1067</span><span id="line-1067"></span>
-<span class="source-line-no">1068</span><span id="line-1068">    public int getMultiGet() {</span>
-<span class="source-line-no">1069</span><span id="line-1069">      return multiGet;</span>
+<span class="source-line-no">1068</span><span id="line-1068">    public boolean isAutoFlush() {</span>
+<span class="source-line-no">1069</span><span id="line-1069">      return autoFlush;</span>
 <span class="source-line-no">1070</span><span id="line-1070">    }</span>
 <span class="source-line-no">1071</span><span id="line-1071"></span>
-<span class="source-line-no">1072</span><span id="line-1072">    public int getMultiPut() {</span>
-<span class="source-line-no">1073</span><span id="line-1073">      return multiPut;</span>
+<span class="source-line-no">1072</span><span id="line-1072">    public boolean isUseTags() {</span>
+<span class="source-line-no">1073</span><span id="line-1073">      return useTags;</span>
 <span class="source-line-no">1074</span><span id="line-1074">    }</span>
 <span class="source-line-no">1075</span><span id="line-1075"></span>
-<span class="source-line-no">1076</span><span id="line-1076">    public boolean isInMemoryCF() {</span>
-<span class="source-line-no">1077</span><span id="line-1077">      return inMemoryCF;</span>
+<span class="source-line-no">1076</span><span id="line-1076">    public int getNoOfTags() {</span>
+<span class="source-line-no">1077</span><span id="line-1077">      return noOfTags;</span>
 <span class="source-line-no">1078</span><span id="line-1078">    }</span>
 <span class="source-line-no">1079</span><span id="line-1079"></span>
-<span class="source-line-no">1080</span><span id="line-1080">    public int getPresplitRegions() {</span>
-<span class="source-line-no">1081</span><span id="line-1081">      return presplitRegions;</span>
+<span class="source-line-no">1080</span><span id="line-1080">    public boolean isReportLatency() {</span>
+<span class="source-line-no">1081</span><span id="line-1081">      return reportLatency;</span>
 <span class="source-line-no">1082</span><span id="line-1082">    }</span>
 <span class="source-line-no">1083</span><span id="line-1083"></span>
-<span class="source-line-no">1084</span><span id="line-1084">    public Compression.Algorithm getCompression() {</span>
-<span class="source-line-no">1085</span><span id="line-1085">      return compression;</span>
+<span class="source-line-no">1084</span><span id="line-1084">    public int getMultiGet() {</span>
+<span class="source-line-no">1085</span><span id="line-1085">      return multiGet;</span>
 <span class="source-line-no">1086</span><span id="line-1086">    }</span>
 <span class="source-line-no">1087</span><span id="line-1087"></span>
-<span class="source-line-no">1088</span><span id="line-1088">    public String getEncryption() {</span>
-<span class="source-line-no">1089</span><span id="line-1089">      return encryption;</span>
+<span class="source-line-no">1088</span><span id="line-1088">    public int getMultiPut() {</span>
+<span class="source-line-no">1089</span><span id="line-1089">      return multiPut;</span>
 <span class="source-line-no">1090</span><span id="line-1090">    }</span>
 <span class="source-line-no">1091</span><span id="line-1091"></span>
-<span class="source-line-no">1092</span><span id="line-1092">    public DataBlockEncoding getBlockEncoding() {</span>
-<span class="source-line-no">1093</span><span id="line-1093">      return blockEncoding;</span>
+<span class="source-line-no">1092</span><span id="line-1092">    public boolean isInMemoryCF() {</span>
+<span class="source-line-no">1093</span><span id="line-1093">      return inMemoryCF;</span>
 <span class="source-line-no">1094</span><span id="line-1094">    }</span>
 <span class="source-line-no">1095</span><span id="line-1095"></span>
-<span class="source-line-no">1096</span><span id="line-1096">    public boolean isValueRandom() {</span>
-<span class="source-line-no">1097</span><span id="line-1097">      return valueRandom;</span>
+<span class="source-line-no">1096</span><span id="line-1096">    public int getPresplitRegions() {</span>
+<span class="source-line-no">1097</span><span id="line-1097">      return presplitRegions;</span>
 <span class="source-line-no">1098</span><span id="line-1098">    }</span>
 <span class="source-line-no">1099</span><span id="line-1099"></span>
-<span class="source-line-no">1100</span><span id="line-1100">    public int getValueSize() {</span>
-<span class="source-line-no">1101</span><span id="line-1101">      return valueSize;</span>
+<span class="source-line-no">1100</span><span id="line-1100">    public Compression.Algorithm getCompression() {</span>
+<span class="source-line-no">1101</span><span id="line-1101">      return compression;</span>
 <span class="source-line-no">1102</span><span id="line-1102">    }</span>
 <span class="source-line-no">1103</span><span id="line-1103"></span>
-<span class="source-line-no">1104</span><span id="line-1104">    public int getPeriod() {</span>
-<span class="source-line-no">1105</span><span id="line-1105">      return period;</span>
+<span class="source-line-no">1104</span><span id="line-1104">    public String getEncryption() {</span>
+<span class="source-line-no">1105</span><span id="line-1105">      return encryption;</span>
 <span class="source-line-no">1106</span><span id="line-1106">    }</span>
 <span class="source-line-no">1107</span><span id="line-1107"></span>
-<span class="source-line-no">1108</span><span id="line-1108">    public BloomType getBloomType() {</span>
-<span class="source-line-no">1109</span><span id="line-1109">      return bloomType;</span>
+<span class="source-line-no">1108</span><span id="line-1108">    public DataBlockEncoding getBlockEncoding() {</span>
+<span class="source-line-no">1109</span><span id="line-1109">      return blockEncoding;</span>
 <span class="source-line-no">1110</span><span id="line-1110">    }</span>
 <span class="source-line-no">1111</span><span id="line-1111"></span>
-<span class="source-line-no">1112</span><span id="line-1112">    public int getBlockSize() {</span>
-<span class="source-line-no">1113</span><span id="line-1113">      return blockSize;</span>
+<span class="source-line-no">1112</span><span id="line-1112">    public boolean isValueRandom() {</span>
+<span class="source-line-no">1113</span><span id="line-1113">      return valueRandom;</span>
 <span class="source-line-no">1114</span><span id="line-1114">    }</span>
 <span class="source-line-no">1115</span><span id="line-1115"></span>
-<span class="source-line-no">1116</span><span id="line-1116">    public boolean isOneCon() {</span>
-<span class="source-line-no">1117</span><span id="line-1117">      return oneCon;</span>
+<span class="source-line-no">1116</span><span id="line-1116">    public int getValueSize() {</span>
+<span class="source-line-no">1117</span><span id="line-1117">      return valueSize;</span>
 <span class="source-line-no">1118</span><span id="line-1118">    }</span>
 <span class="source-line-no">1119</span><span id="line-1119"></span>
-<span class="source-line-no">1120</span><span id="line-1120">    public int getMeasureAfter() {</span>
-<span class="source-line-no">1121</span><span id="line-1121">      return measureAfter;</span>
+<span class="source-line-no">1120</span><span id="line-1120">    public int getPeriod() {</span>
+<span class="source-line-no">1121</span><span id="line-1121">      return period;</span>
 <span class="source-line-no">1122</span><span id="line-1122">    }</span>
 <span class="source-line-no">1123</span><span id="line-1123"></span>
-<span class="source-line-no">1124</span><span id="line-1124">    public void setMeasureAfter(int measureAfter) {</span>
-<span class="source-line-no">1125</span><span id="line-1125">      this.measureAfter = measureAfter;</span>
+<span class="source-line-no">1124</span><span id="line-1124">    public BloomType getBloomType() {</span>
+<span class="source-line-no">1125</span><span id="line-1125">      return bloomType;</span>
 <span class="source-line-no">1126</span><span id="line-1126">    }</span>
 <span class="source-line-no">1127</span><span id="line-1127"></span>
-<span class="source-line-no">1128</span><span id="line-1128">    public boolean getAddColumns() {</span>
-<span class="source-line-no">1129</span><span id="line-1129">      return addColumns;</span>
+<span class="source-line-no">1128</span><span id="line-1128">    public int getBlockSize() {</span>
+<span class="source-line-no">1129</span><span id="line-1129">      return blockSize;</span>
 <span class="source-line-no">1130</span><span id="line-1130">    }</span>
 <span class="source-line-no">1131</span><span id="line-1131"></span>
-<span class="source-line-no">1132</span><span id="line-1132">    public void setAddColumns(boolean addColumns) {</span>
-<span class="source-line-no">1133</span><span id="line-1133">      this.addColumns = addColumns;</span>
+<span class="source-line-no">1132</span><span id="line-1132">    public boolean isOneCon() {</span>
+<span class="source-line-no">1133</span><span id="line-1133">      return oneCon;</span>
 <span class="source-line-no">1134</span><span id="line-1134">    }</span>
 <span class="source-line-no">1135</span><span id="line-1135"></span>
-<span class="source-line-no">1136</span><span id="line-1136">    public void setInMemoryCompaction(MemoryCompactionPolicy inMemoryCompaction) {</span>
-<span class="source-line-no">1137</span><span id="line-1137">      this.inMemoryCompaction = inMemoryCompaction;</span>
+<span class="source-line-no">1136</span><span id="line-1136">    public int getMeasureAfter() {</span>
+<span class="source-line-no">1137</span><span id="line-1137">      return measureAfter;</span>
 <span class="source-line-no">1138</span><span id="line-1138">    }</span>
 <span class="source-line-no">1139</span><span id="line-1139"></span>
-<span class="source-line-no">1140</span><span id="line-1140">    public MemoryCompactionPolicy getInMemoryCompaction() {</span>
-<span class="source-line-no">1141</span><span id="line-1141">      return this.inMemoryCompaction;</span>
+<span class="source-line-no">1140</span><span id="line-1140">    public void setMeasureAfter(int measureAfter) {</span>
+<span class="source-line-no">1141</span><span id="line-1141">      this.measureAfter = measureAfter;</span>
 <span class="source-line-no">1142</span><span id="line-1142">    }</span>
 <span class="source-line-no">1143</span><span id="line-1143"></span>
-<span class="source-line-no">1144</span><span id="line-1144">    public long getBufferSize() {</span>
-<span class="source-line-no">1145</span><span id="line-1145">      return this.bufferSize;</span>
+<span class="source-line-no">1144</span><span id="line-1144">    public boolean getAddColumns() {</span>
+<span class="source-line-no">1145</span><span id="line-1145">      return addColumns;</span>
 <span class="source-line-no">1146</span><span id="line-1146">    }</span>
-<span class="source-line-no">1147</span><span id="line-1147">  }</span>
-<span class="source-line-no">1148</span><span id="line-1148"></span>
-<span class="source-line-no">1149</span><span id="line-1149">  /*</span>
-<span class="source-line-no">1150</span><span id="line-1150">   * A test. Subclass to particularize what happens per row.</span>
-<span class="source-line-no">1151</span><span id="line-1151">   */</span>
-<span class="source-line-no">1152</span><span id="line-1152">  static abstract class TestBase {</span>
-<span class="source-line-no">1153</span><span id="line-1153">    // Below is make it so when Tests are all running in the one</span>
-<span class="source-line-no">1154</span><span id="line-1154">    // jvm, that they each have a differently seeded Random.</span>
-<span class="source-line-no">1155</span><span id="line-1155">    private static final Random randomSeed = new Random(EnvironmentEdgeManager.currentTime());</span>
-<span class="source-line-no">1156</span><span id="line-1156"></span>
-<span class="source-line-no">1157</span><span id="line-1157">    private static long nextRandomSeed() {</span>
-<span class="source-line-no">1158</span><span id="line-1158">      return randomSeed.nextLong();</span>
-<span class="source-line-no">1159</span><span id="line-1159">    }</span>
-<span class="source-line-no">1160</span><span id="line-1160"></span>
-<span class="source-line-no">1161</span><span id="line-1161">    private final int everyN;</span>
-<span class="source-line-no">1162</span><span id="line-1162"></span>
-<span class="source-line-no">1163</span><span id="line-1163">    protected final Random rand = new Random(nextRandomSeed());</span>
-<span class="source-line-no">1164</span><span id="line-1164">    protected final Configuration conf;</span>
-<span class="source-line-no">1165</span><span id="line-1165">    protected final TestOptions opts;</span>
-<span class="source-line-no">1166</span><span id="line-1166"></span>
-<span class="source-line-no">1167</span><span id="line-1167">    protected final Status status;</span>
-<span class="source-line-no">1168</span><span id="line-1168"></span>
-<span class="source-line-no">1169</span><span id="line-1169">    private String testName;</span>
-<span class="source-line-no">1170</span><span id="line-1170">    protected Histogram latencyHistogram;</span>
-<span class="source-line-no">1171</span><span id="line-1171">    private Histogram replicaLatencyHistogram;</span>
-<span class="source-line-no">1172</span><span id="line-1172">    private Histogram valueSizeHistogram;</span>
-<span class="source-line-no">1173</span><span id="line-1173">    private Histogram rpcCallsHistogram;</span>
-<span class="source-line-no">1174</span><span id="line-1174">    private Histogram remoteRpcCallsHistogram;</span>
-<span class="source-line-no">1175</span><span id="line-1175">    private Histogram millisBetweenNextHistogram;</span>
-<span class="source-line-no">1176</span><span id="line-1176">    private Histogram regionsScannedHistogram;</span>
-<span class="source-line-no">1177</span><span id="line-1177">    private Histogram bytesInResultsHistogram;</span>
-<span class="source-line-no">1178</span><span id="line-1178">    private Histogram bytesInRemoteResultsHistogram;</span>
-<span class="source-line-no">1179</span><span id="line-1179">    private RandomDistribution.Zipf zipf;</span>
-<span class="source-line-no">1180</span><span id="line-1180">    private long numOfReplyOverLatencyThreshold = 0;</span>
-<span class="source-line-no">1181</span><span id="line-1181">    private long numOfReplyFromReplica = 0;</span>
+<span class="source-line-no">1147</span><span id="line-1147"></span>
+<span class="source-line-no">1148</span><span id="line-1148">    public void setAddColumns(boolean addColumns) {</span>
+<span class="source-line-no">1149</span><span id="line-1149">      this.addColumns = addColumns;</span>
+<span class="source-line-no">1150</span><span id="line-1150">    }</span>
+<span class="source-line-no">1151</span><span id="line-1151"></span>
+<span class="source-line-no">1152</span><span id="line-1152">    public void setInMemoryCompaction(MemoryCompactionPolicy inMemoryCompaction) {</span>
+<span class="source-line-no">1153</span><span id="line-1153">      this.inMemoryCompaction = inMemoryCompaction;</span>
+<span class="source-line-no">1154</span><span id="line-1154">    }</span>
+<span class="source-line-no">1155</span><span id="line-1155"></span>
+<span class="source-line-no">1156</span><span id="line-1156">    public MemoryCompactionPolicy getInMemoryCompaction() {</span>
+<span class="source-line-no">1157</span><span id="line-1157">      return this.inMemoryCompaction;</span>
+<span class="source-line-no">1158</span><span id="line-1158">    }</span>
+<span class="source-line-no">1159</span><span id="line-1159"></span>
+<span class="source-line-no">1160</span><span id="line-1160">    public long getBufferSize() {</span>
+<span class="source-line-no">1161</span><span id="line-1161">      return this.bufferSize;</span>
+<span class="source-line-no">1162</span><span id="line-1162">    }</span>
+<span class="source-line-no">1163</span><span id="line-1163">  }</span>
+<span class="source-line-no">1164</span><span id="line-1164"></span>
+<span class="source-line-no">1165</span><span id="line-1165">  /*</span>
+<span class="source-line-no">1166</span><span id="line-1166">   * A test. Subclass to particularize what happens per row.</span>
+<span class="source-line-no">1167</span><span id="line-1167">   */</span>
+<span class="source-line-no">1168</span><span id="line-1168">  static abstract class TestBase {</span>
+<span class="source-line-no">1169</span><span id="line-1169">    // Below is make it so when Tests are all running in the one</span>
+<span class="source-line-no">1170</span><span id="line-1170">    // jvm, that they each have a differently seeded Random.</span>
+<span class="source-line-no">1171</span><span id="line-1171">    private static final Random randomSeed = new Random(EnvironmentEdgeManager.currentTime());</span>
+<span class="source-line-no">1172</span><span id="line-1172"></span>
+<span class="source-line-no">1173</span><span id="line-1173">    private static long nextRandomSeed() {</span>
+<span class="source-line-no">1174</span><span id="line-1174">      return randomSeed.nextLong();</span>
+<span class="source-line-no">1175</span><span id="line-1175">    }</span>
+<span class="source-line-no">1176</span><span id="line-1176"></span>
+<span class="source-line-no">1177</span><span id="line-1177">    private final int everyN;</span>
+<span class="source-line-no">1178</span><span id="line-1178"></span>
+<span class="source-line-no">1179</span><span id="line-1179">    protected final Random rand = new Random(nextRandomSeed());</span>
+<span class="source-line-no">1180</span><span id="line-1180">    protected final Configuration conf;</span>
+<span class="source-line-no">1181</span><span id="line-1181">    protected final TestOptions opts;</span>
 <span class="source-line-no">1182</span><span id="line-1182"></span>
-<span class="source-line-no">1183</span><span id="line-1183">    /**</span>
-<span class="source-line-no">1184</span><span id="line-1184">     * Note that all subclasses of this class must provide a public constructor that has the exact</span>
-<span class="source-line-no">1185</span><span id="line-1185">     * same list of arguments.</span>
-<span class="source-line-no">1186</span><span id="line-1186">     */</span>
-<span class="source-line-no">1187</span><span id="line-1187">    TestBase(final Configuration conf, final TestOptions options, final Status status) {</span>
-<span class="source-line-no">1188</span><span id="line-1188">      this.conf = conf;</span>
-<span class="source-line-no">1189</span><span id="line-1189">      this.opts = options;</span>
-<span class="source-line-no">1190</span><span id="line-1190">      this.status = status;</span>
-<span class="source-line-no">1191</span><span id="line-1191">      this.testName = this.getClass().getSimpleName();</span>
-<span class="source-line-no">1192</span><span id="line-1192">      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));</span>
-<span class="source-line-no">1193</span><span id="line-1193">      if (options.isValueZipf()) {</span>
-<span class="source-line-no">1194</span><span id="line-1194">        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);</span>
-<span class="source-line-no">1195</span><span id="line-1195">      }</span>
-<span class="source-line-no">1196</span><span id="line-1196">      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");</span>
-<span class="source-line-no">1197</span><span id="line-1197">    }</span>
+<span class="source-line-no">1183</span><span id="line-1183">    protected final Status status;</span>
+<span class="source-line-no">1184</span><span id="line-1184"></span>
+<span class="source-line-no">1185</span><span id="line-1185">    private String testName;</span>
+<span class="source-line-no">1186</span><span id="line-1186">    protected Histogram latencyHistogram;</span>
+<span class="source-line-no">1187</span><span id="line-1187">    private Histogram replicaLatencyHistogram;</span>
+<span class="source-line-no">1188</span><span id="line-1188">    private Histogram valueSizeHistogram;</span>
+<span class="source-line-no">1189</span><span id="line-1189">    private Histogram rpcCallsHistogram;</span>
+<span class="source-line-no">1190</span><span id="line-1190">    private Histogram remoteRpcCallsHistogram;</span>
+<span class="source-line-no">1191</span><span id="line-1191">    private Histogram millisBetweenNextHistogram;</span>
+<span class="source-line-no">1192</span><span id="line-1192">    private Histogram regionsScannedHistogram;</span>
+<span class="source-line-no">1193</span><span id="line-1193">    private Histogram bytesInResultsHistogram;</span>
+<span class="source-line-no">1194</span><span id="line-1194">    private Histogram bytesInRemoteResultsHistogram;</span>
+<span class="source-line-no">1195</span><span id="line-1195">    private RandomDistribution.Zipf zipf;</span>
+<span class="source-line-no">1196</span><span id="line-1196">    private long numOfReplyOverLatencyThreshold = 0;</span>
+<span class="source-line-no">1197</span><span id="line-1197">    private long numOfReplyFromReplica = 0;</span>
 <span class="source-line-no">1198</span><span id="line-1198"></span>
-<span class="source-line-no">1199</span><span id="line-1199">    int getValueLength(final Random r) {</span>
-<span class="source-line-no">1200</span><span id="line-1200">      if (this.opts.isValueRandom()) {</span>
-<span class="source-line-no">1201</span><span id="line-1201">        return r.nextInt(opts.valueSize);</span>
-<span class="source-line-no">1202</span><span id="line-1202">      } else if (this.opts.isValueZipf()) {</span>
-<span class="source-line-no">1203</span><span id="line-1203">        return Math.abs(this.zipf.nextInt());</span>
-<span class="source-line-no">1204</span><span id="line-1204">      } else {</span>
-<span class="source-line-no">1205</span><span id="line-1205">        return opts.valueSize;</span>
-<span class="source-line-no">1206</span><span id="line-1206">      }</span>
-<span class="source-line-no">1207</span><span id="line-1207">    }</span>
-<span class="source-line-no">1208</span><span id="line-1208"></span>
-<span class="source-line-no">1209</span><span id="line-1209">    void updateValueSize(final Result[] rs) throws IOException {</span>
-<span class="source-line-no">1210</span><span id="line-1210">      updateValueSize(rs, 0);</span>
-<span class="source-line-no">1211</span><span id="line-1211">    }</span>
-<span class="source-line-no">1212</span><span id="line-1212"></span>
-<span class="source-line-no">1213</span><span id="line-1213">    void updateValueSize(final Result[] rs, final long latency) throws IOException {</span>
-<span class="source-line-no">1214</span><span id="line-1214">      if (rs == null || (latency == 0)) return;</span>
-<span class="source-line-no">1215</span><span id="line-1215">      for (Result r : rs)</span>
-<span class="source-line-no">1216</span><span id="line-1216">        updateValueSize(r, latency);</span>
-<span class="source-line-no">1217</span><span id="line-1217">    }</span>
-<span class="source-line-no">1218</span><span id="line-1218"></span>
-<span class="source-line-no">1219</span><span id="line-1219">    void updateValueSize(final Result r) throws IOException {</span>
-<span class="source-line-no">1220</span><span id="line-1220">      updateValueSize(r, 0);</span>
-<span class="source-line-no">1221</span><span id="line-1221">    }</span>
-<span class="source-line-no">1222</span><span id="line-1222"></span>
-<span class="source-line-no">1223</span><span id="line-1223">    void updateValueSize(final Result r, final long latency) throws IOException {</span>
-<span class="source-line-no">1224</span><span id="line-1224">      if (r == null || (latency == 0)) return;</span>
-<span class="source-line-no">1225</span><span id="line-1225">      int size = 0;</span>
-<span class="source-line-no">1226</span><span id="line-1226">      // update replicaHistogram</span>
-<span class="source-line-no">1227</span><span id="line-1227">      if (r.isStale()) {</span>
-<span class="source-line-no">1228</span><span id="line-1228">        replicaLatencyHistogram.update(latency / 1000);</span>
-<span class="source-line-no">1229</span><span id="line-1229">        numOfReplyFromReplica++;</span>
-<span class="source-line-no">1230</span><span id="line-1230">      }</span>
-<span class="source-line-no">1231</span><span id="line-1231">      if (!isRandomValueSize()) return;</span>
-<span class="source-line-no">1232</span><span id="line-1232"></span>
-<span class="source-line-no">1233</span><span id="line-1233">      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {</span>
-<span class="source-line-no">1234</span><span id="line-1234">        size += scanner.current().getValueLength();</span>
-<span class="source-line-no">1235</span><span id="line-1235">      }</span>
-<span class="source-line-no">1236</span><span id="line-1236">      updateValueSize(size);</span>
+<span class="source-line-no">1199</span><span id="line-1199">    /**</span>
+<span class="source-line-no">1200</span><span id="line-1200">     * Note that all subclasses of this class must provide a public constructor that has the exact</span>
+<span class="source-line-no">1201</span><span id="line-1201">     * same list of arguments.</span>
+<span class="source-line-no">1202</span><span id="line-1202">     */</span>
+<span class="source-line-no">1203</span><span id="line-1203">    TestBase(final Configuration conf, final TestOptions options, final Status status) {</span>
+<span class="source-line-no">1204</span><span id="line-1204">      this.conf = conf;</span>
+<span class="source-line-no">1205</span><span id="line-1205">      this.opts = options;</span>
+<span class="source-line-no">1206</span><span id="line-1206">      this.status = status;</span>
+<span class="source-line-no">1207</span><span id="line-1207">      this.testName = this.getClass().getSimpleName();</span>
+<span class="source-line-no">1208</span><span id="line-1208">      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));</span>
+<span class="source-line-no">1209</span><span id="line-1209">      if (options.isValueZipf()) {</span>
+<span class="source-line-no">1210</span><span id="line-1210">        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);</span>
+<span class="source-line-no">1211</span><span id="line-1211">      }</span>
+<span class="source-line-no">1212</span><span id="line-1212">      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");</span>
+<span class="source-line-no">1213</span><span id="line-1213">    }</span>
+<span class="source-line-no">1214</span><span id="line-1214"></span>
+<span class="source-line-no">1215</span><span id="line-1215">    int getValueLength(final Random r) {</span>
+<span class="source-line-no">1216</span><span id="line-1216">      if (this.opts.isValueRandom()) {</span>
+<span class="source-line-no">1217</span><span id="line-1217">        return r.nextInt(opts.valueSize);</span>
+<span class="source-line-no">1218</span><span id="line-1218">      } else if (this.opts.isValueZipf()) {</span>
+<span class="source-line-no">1219</span><span id="line-1219">        return Math.abs(this.zipf.nextInt());</span>
+<span class="source-line-no">1220</span><span id="line-1220">      } else {</span>
+<span class="source-line-no">1221</span><span id="line-1221">        return opts.valueSize;</span>
+<span class="source-line-no">1222</span><span id="line-1222">      }</span>
+<span class="source-line-no">1223</span><span id="line-1223">    }</span>
+<span class="source-line-no">1224</span><span id="line-1224"></span>
+<span class="source-line-no">1225</span><span id="line-1225">    void updateValueSize(final Result[] rs) throws IOException {</span>
+<span class="source-line-no">1226</span><span id="line-1226">      updateValueSize(rs, 0);</span>
+<span class="source-line-no">1227</span><span id="line-1227">    }</span>
+<span class="source-line-no">1228</span><span id="line-1228"></span>
+<span class="source-line-no">1229</span><span id="line-1229">    void updateValueSize(final Result[] rs, final long latency) throws IOException {</span>
+<span class="source-line-no">1230</span><span id="line-1230">      if (rs == null || (latency == 0)) return;</span>
+<span class="source-line-no">1231</span><span id="line-1231">      for (Result r : rs)</span>
+<span class="source-line-no">1232</span><span id="line-1232">        updateValueSize(r, latency);</span>
+<span class="source-line-no">1233</span><span id="line-1233">    }</span>
+<span class="source-line-no">1234</span><span id="line-1234"></span>
+<span class="source-line-no">1235</span><span id="line-1235">    void updateValueSize(final Result r) throws IOException {</span>
+<span class="source-line-no">1236</span><span id="line-1236">      updateValueSize(r, 0);</span>
 <span class="source-line-no">1237</span><span id="line-1237">    }</span>
 <span class="source-line-no">1238</span><span id="line-1238"></span>
-<span class="source-line-no">1239</span><span id="line-1239">    void updateValueSize(final int valueSize) {</span>
-<span class="source-line-no">1240</span><span id="line-1240">      if (!isRandomValueSize()) return;</span>
-<span class="source-line-no">1241</span><span id="line-1241">      this.valueSizeHistogram.update(valueSize);</span>
-<span class="source-line-no">1242</span><span id="line-1242">    }</span>
-<span class="source-line-no">1243</span><span id="line-1243"></span>
-<span class="source-line-no">1244</span><span id="line-1244">    void updateScanMetrics(final ScanMetrics metrics) {</span>
-<span class="source-line-no">1245</span><span id="line-1245">      if (metrics == null) return;</span>
-<span class="source-line-no">1246</span><span id="line-1246">      Map&lt;String, Long&gt; metricsMap = metrics.getMetricsMap();</span>
-<span class="source-line-no">1247</span><span id="line-1247">      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);</span>
-<span class="source-line-no">1248</span><span id="line-1248">      if (rpcCalls != null) {</span>
-<span class="source-line-no">1249</span><span id="line-1249">        this.rpcCallsHistogram.update(rpcCalls.longValue());</span>
-<span class="source-line-no">1250</span><span id="line-1250">      }</span>
-<span class="source-line-no">1251</span><span id="line-1251">      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);</span>
-<span class="source-line-no">1252</span><span id="line-1252">      if (remoteRpcCalls != null) {</span>
-<span class="source-line-no">1253</span><span id="line-1253">        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());</span>
-<span class="source-line-no">1254</span><span id="line-1254">      }</span>
-<span class="source-line-no">1255</span><span id="line-1255">      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);</span>
-<span class="source-line-no">1256</span><span id="line-1256">      if (millisBetweenNext != null) {</span>
-<span class="source-line-no">1257</span><span id="line-1257">        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());</span>
-<span class="source-line-no">1258</span><span id="line-1258">      }</span>
-<span class="source-line-no">1259</span><span id="line-1259">      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);</span>
-<span class="source-line-no">1260</span><span id="line-1260">      if (regionsScanned != null) {</span>
-<span class="source-line-no">1261</span><span id="line-1261">        this.regionsScannedHistogram.update(regionsScanned.longValue());</span>
-<span class="source-line-no">1262</span><span id="line-1262">      }</span>
-<span class="source-line-no">1263</span><span id="line-1263">      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);</span>
-<span class="source-line-no">1264</span><span id="line-1264">      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {</span>
-<span class="source-line-no">1265</span><span id="line-1265">        this.bytesInResultsHistogram.update(bytesInResults.longValue());</span>
+<span class="source-line-no">1239</span><span id="line-1239">    void updateValueSize(final Result r, final long latency) throws IOException {</span>
+<span class="source-line-no">1240</span><span id="line-1240">      if (r == null || (latency == 0)) return;</span>
+<span class="source-line-no">1241</span><span id="line-1241">      int size = 0;</span>
+<span class="source-line-no">1242</span><span id="line-1242">      // update replicaHistogram</span>
+<span class="source-line-no">1243</span><span id="line-1243">      if (r.isStale()) {</span>
+<span class="source-line-no">1244</span><span id="line-1244">        replicaLatencyHistogram.update(latency / 1000);</span>
+<span class="source-line-no">1245</span><span id="line-1245">        numOfReplyFromReplica++;</span>
+<span class="source-line-no">1246</span><span id="line-1246">      }</span>
+<span class="source-line-no">1247</span><span id="line-1247">      if (!isRandomValueSize()) return;</span>
+<span class="source-line-no">1248</span><span id="line-1248"></span>
+<span class="source-line-no">1249</span><span id="line-1249">      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {</span>
+<span class="source-line-no">1250</span><span id="line-1250">        size += scanner.current().getValueLength();</span>
+<span class="source-line-no">1251</span><span id="line-1251">      }</span>
+<span class="source-line-no">1252</span><span id="line-1252">      updateValueSize(size);</span>
+<span class="source-line-no">1253</span><span id="line-1253">    }</span>
+<span class="source-line-no">1254</span><span id="line-1254"></span>
+<span class="source-line-no">1255</span><span id="line-1255">    void updateValueSize(final int valueSize) {</span>
+<span class="source-line-no">1256</span><span id="line-1256">      if (!isRandomValueSize()) return;</span>
+<span class="source-line-no">1257</span><span id="line-1257">      this.valueSizeHistogram.update(valueSize);</span>
+<span class="source-line-no">1258</span><span id="line-1258">    }</span>
+<span class="source-line-no">1259</span><span id="line-1259"></span>
+<span class="source-line-no">1260</span><span id="line-1260">    void updateScanMetrics(final ScanMetrics metrics) {</span>
+<span class="source-line-no">1261</span><span id="line-1261">      if (metrics == null) return;</span>
+<span class="source-line-no">1262</span><span id="line-1262">      Map&lt;String, Long&gt; metricsMap = metrics.getMetricsMap();</span>
+<span class="source-line-no">1263</span><span id="line-1263">      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);</span>
+<span class="source-line-no">1264</span><span id="line-1264">      if (rpcCalls != null) {</span>
+<span class="source-line-no">1265</span><span id="line-1265">        this.rpcCallsHistogram.update(rpcCalls.longValue());</span>
 <span class="source-line-no">1266</span><span id="line-1266">      }</span>
-<span class="source-line-no">1267</span><span id="line-1267">      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);</span>
-<span class="source-line-no">1268</span><span id="line-1268">      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {</span>
-<span class="source-line-no">1269</span><span id="line-1269">        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());</span>
+<span class="source-line-no">1267</span><span id="line-1267">      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);</span>
+<span class="source-line-no">1268</span><span id="line-1268">      if (remoteRpcCalls != null) {</span>
+<span class="source-line-no">1269</span><span id="line-1269">        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());</span>
 <span class="source-line-no">1270</span><span id="line-1270">      }</span>
-<span class="source-line-no">1271</span><span id="line-1271">    }</span>
-<span class="source-line-no">1272</span><span id="line-1272"></span>
-<span class="source-line-no">1273</span><span id="line-1273">    String generateStatus(final int sr, final int i, final int lr) {</span>
-<span class="source-line-no">1274</span><span id="line-1274">      return "row [start=" + sr + ", current=" + i + ", last=" + lr + "], latency ["</span>
-<span class="source-line-no">1275</span><span id="line-1275">        + getShortLatencyReport() + "]"</span>
-<span class="source-line-no">1276</span><span id="line-1276">        + (!isRandomValueSize() ? "" : ", value size [" + getShortValueSizeReport() + "]");</span>
-<span class="source-line-no">1277</span><span id="line-1277">    }</span>
-<span class="source-line-no">1278</span><span id="line-1278"></span>
-<span class="source-line-no">1279</span><span id="line-1279">    boolean isRandomValueSize() {</span>
-<span class="source-line-no">1280</span><span id="line-1280">      return opts.valueRandom;</span>
-<span class="source-line-no">1281</span><span id="line-1281">    }</span>
-<span class="source-line-no">1282</span><span id="line-1282"></span>
-<span class="source-line-no">1283</span><span id="line-1283">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1284</span><span id="line-1284">      return opts.period;</span>
-<span class="source-line-no">1285</span><span id="line-1285">    }</span>
-<span class="source-line-no">1286</span><span id="line-1286"></span>
-<span class="source-line-no">1287</span><span id="line-1287">    /**</span>
-<span class="source-line-no">1288</span><span id="line-1288">     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.</span>
-<span class="source-line-no">1289</span><span id="line-1289">     */</span>
-<span class="source-line-no">1290</span><span id="line-1290">    public Histogram getLatencyHistogram() {</span>
-<span class="source-line-no">1291</span><span id="line-1291">      return latencyHistogram;</span>
-<span class="source-line-no">1292</span><span id="line-1292">    }</span>
-<span class="source-line-no">1293</span><span id="line-1293"></span>
-<span class="source-line-no">1294</span><span id="line-1294">    void testSetup() throws IOException {</span>
-<span class="source-line-no">1295</span><span id="line-1295">      // test metrics</span>
-<span class="source-line-no">1296</span><span id="line-1296">      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1297</span><span id="line-1297">      // If it is a replica test, set up histogram for replica.</span>
-<span class="source-line-no">1298</span><span id="line-1298">      if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">1299</span><span id="line-1299">        replicaLatencyHistogram =</span>
-<span class="source-line-no">1300</span><span id="line-1300">          YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1301</span><span id="line-1301">      }</span>
-<span class="source-line-no">1302</span><span id="line-1302">      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1303</span><span id="line-1303">      // scan metrics</span>
-<span class="source-line-no">1304</span><span id="line-1304">      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1305</span><span id="line-1305">      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1306</span><span id="line-1306">      millisBetweenNextHistogram =</span>
-<span class="source-line-no">1307</span><span id="line-1307">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1308</span><span id="line-1308">      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1309</span><span id="line-1309">      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1310</span><span id="line-1310">      bytesInRemoteResultsHistogram =</span>
-<span class="source-line-no">1311</span><span id="line-1311">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1312</span><span id="line-1312"></span>
-<span class="source-line-no">1313</span><span id="line-1313">      onStartup();</span>
-<span class="source-line-no">1314</span><span id="line-1314">    }</span>
-<span class="source-line-no">1315</span><span id="line-1315"></span>
-<span class="source-line-no">1316</span><span id="line-1316">    abstract void onStartup() throws IOException;</span>
-<span class="source-line-no">1317</span><span id="line-1317"></span>
-<span class="source-line-no">1318</span><span id="line-1318">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">1319</span><span id="line-1319">      onTakedown();</span>
-<span class="source-line-no">1320</span><span id="line-1320">      // Print all stats for this thread continuously.</span>
-<span class="source-line-no">1321</span><span id="line-1321">      // Synchronize on Test.class so different threads don't intermingle the</span>
-<span class="source-line-no">1322</span><span id="line-1322">      // output. We can't use 'this' here because each thread has its own instance of Test class.</span>
-<span class="source-line-no">1323</span><span id="line-1323">      synchronized (Test.class) {</span>
-<span class="source-line-no">1324</span><span id="line-1324">        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());</span>
-<span class="source-line-no">1325</span><span id="line-1325">        status</span>
-<span class="source-line-no">1326</span><span id="line-1326">          .setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(latencyHistogram));</span>
-<span class="source-line-no">1327</span><span id="line-1327">        if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">1328</span><span id="line-1328">          status.setStatus("Latency (us) from Replica Regions: "</span>
-<span class="source-line-no">1329</span><span id="line-1329">            + YammerHistogramUtils.getHistogramReport(replicaLatencyHistogram));</span>
-<span class="source-line-no">1330</span><span id="line-1330">        }</span>
-<span class="source-line-no">1331</span><span id="line-1331">        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());</span>
-<span class="source-line-no">1332</span><span id="line-1332">        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));</span>
-<span class="source-line-no">1333</span><span id="line-1333">        if (valueSizeHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1334</span><span id="line-1334">          status.setStatus(</span>
-<span class="source-line-no">1335</span><span id="line-1335">            "ValueSize (bytes) : " + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));</span>
-<span class="source-line-no">1336</span><span id="line-1336">          status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());</span>
-<span class="source-line-no">1337</span><span id="line-1337">          status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));</span>
-<span class="source-line-no">1338</span><span id="line-1338">        } else {</span>
-<span class="source-line-no">1339</span><span id="line-1339">          status.setStatus("No valueSize statistics available");</span>
-<span class="source-line-no">1340</span><span id="line-1340">        }</span>
-<span class="source-line-no">1341</span><span id="line-1341">        if (rpcCallsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1342</span><span id="line-1342">          status.setStatus(</span>
-<span class="source-line-no">1343</span><span id="line-1343">            "rpcCalls (count): " + YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));</span>
-<span class="source-line-no">1344</span><span id="line-1344">        }</span>
-<span class="source-line-no">1345</span><span id="line-1345">        if (remoteRpcCallsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1346</span><span id="line-1346">          status.setStatus("remoteRpcCalls (count): "</span>
-<span class="source-line-no">1347</span><span id="line-1347">            + YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));</span>
-<span class="source-line-no">1348</span><span id="line-1348">        }</span>
-<span class="source-line-no">1349</span><span id="line-1349">        if (millisBetweenNextHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1350</span><span id="line-1350">          status.setStatus("millisBetweenNext (latency): "</span>
-<span class="source-line-no">1351</span><span id="line-1351">            + YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));</span>
-<span class="source-line-no">1352</span><span id="line-1352">        }</span>
-<span class="source-line-no">1353</span><span id="line-1353">        if (regionsScannedHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1354</span><span id="line-1354">          status.setStatus("regionsScanned (count): "</span>
-<span class="source-line-no">1355</span><span id="line-1355">            + YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));</span>
+<span class="source-line-no">1271</span><span id="line-1271">      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);</span>
+<span class="source-line-no">1272</span><span id="line-1272">      if (millisBetweenNext != null) {</span>
+<span class="source-line-no">1273</span><span id="line-1273">        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());</span>
+<span class="source-line-no">1274</span><span id="line-1274">      }</span>
+<span class="source-line-no">1275</span><span id="line-1275">      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);</span>
+<span class="source-line-no">1276</span><span id="line-1276">      if (regionsScanned != null) {</span>
+<span class="source-line-no">1277</span><span id="line-1277">        this.regionsScannedHistogram.update(regionsScanned.longValue());</span>
+<span class="source-line-no">1278</span><span id="line-1278">      }</span>
+<span class="source-line-no">1279</span><span id="line-1279">      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);</span>
+<span class="source-line-no">1280</span><span id="line-1280">      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {</span>
+<span class="source-line-no">1281</span><span id="line-1281">        this.bytesInResultsHistogram.update(bytesInResults.longValue());</span>
+<span class="source-line-no">1282</span><span id="line-1282">      }</span>
+<span class="source-line-no">1283</span><span id="line-1283">      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);</span>
+<span class="source-line-no">1284</span><span id="line-1284">      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {</span>
+<span class="source-line-no">1285</span><span id="line-1285">        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());</span>
+<span class="source-line-no">1286</span><span id="line-1286">      }</span>
+<span class="source-line-no">1287</span><span id="line-1287">    }</span>
+<span class="source-line-no">1288</span><span id="line-1288"></span>
+<span class="source-line-no">1289</span><span id="line-1289">    String generateStatus(final int sr, final int i, final int lr) {</span>
+<span class="source-line-no">1290</span><span id="line-1290">      return "row [start=" + sr + ", current=" + i + ", last=" + lr + "], latency ["</span>
+<span class="source-line-no">1291</span><span id="line-1291">        + getShortLatencyReport() + "]"</span>
+<span class="source-line-no">1292</span><span id="line-1292">        + (!isRandomValueSize() ? "" : ", value size [" + getShortValueSizeReport() + "]");</span>
+<span class="source-line-no">1293</span><span id="line-1293">    }</span>
+<span class="source-line-no">1294</span><span id="line-1294"></span>
+<span class="source-line-no">1295</span><span id="line-1295">    boolean isRandomValueSize() {</span>
+<span class="source-line-no">1296</span><span id="line-1296">      return opts.valueRandom;</span>
+<span class="source-line-no">1297</span><span id="line-1297">    }</span>
+<span class="source-line-no">1298</span><span id="line-1298"></span>
+<span class="source-line-no">1299</span><span id="line-1299">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1300</span><span id="line-1300">      return opts.period;</span>
+<span class="source-line-no">1301</span><span id="line-1301">    }</span>
+<span class="source-line-no">1302</span><span id="line-1302"></span>
+<span class="source-line-no">1303</span><span id="line-1303">    /**</span>
+<span class="source-line-no">1304</span><span id="line-1304">     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.</span>
+<span class="source-line-no">1305</span><span id="line-1305">     */</span>
+<span class="source-line-no">1306</span><span id="line-1306">    public Histogram getLatencyHistogram() {</span>
+<span class="source-line-no">1307</span><span id="line-1307">      return latencyHistogram;</span>
+<span class="source-line-no">1308</span><span id="line-1308">    }</span>
+<span class="source-line-no">1309</span><span id="line-1309"></span>
+<span class="source-line-no">1310</span><span id="line-1310">    void testSetup() throws IOException {</span>
+<span class="source-line-no">1311</span><span id="line-1311">      // test metrics</span>
+<span class="source-line-no">1312</span><span id="line-1312">      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1313</span><span id="line-1313">      // If it is a replica test, set up histogram for replica.</span>
+<span class="source-line-no">1314</span><span id="line-1314">      if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">1315</span><span id="line-1315">        replicaLatencyHistogram =</span>
+<span class="source-line-no">1316</span><span id="line-1316">          YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1317</span><span id="line-1317">      }</span>
+<span class="source-line-no">1318</span><span id="line-1318">      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1319</span><span id="line-1319">      // scan metrics</span>
+<span class="source-line-no">1320</span><span id="line-1320">      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1321</span><span id="line-1321">      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1322</span><span id="line-1322">      millisBetweenNextHistogram =</span>
+<span class="source-line-no">1323</span><span id="line-1323">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1324</span><span id="line-1324">      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1325</span><span id="line-1325">      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1326</span><span id="line-1326">      bytesInRemoteResultsHistogram =</span>
+<span class="source-line-no">1327</span><span id="line-1327">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1328</span><span id="line-1328"></span>
+<span class="source-line-no">1329</span><span id="line-1329">      onStartup();</span>
+<span class="source-line-no">1330</span><span id="line-1330">    }</span>
+<span class="source-line-no">1331</span><span id="line-1331"></span>
+<span class="source-line-no">1332</span><span id="line-1332">    abstract void onStartup() throws IOException;</span>
+<span class="source-line-no">1333</span><span id="line-1333"></span>
+<span class="source-line-no">1334</span><span id="line-1334">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">1335</span><span id="line-1335">      onTakedown();</span>
+<span class="source-line-no">1336</span><span id="line-1336">      // Print all stats for this thread continuously.</span>
+<span class="source-line-no">1337</span><span id="line-1337">      // Synchronize on Test.class so different threads don't intermingle the</span>
+<span class="source-line-no">1338</span><span id="line-1338">      // output. We can't use 'this' here because each thread has its own instance of Test class.</span>
+<span class="source-line-no">1339</span><span id="line-1339">      synchronized (Test.class) {</span>
+<span class="source-line-no">1340</span><span id="line-1340">        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());</span>
+<span class="source-line-no">1341</span><span id="line-1341">        status</span>
+<span class="source-line-no">1342</span><span id="line-1342">          .setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(latencyHistogram));</span>
+<span class="source-line-no">1343</span><span id="line-1343">        if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">1344</span><span id="line-1344">          status.setStatus("Latency (us) from Replica Regions: "</span>
+<span class="source-line-no">1345</span><span id="line-1345">            + YammerHistogramUtils.getHistogramReport(replicaLatencyHistogram));</span>
+<span class="source-line-no">1346</span><span id="line-1346">        }</span>
+<span class="source-line-no">1347</span><span id="line-1347">        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());</span>
+<span class="source-line-no">1348</span><span id="line-1348">        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));</span>
+<span class="source-line-no">1349</span><span id="line-1349">        if (valueSizeHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1350</span><span id="line-1350">          status.setStatus(</span>
+<span class="source-line-no">1351</span><span id="line-1351">            "ValueSize (bytes) : " + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));</span>
+<span class="source-line-no">1352</span><span id="line-1352">          status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());</span>
+<span class="source-line-no">1353</span><span id="line-1353">          status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));</span>
+<span class="source-line-no">1354</span><span id="line-1354">        } else {</span>
+<span class="source-line-no">1355</span><span id="line-1355">          status.setStatus("No valueSize statistics available");</span>
 <span class="source-line-no">1356</span><span id="line-1356">        }</span>
-<span class="source-line-no">1357</span><span id="line-1357">        if (bytesInResultsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1358</span><span id="line-1358">          status.setStatus("bytesInResults (size): "</span>
-<span class="source-line-no">1359</span><span id="line-1359">            + YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));</span>
+<span class="source-line-no">1357</span><span id="line-1357">        if (rpcCallsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1358</span><span id="line-1358">          status.setStatus(</span>
+<span class="source-line-no">1359</span><span id="line-1359">            "rpcCalls (count): " + YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));</span>
 <span class="source-line-no">1360</span><span id="line-1360">        }</span>
-<span class="source-line-no">1361</span><span id="line-1361">        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1362</span><span id="line-1362">          status.setStatus("bytesInRemoteResults (size): "</span>
-<span class="source-line-no">1363</span><span id="line-1363">            + YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));</span>
+<span class="source-line-no">1361</span><span id="line-1361">        if (remoteRpcCallsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1362</span><span id="line-1362">          status.setStatus("remoteRpcCalls (count): "</span>
+<span class="source-line-no">1363</span><span id="line-1363">            + YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));</span>
 <span class="source-line-no">1364</span><span id="line-1364">        }</span>
-<span class="source-line-no">1365</span><span id="line-1365">      }</span>
-<span class="source-line-no">1366</span><span id="line-1366">    }</span>
-<span class="source-line-no">1367</span><span id="line-1367"></span>
-<span class="source-line-no">1368</span><span id="line-1368">    abstract void onTakedown() throws IOException;</span>
-<span class="source-line-no">1369</span><span id="line-1369"></span>
-<span class="source-line-no">1370</span><span id="line-1370">    /*</span>
-<span class="source-line-no">1371</span><span id="line-1371">     * Run test</span>
-<span class="source-line-no">1372</span><span id="line-1372">     * @return Elapsed time.</span>
-<span class="source-line-no">1373</span><span id="line-1373">     */</span>
-<span class="source-line-no">1374</span><span id="line-1374">    long test() throws IOException, InterruptedException {</span>
-<span class="source-line-no">1375</span><span id="line-1375">      testSetup();</span>
-<span class="source-line-no">1376</span><span id="line-1376">      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());</span>
-<span class="source-line-no">1377</span><span id="line-1377">      final long startTime = System.nanoTime();</span>
-<span class="source-line-no">1378</span><span id="line-1378">      try {</span>
-<span class="source-line-no">1379</span><span id="line-1379">        testTimed();</span>
-<span class="source-line-no">1380</span><span id="line-1380">      } finally {</span>
-<span class="source-line-no">1381</span><span id="line-1381">        testTakedown();</span>
-<span class="source-line-no">1382</span><span id="line-1382">      }</span>
-<span class="source-line-no">1383</span><span id="line-1383">      return (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">1384</span><span id="line-1384">    }</span>
+<span class="source-line-no">1365</span><span id="line-1365">        if (millisBetweenNextHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1366</span><span id="line-1366">          status.setStatus("millisBetweenNext (latency): "</span>
+<span class="source-line-no">1367</span><span id="line-1367">            + YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));</span>
+<span class="source-line-no">1368</span><span id="line-1368">        }</span>
+<span class="source-line-no">1369</span><span id="line-1369">        if (regionsScannedHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1370</span><span id="line-1370">          status.setStatus("regionsScanned (count): "</span>
+<span class="source-line-no">1371</span><span id="line-1371">            + YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));</span>
+<span class="source-line-no">1372</span><span id="line-1372">        }</span>
+<span class="source-line-no">1373</span><span id="line-1373">        if (bytesInResultsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1374</span><span id="line-1374">          status.setStatus("bytesInResults (size): "</span>
+<span class="source-line-no">1375</span><span id="line-1375">            + YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));</span>
+<span class="source-line-no">1376</span><span id="line-1376">        }</span>
+<span class="source-line-no">1377</span><span id="line-1377">        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1378</span><span id="line-1378">          status.setStatus("bytesInRemoteResults (size): "</span>
+<span class="source-line-no">1379</span><span id="line-1379">            + YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));</span>
+<span class="source-line-no">1380</span><span id="line-1380">        }</span>
+<span class="source-line-no">1381</span><span id="line-1381">      }</span>
+<span class="source-line-no">1382</span><span id="line-1382">    }</span>
+<span class="source-line-no">1383</span><span id="line-1383"></span>
+<span class="source-line-no">1384</span><span id="line-1384">    abstract void onTakedown() throws IOException;</span>
 <span class="source-line-no">1385</span><span id="line-1385"></span>
-<span class="source-line-no">1386</span><span id="line-1386">    int getStartRow() {</span>
-<span class="source-line-no">1387</span><span id="line-1387">      return opts.startRow;</span>
-<span class="source-line-no">1388</span><span id="line-1388">    }</span>
-<span class="source-line-no">1389</span><span id="line-1389"></span>
-<span class="source-line-no">1390</span><span id="line-1390">    int getLastRow() {</span>
-<span class="source-line-no">1391</span><span id="line-1391">      return getStartRow() + opts.perClientRunRows;</span>
-<span class="source-line-no">1392</span><span id="line-1392">    }</span>
-<span class="source-line-no">1393</span><span id="line-1393"></span>
-<span class="source-line-no">1394</span><span id="line-1394">    /**</span>
-<span class="source-line-no">1395</span><span id="line-1395">     * Provides an extension point for tests that don't want a per row invocation.</span>
-<span class="source-line-no">1396</span><span id="line-1396">     */</span>
-<span class="source-line-no">1397</span><span id="line-1397">    void testTimed() throws IOException, InterruptedException {</span>
-<span class="source-line-no">1398</span><span id="line-1398">      int startRow = getStartRow();</span>
-<span class="source-line-no">1399</span><span id="line-1399">      int lastRow = getLastRow();</span>
-<span class="source-line-no">1400</span><span id="line-1400">      // Report on completion of 1/10th of total.</span>
-<span class="source-line-no">1401</span><span id="line-1401">      for (int ii = 0; ii &lt; opts.cycles; ii++) {</span>
-<span class="source-line-no">1402</span><span id="line-1402">        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);</span>
-<span class="source-line-no">1403</span><span id="line-1403">        for (int i = startRow; i &lt; lastRow; i++) {</span>
-<span class="source-line-no">1404</span><span id="line-1404">          if (i % everyN != 0) continue;</span>
-<span class="source-line-no">1405</span><span id="line-1405">          long startTime = System.nanoTime();</span>
-<span class="source-line-no">1406</span><span id="line-1406">          boolean requestSent = false;</span>
-<span class="source-line-no">1407</span><span id="line-1407">          Span span = TraceUtil.getGlobalTracer().spanBuilder("test row").startSpan();</span>
-<span class="source-line-no">1408</span><span id="line-1408">          try (Scope scope = span.makeCurrent()) {</span>
-<span class="source-line-no">1409</span><span id="line-1409">            requestSent = testRow(i, startTime);</span>
-<span class="source-line-no">1410</span><span id="line-1410">          } finally {</span>
-<span class="source-line-no">1411</span><span id="line-1411">            span.end();</span>
-<span class="source-line-no">1412</span><span id="line-1412">          }</span>
-<span class="source-line-no">1413</span><span id="line-1413">          if ((i - startRow) &gt; opts.measureAfter) {</span>
-<span class="source-line-no">1414</span><span id="line-1414">            // If multiget or multiput is enabled, say set to 10, testRow() returns immediately</span>
-<span class="source-line-no">1415</span><span id="line-1415">            // first 9 times and sends the actual get request in the 10th iteration.</span>
-<span class="source-line-no">1416</span><span id="line-1416">            // We should only set latency when actual request is sent because otherwise</span>
-<span class="source-line-no">1417</span><span id="line-1417">            // it turns out to be 0.</span>
-<span class="source-line-no">1418</span><span id="line-1418">            if (requestSent) {</span>
-<span class="source-line-no">1419</span><span id="line-1419">              long latency = (System.nanoTime() - startTime) / 1000;</span>
-<span class="source-line-no">1420</span><span id="line-1420">              latencyHistogram.update(latency);</span>
-<span class="source-line-no">1421</span><span id="line-1421">              if ((opts.latencyThreshold &gt; 0) &amp;&amp; (latency / 1000 &gt;= opts.latencyThreshold)) {</span>
-<span class="source-line-no">1422</span><span id="line-1422">                numOfReplyOverLatencyThreshold++;</span>
-<span class="source-line-no">1423</span><span id="line-1423">              }</span>
-<span class="source-line-no">1424</span><span id="line-1424">            }</span>
-<span class="source-line-no">1425</span><span id="line-1425">            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {</span>
-<span class="source-line-no">1426</span><span id="line-1426">              status.setStatus(generateStatus(startRow, i, lastRow));</span>
-<span class="source-line-no">1427</span><span id="line-1427">            }</span>
+<span class="source-line-no">1386</span><span id="line-1386">    /*</span>
+<span class="source-line-no">1387</span><span id="line-1387">     * Run test</span>
+<span class="source-line-no">1388</span><span id="line-1388">     * @return Elapsed time.</span>
+<span class="source-line-no">1389</span><span id="line-1389">     */</span>
+<span class="source-line-no">1390</span><span id="line-1390">    long test() throws IOException, InterruptedException {</span>
+<span class="source-line-no">1391</span><span id="line-1391">      testSetup();</span>
+<span class="source-line-no">1392</span><span id="line-1392">      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());</span>
+<span class="source-line-no">1393</span><span id="line-1393">      final long startTime = System.nanoTime();</span>
+<span class="source-line-no">1394</span><span id="line-1394">      try {</span>
+<span class="source-line-no">1395</span><span id="line-1395">        testTimed();</span>
+<span class="source-line-no">1396</span><span id="line-1396">      } finally {</span>
+<span class="source-line-no">1397</span><span id="line-1397">        testTakedown();</span>
+<span class="source-line-no">1398</span><span id="line-1398">      }</span>
+<span class="source-line-no">1399</span><span id="line-1399">      return (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">1400</span><span id="line-1400">    }</span>
+<span class="source-line-no">1401</span><span id="line-1401"></span>
+<span class="source-line-no">1402</span><span id="line-1402">    int getStartRow() {</span>
+<span class="source-line-no">1403</span><span id="line-1403">      return opts.startRow;</span>
+<span class="source-line-no">1404</span><span id="line-1404">    }</span>
+<span class="source-line-no">1405</span><span id="line-1405"></span>
+<span class="source-line-no">1406</span><span id="line-1406">    int getLastRow() {</span>
+<span class="source-line-no">1407</span><span id="line-1407">      return getStartRow() + opts.perClientRunRows;</span>
+<span class="source-line-no">1408</span><span id="line-1408">    }</span>
+<span class="source-line-no">1409</span><span id="line-1409"></span>
+<span class="source-line-no">1410</span><span id="line-1410">    /**</span>
+<span class="source-line-no">1411</span><span id="line-1411">     * Provides an extension point for tests that don't want a per row invocation.</span>
+<span class="source-line-no">1412</span><span id="line-1412">     */</span>
+<span class="source-line-no">1413</span><span id="line-1413">    void testTimed() throws IOException, InterruptedException {</span>
+<span class="source-line-no">1414</span><span id="line-1414">      int startRow = getStartRow();</span>
+<span class="source-line-no">1415</span><span id="line-1415">      int lastRow = getLastRow();</span>
+<span class="source-line-no">1416</span><span id="line-1416">      // Report on completion of 1/10th of total.</span>
+<span class="source-line-no">1417</span><span id="line-1417">      for (int ii = 0; ii &lt; opts.cycles; ii++) {</span>
+<span class="source-line-no">1418</span><span id="line-1418">        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);</span>
+<span class="source-line-no">1419</span><span id="line-1419">        for (int i = startRow; i &lt; lastRow; i++) {</span>
+<span class="source-line-no">1420</span><span id="line-1420">          if (i % everyN != 0) continue;</span>
+<span class="source-line-no">1421</span><span id="line-1421">          long startTime = System.nanoTime();</span>
+<span class="source-line-no">1422</span><span id="line-1422">          boolean requestSent = false;</span>
+<span class="source-line-no">1423</span><span id="line-1423">          Span span = TraceUtil.getGlobalTracer().spanBuilder("test row").startSpan();</span>
+<span class="source-line-no">1424</span><span id="line-1424">          try (Scope scope = span.makeCurrent()) {</span>
+<span class="source-line-no">1425</span><span id="line-1425">            requestSent = testRow(i, startTime);</span>
+<span class="source-line-no">1426</span><span id="line-1426">          } finally {</span>
+<span class="source-line-no">1427</span><span id="line-1427">            span.end();</span>
 <span class="source-line-no">1428</span><span id="line-1428">          }</span>
-<span class="source-line-no">1429</span><span id="line-1429">        }</span>
-<span class="source-line-no">1430</span><span id="line-1430">      }</span>
-<span class="source-line-no">1431</span><span id="line-1431">    }</span>
-<span class="source-line-no">1432</span><span id="line-1432"></span>
-<span class="source-line-no">1433</span><span id="line-1433">    /** Returns Subset of the histograms' calculation. */</span>
-<span class="source-line-no">1434</span><span id="line-1434">    public String getShortLatencyReport() {</span>
-<span class="source-line-no">1435</span><span id="line-1435">      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);</span>
-<span class="source-line-no">1436</span><span id="line-1436">    }</span>
-<span class="source-line-no">1437</span><span id="line-1437"></span>
-<span class="source-line-no">1438</span><span id="line-1438">    /** Returns Subset of the histograms' calculation. */</span>
-<span class="source-line-no">1439</span><span id="line-1439">    public String getShortValueSizeReport() {</span>
-<span class="source-line-no">1440</span><span id="line-1440">      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);</span>
-<span class="source-line-no">1441</span><span id="line-1441">    }</span>
-<span class="source-line-no">1442</span><span id="line-1442"></span>
-<span class="source-line-no">1443</span><span id="line-1443">    /**</span>
-<span class="source-line-no">1444</span><span id="line-1444">     * Test for individual row.</span>
-<span class="source-line-no">1445</span><span id="line-1445">     * @param i Row index.</span>
-<span class="source-line-no">1446</span><span id="line-1446">     * @return true if the row was sent to server and need to record metrics. False if not, multiGet</span>
-<span class="source-line-no">1447</span><span id="line-1447">     *         and multiPut e.g., the rows are sent to server only if enough gets/puts are gathered.</span>
-<span class="source-line-no">1448</span><span id="line-1448">     */</span>
-<span class="source-line-no">1449</span><span id="line-1449">    abstract boolean testRow(final int i, final long startTime)</span>
-<span class="source-line-no">1450</span><span id="line-1450">      throws IOException, InterruptedException;</span>
-<span class="source-line-no">1451</span><span id="line-1451">  }</span>
-<span class="source-line-no">1452</span><span id="line-1452"></span>
-<span class="source-line-no">1453</span><span id="line-1453">  static abstract class Test extends TestBase {</span>
-<span class="source-line-no">1454</span><span id="line-1454">    protected Connection connection;</span>
-<span class="source-line-no">1455</span><span id="line-1455"></span>
-<span class="source-line-no">1456</span><span id="line-1456">    Test(final Connection con, final TestOptions options, final Status status) {</span>
-<span class="source-line-no">1457</span><span id="line-1457">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
-<span class="source-line-no">1458</span><span id="line-1458">      this.connection = con;</span>
-<span class="source-line-no">1459</span><span id="line-1459">    }</span>
-<span class="source-line-no">1460</span><span id="line-1460">  }</span>
-<span class="source-line-no">1461</span><span id="line-1461"></span>
-<span class="source-line-no">1462</span><span id="line-1462">  static abstract class AsyncTest extends TestBase {</span>
-<span class="source-line-no">1463</span><span id="line-1463">    protected AsyncConnection connection;</span>
-<span class="source-line-no">1464</span><span id="line-1464"></span>
-<span class="source-line-no">1465</span><span id="line-1465">    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {</span>
-<span class="source-line-no">1466</span><span id="line-1466">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
-<span class="source-line-no">1467</span><span id="line-1467">      this.connection = con;</span>
-<span class="source-line-no">1468</span><span id="line-1468">    }</span>
-<span class="source-line-no">1469</span><span id="line-1469">  }</span>
-<span class="source-line-no">1470</span><span id="line-1470"></span>
-<span class="source-line-no">1471</span><span id="line-1471">  static abstract class TableTest extends Test {</span>
-<span class="source-line-no">1472</span><span id="line-1472">    protected Table table;</span>
-<span class="source-line-no">1473</span><span id="line-1473"></span>
-<span class="source-line-no">1474</span><span id="line-1474">    TableTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1475</span><span id="line-1475">      super(con, options, status);</span>
-<span class="source-line-no">1476</span><span id="line-1476">    }</span>
+<span class="source-line-no">1429</span><span id="line-1429">          if ((i - startRow) &gt; opts.measureAfter) {</span>
+<span class="source-line-no">1430</span><span id="line-1430">            // If multiget or multiput is enabled, say set to 10, testRow() returns immediately</span>
+<span class="source-line-no">1431</span><span id="line-1431">            // first 9 times and sends the actual get request in the 10th iteration.</span>
+<span class="source-line-no">1432</span><span id="line-1432">            // We should only set latency when actual request is sent because otherwise</span>
+<span class="source-line-no">1433</span><span id="line-1433">            // it turns out to be 0.</span>
+<span class="source-line-no">1434</span><span id="line-1434">            if (requestSent) {</span>
+<span class="source-line-no">1435</span><span id="line-1435">              long latency = (System.nanoTime() - startTime) / 1000;</span>
+<span class="source-line-no">1436</span><span id="line-1436">              latencyHistogram.update(latency);</span>
+<span class="source-line-no">1437</span><span id="line-1437">              if ((opts.latencyThreshold &gt; 0) &amp;&amp; (latency / 1000 &gt;= opts.latencyThreshold)) {</span>
+<span class="source-line-no">1438</span><span id="line-1438">                numOfReplyOverLatencyThreshold++;</span>
+<span class="source-line-no">1439</span><span id="line-1439">              }</span>
+<span class="source-line-no">1440</span><span id="line-1440">            }</span>
+<span class="source-line-no">1441</span><span id="line-1441">            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {</span>
+<span class="source-line-no">1442</span><span id="line-1442">              status.setStatus(generateStatus(startRow, i, lastRow));</span>
+<span class="source-line-no">1443</span><span id="line-1443">            }</span>
+<span class="source-line-no">1444</span><span id="line-1444">          }</span>
+<span class="source-line-no">1445</span><span id="line-1445">        }</span>
+<span class="source-line-no">1446</span><span id="line-1446">      }</span>
+<span class="source-line-no">1447</span><span id="line-1447">    }</span>
+<span class="source-line-no">1448</span><span id="line-1448"></span>
+<span class="source-line-no">1449</span><span id="line-1449">    /** Returns Subset of the histograms' calculation. */</span>
+<span class="source-line-no">1450</span><span id="line-1450">    public String getShortLatencyReport() {</span>
+<span class="source-line-no">1451</span><span id="line-1451">      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);</span>
+<span class="source-line-no">1452</span><span id="line-1452">    }</span>
+<span class="source-line-no">1453</span><span id="line-1453"></span>
+<span class="source-line-no">1454</span><span id="line-1454">    /** Returns Subset of the histograms' calculation. */</span>
+<span class="source-line-no">1455</span><span id="line-1455">    public String getShortValueSizeReport() {</span>
+<span class="source-line-no">1456</span><span id="line-1456">      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);</span>
+<span class="source-line-no">1457</span><span id="line-1457">    }</span>
+<span class="source-line-no">1458</span><span id="line-1458"></span>
+<span class="source-line-no">1459</span><span id="line-1459">    /**</span>
+<span class="source-line-no">1460</span><span id="line-1460">     * Test for individual row.</span>
+<span class="source-line-no">1461</span><span id="line-1461">     * @param i Row index.</span>
+<span class="source-line-no">1462</span><span id="line-1462">     * @return true if the row was sent to server and need to record metrics. False if not, multiGet</span>
+<span class="source-line-no">1463</span><span id="line-1463">     *         and multiPut e.g., the rows are sent to server only if enough gets/puts are gathered.</span>
+<span class="source-line-no">1464</span><span id="line-1464">     */</span>
+<span class="source-line-no">1465</span><span id="line-1465">    abstract boolean testRow(final int i, final long startTime)</span>
+<span class="source-line-no">1466</span><span id="line-1466">      throws IOException, InterruptedException;</span>
+<span class="source-line-no">1467</span><span id="line-1467">  }</span>
+<span class="source-line-no">1468</span><span id="line-1468"></span>
+<span class="source-line-no">1469</span><span id="line-1469">  static abstract class Test extends TestBase {</span>
+<span class="source-line-no">1470</span><span id="line-1470">    protected Connection connection;</span>
+<span class="source-line-no">1471</span><span id="line-1471"></span>
+<span class="source-line-no">1472</span><span id="line-1472">    Test(final Connection con, final TestOptions options, final Status status) {</span>
+<span class="source-line-no">1473</span><span id="line-1473">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
+<span class="source-line-no">1474</span><span id="line-1474">      this.connection = con;</span>
+<span class="source-line-no">1475</span><span id="line-1475">    }</span>
+<span class="source-line-no">1476</span><span id="line-1476">  }</span>
 <span class="source-line-no">1477</span><span id="line-1477"></span>
-<span class="source-line-no">1478</span><span id="line-1478">    @Override</span>
-<span class="source-line-no">1479</span><span id="line-1479">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1480</span><span id="line-1480">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1481</span><span id="line-1481">    }</span>
-<span class="source-line-no">1482</span><span id="line-1482"></span>
-<span class="source-line-no">1483</span><span id="line-1483">    @Override</span>
-<span class="source-line-no">1484</span><span id="line-1484">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1485</span><span id="line-1485">      table.close();</span>
-<span class="source-line-no">1486</span><span id="line-1486">    }</span>
-<span class="source-line-no">1487</span><span id="line-1487">  }</span>
-<span class="source-line-no">1488</span><span id="line-1488"></span>
-<span class="source-line-no">1489</span><span id="line-1489">  /*</span>
-<span class="source-line-no">1490</span><span id="line-1490">   * Parent class for all meta tests: MetaWriteTest, MetaRandomReadTest and CleanMetaTest</span>
-<span class="source-line-no">1491</span><span id="line-1491">   */</span>
-<span class="source-line-no">1492</span><span id="line-1492">  static abstract class MetaTest extends TableTest {</span>
-<span class="source-line-no">1493</span><span id="line-1493">    protected int keyLength;</span>
-<span class="source-line-no">1494</span><span id="line-1494"></span>
-<span class="source-line-no">1495</span><span id="line-1495">    MetaTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1496</span><span id="line-1496">      super(con, options, status);</span>
-<span class="source-line-no">1497</span><span id="line-1497">      keyLength = Integer.toString(opts.perClientRunRows).length();</span>
-<span class="source-line-no">1498</span><span id="line-1498">    }</span>
-<span class="source-line-no">1499</span><span id="line-1499"></span>
-<span class="source-line-no">1500</span><span id="line-1500">    @Override</span>
-<span class="source-line-no">1501</span><span id="line-1501">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1502</span><span id="line-1502">      // No clean up</span>
-<span class="source-line-no">1503</span><span id="line-1503">    }</span>
+<span class="source-line-no">1478</span><span id="line-1478">  static abstract class AsyncTest extends TestBase {</span>
+<span class="source-line-no">1479</span><span id="line-1479">    protected AsyncConnection connection;</span>
+<span class="source-line-no">1480</span><span id="line-1480"></span>
+<span class="source-line-no">1481</span><span id="line-1481">    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {</span>
+<span class="source-line-no">1482</span><span id="line-1482">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
+<span class="source-line-no">1483</span><span id="line-1483">      this.connection = con;</span>
+<span class="source-line-no">1484</span><span id="line-1484">    }</span>
+<span class="source-line-no">1485</span><span id="line-1485">  }</span>
+<span class="source-line-no">1486</span><span id="line-1486"></span>
+<span class="source-line-no">1487</span><span id="line-1487">  static abstract class TableTest extends Test {</span>
+<span class="source-line-no">1488</span><span id="line-1488">    protected Table table;</span>
+<span class="source-line-no">1489</span><span id="line-1489"></span>
+<span class="source-line-no">1490</span><span id="line-1490">    TableTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1491</span><span id="line-1491">      super(con, options, status);</span>
+<span class="source-line-no">1492</span><span id="line-1492">    }</span>
+<span class="source-line-no">1493</span><span id="line-1493"></span>
+<span class="source-line-no">1494</span><span id="line-1494">    @Override</span>
+<span class="source-line-no">1495</span><span id="line-1495">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1496</span><span id="line-1496">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1497</span><span id="line-1497">    }</span>
+<span class="source-line-no">1498</span><span id="line-1498"></span>
+<span class="source-line-no">1499</span><span id="line-1499">    @Override</span>
+<span class="source-line-no">1500</span><span id="line-1500">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1501</span><span id="line-1501">      table.close();</span>
+<span class="source-line-no">1502</span><span id="line-1502">    }</span>
+<span class="source-line-no">1503</span><span id="line-1503">  }</span>
 <span class="source-line-no">1504</span><span id="line-1504"></span>
-<span class="source-line-no">1505</span><span id="line-1505">    /*</span>
-<span class="source-line-no">1506</span><span id="line-1506">     * Generates Lexicographically ascending strings</span>
-<span class="source-line-no">1507</span><span id="line-1507">     */</span>
-<span class="source-line-no">1508</span><span id="line-1508">    protected byte[] getSplitKey(final int i) {</span>
-<span class="source-line-no">1509</span><span id="line-1509">      return Bytes.toBytes(String.format("%0" + keyLength + "d", i));</span>
-<span class="source-line-no">1510</span><span id="line-1510">    }</span>
-<span class="source-line-no">1511</span><span id="line-1511"></span>
-<span class="source-line-no">1512</span><span id="line-1512">  }</span>
-<span class="source-line-no">1513</span><span id="line-1513"></span>
-<span class="source-line-no">1514</span><span id="line-1514">  static abstract class AsyncTableTest extends AsyncTest {</span>
-<span class="source-line-no">1515</span><span id="line-1515">    protected AsyncTable&lt;?&gt; table;</span>
-<span class="source-line-no">1516</span><span id="line-1516"></span>
-<span class="source-line-no">1517</span><span id="line-1517">    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1518</span><span id="line-1518">      super(con, options, status);</span>
+<span class="source-line-no">1505</span><span id="line-1505">  /*</span>
+<span class="source-line-no">1506</span><span id="line-1506">   * Parent class for all meta tests: MetaWriteTest, MetaRandomReadTest and CleanMetaTest</span>
+<span class="source-line-no">1507</span><span id="line-1507">   */</span>
+<span class="source-line-no">1508</span><span id="line-1508">  static abstract class MetaTest extends TableTest {</span>
+<span class="source-line-no">1509</span><span id="line-1509">    protected int keyLength;</span>
+<span class="source-line-no">1510</span><span id="line-1510"></span>
+<span class="source-line-no">1511</span><span id="line-1511">    MetaTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1512</span><span id="line-1512">      super(con, options, status);</span>
+<span class="source-line-no">1513</span><span id="line-1513">      keyLength = Integer.toString(opts.perClientRunRows).length();</span>
+<span class="source-line-no">1514</span><span id="line-1514">    }</span>
+<span class="source-line-no">1515</span><span id="line-1515"></span>
+<span class="source-line-no">1516</span><span id="line-1516">    @Override</span>
+<span class="source-line-no">1517</span><span id="line-1517">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1518</span><span id="line-1518">      // No clean up</span>
 <span class="source-line-no">1519</span><span id="line-1519">    }</span>
 <span class="source-line-no">1520</span><span id="line-1520"></span>
-<span class="source-line-no">1521</span><span id="line-1521">    @Override</span>
-<span class="source-line-no">1522</span><span id="line-1522">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1523</span><span id="line-1523">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1524</span><span id="line-1524">    }</span>
-<span class="source-line-no">1525</span><span id="line-1525"></span>
-<span class="source-line-no">1526</span><span id="line-1526">    @Override</span>
-<span class="source-line-no">1527</span><span id="line-1527">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1528</span><span id="line-1528">    }</span>
-<span class="source-line-no">1529</span><span id="line-1529">  }</span>
-<span class="source-line-no">1530</span><span id="line-1530"></span>
-<span class="source-line-no">1531</span><span id="line-1531">  static class AsyncRandomReadTest extends AsyncTableTest {</span>
-<span class="source-line-no">1532</span><span id="line-1532">    private final Consistency consistency;</span>
-<span class="source-line-no">1533</span><span id="line-1533">    private ArrayList&lt;Get&gt; gets;</span>
-<span class="source-line-no">1534</span><span id="line-1534"></span>
-<span class="source-line-no">1535</span><span id="line-1535">    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1536</span><span id="line-1536">      super(con, options, status);</span>
-<span class="source-line-no">1537</span><span id="line-1537">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
-<span class="source-line-no">1538</span><span id="line-1538">      if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1539</span><span id="line-1539">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
-<span class="source-line-no">1540</span><span id="line-1540">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
-<span class="source-line-no">1541</span><span id="line-1541">      }</span>
-<span class="source-line-no">1542</span><span id="line-1542">    }</span>
-<span class="source-line-no">1543</span><span id="line-1543"></span>
-<span class="source-line-no">1544</span><span id="line-1544">    @Override</span>
-<span class="source-line-no">1545</span><span id="line-1545">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1546</span><span id="line-1546">      if (opts.randomSleep &gt; 0) {</span>
-<span class="source-line-no">1547</span><span id="line-1547">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
-<span class="source-line-no">1548</span><span id="line-1548">      }</span>
-<span class="source-line-no">1549</span><span id="line-1549">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
-<span class="source-line-no">1550</span><span id="line-1550">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1551</span><span id="line-1551">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1552</span><span id="line-1552">        if (opts.addColumns) {</span>
-<span class="source-line-no">1553</span><span id="line-1553">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1554</span><span id="line-1554">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1555</span><span id="line-1555">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1556</span><span id="line-1556">          }</span>
-<span class="source-line-no">1557</span><span id="line-1557">        } else {</span>
-<span class="source-line-no">1558</span><span id="line-1558">          get.addFamily(familyName);</span>
-<span class="source-line-no">1559</span><span id="line-1559">        }</span>
-<span class="source-line-no">1560</span><span id="line-1560">      }</span>
-<span class="source-line-no">1561</span><span id="line-1561">      if (opts.filterAll) {</span>
-<span class="source-line-no">1562</span><span id="line-1562">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1563</span><span id="line-1563">      }</span>
-<span class="source-line-no">1564</span><span id="line-1564">      get.setConsistency(consistency);</span>
-<span class="source-line-no">1565</span><span id="line-1565">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
-<span class="source-line-no">1566</span><span id="line-1566">      try {</span>
-<span class="source-line-no">1567</span><span id="line-1567">        if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1568</span><span id="line-1568">          this.gets.add(get);</span>
-<span class="source-line-no">1569</span><span id="line-1569">          if (this.gets.size() == opts.multiGet) {</span>
-<span class="source-line-no">1570</span><span id="line-1570">            Result[] rs =</span>
-<span class="source-line-no">1571</span><span id="line-1571">              this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);</span>
-<span class="source-line-no">1572</span><span id="line-1572">            updateValueSize(rs);</span>
-<span class="source-line-no">1573</span><span id="line-1573">            this.gets.clear();</span>
-<span class="source-line-no">1574</span><span id="line-1574">          } else {</span>
-<span class="source-line-no">1575</span><span id="line-1575">            return false;</span>
-<span class="source-line-no">1576</span><span id="line-1576">          }</span>
-<span class="source-line-no">1577</span><span id="line-1577">        } else {</span>
-<span class="source-line-no">1578</span><span id="line-1578">          updateValueSize(this.table.get(get).get());</span>
-<span class="source-line-no">1579</span><span id="line-1579">        }</span>
-<span class="source-line-no">1580</span><span id="line-1580">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">1581</span><span id="line-1581">        throw new IOException(e);</span>
-<span class="source-line-no">1582</span><span id="line-1582">      }</span>
-<span class="source-line-no">1583</span><span id="line-1583">      return true;</span>
-<span class="source-line-no">1584</span><span id="line-1584">    }</span>
-<span class="source-line-no">1585</span><span id="line-1585"></span>
-<span class="source-line-no">1586</span><span id="line-1586">    public static RuntimeException runtime(Throwable e) {</span>
-<span class="source-line-no">1587</span><span id="line-1587">      if (e instanceof RuntimeException) {</span>
-<span class="source-line-no">1588</span><span id="line-1588">        return (RuntimeException) e;</span>
-<span class="source-line-no">1589</span><span id="line-1589">      }</span>
-<span class="source-line-no">1590</span><span id="line-1590">      return new RuntimeException(e);</span>
-<span class="source-line-no">1591</span><span id="line-1591">    }</span>
-<span class="source-line-no">1592</span><span id="line-1592"></span>
-<span class="source-line-no">1593</span><span id="line-1593">    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {</span>
-<span class="source-line-no">1594</span><span id="line-1594">      try {</span>
-<span class="source-line-no">1595</span><span id="line-1595">        return callable.call();</span>
-<span class="source-line-no">1596</span><span id="line-1596">      } catch (Exception e) {</span>
-<span class="source-line-no">1597</span><span id="line-1597">        throw runtime(e);</span>
+<span class="source-line-no">1521</span><span id="line-1521">    /*</span>
+<span class="source-line-no">1522</span><span id="line-1522">     * Generates Lexicographically ascending strings</span>
+<span class="source-line-no">1523</span><span id="line-1523">     */</span>
+<span class="source-line-no">1524</span><span id="line-1524">    protected byte[] getSplitKey(final int i) {</span>
+<span class="source-line-no">1525</span><span id="line-1525">      return Bytes.toBytes(String.format("%0" + keyLength + "d", i));</span>
+<span class="source-line-no">1526</span><span id="line-1526">    }</span>
+<span class="source-line-no">1527</span><span id="line-1527"></span>
+<span class="source-line-no">1528</span><span id="line-1528">  }</span>
+<span class="source-line-no">1529</span><span id="line-1529"></span>
+<span class="source-line-no">1530</span><span id="line-1530">  static abstract class AsyncTableTest extends AsyncTest {</span>
+<span class="source-line-no">1531</span><span id="line-1531">    protected AsyncTable&lt;?&gt; table;</span>
+<span class="source-line-no">1532</span><span id="line-1532"></span>
+<span class="source-line-no">1533</span><span id="line-1533">    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1534</span><span id="line-1534">      super(con, options, status);</span>
+<span class="source-line-no">1535</span><span id="line-1535">    }</span>
+<span class="source-line-no">1536</span><span id="line-1536"></span>
+<span class="source-line-no">1537</span><span id="line-1537">    @Override</span>
+<span class="source-line-no">1538</span><span id="line-1538">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1539</span><span id="line-1539">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1540</span><span id="line-1540">    }</span>
+<span class="source-line-no">1541</span><span id="line-1541"></span>
+<span class="source-line-no">1542</span><span id="line-1542">    @Override</span>
+<span class="source-line-no">1543</span><span id="line-1543">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1544</span><span id="line-1544">    }</span>
+<span class="source-line-no">1545</span><span id="line-1545">  }</span>
+<span class="source-line-no">1546</span><span id="line-1546"></span>
+<span class="source-line-no">1547</span><span id="line-1547">  static class AsyncRandomReadTest extends AsyncTableTest {</span>
+<span class="source-line-no">1548</span><span id="line-1548">    private final Consistency consistency;</span>
+<span class="source-line-no">1549</span><span id="line-1549">    private ArrayList&lt;Get&gt; gets;</span>
+<span class="source-line-no">1550</span><span id="line-1550"></span>
+<span class="source-line-no">1551</span><span id="line-1551">    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1552</span><span id="line-1552">      super(con, options, status);</span>
+<span class="source-line-no">1553</span><span id="line-1553">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
+<span class="source-line-no">1554</span><span id="line-1554">      if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">1555</span><span id="line-1555">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
+<span class="source-line-no">1556</span><span id="line-1556">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
+<span class="source-line-no">1557</span><span id="line-1557">      }</span>
+<span class="source-line-no">1558</span><span id="line-1558">    }</span>
+<span class="source-line-no">1559</span><span id="line-1559"></span>
+<span class="source-line-no">1560</span><span id="line-1560">    @Override</span>
+<span class="source-line-no">1561</span><span id="line-1561">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1562</span><span id="line-1562">      if (opts.randomSleep &gt; 0) {</span>
+<span class="source-line-no">1563</span><span id="line-1563">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
+<span class="source-line-no">1564</span><span id="line-1564">      }</span>
+<span class="source-line-no">1565</span><span id="line-1565">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
+<span class="source-line-no">1566</span><span id="line-1566">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1567</span><span id="line-1567">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1568</span><span id="line-1568">        if (opts.addColumns) {</span>
+<span class="source-line-no">1569</span><span id="line-1569">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1570</span><span id="line-1570">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1571</span><span id="line-1571">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1572</span><span id="line-1572">          }</span>
+<span class="source-line-no">1573</span><span id="line-1573">        } else {</span>
+<span class="source-line-no">1574</span><span id="line-1574">          get.addFamily(familyName);</span>
+<span class="source-line-no">1575</span><span id="line-1575">        }</span>
+<span class="source-line-no">1576</span><span id="line-1576">      }</span>
+<span class="source-line-no">1577</span><span id="line-1577">      if (opts.filterAll) {</span>
+<span class="source-line-no">1578</span><span id="line-1578">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1579</span><span id="line-1579">      }</span>
+<span class="source-line-no">1580</span><span id="line-1580">      get.setConsistency(consistency);</span>
+<span class="source-line-no">1581</span><span id="line-1581">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
+<span class="source-line-no">1582</span><span id="line-1582">      try {</span>
+<span class="source-line-no">1583</span><span id="line-1583">        if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">1584</span><span id="line-1584">          this.gets.add(get);</span>
+<span class="source-line-no">1585</span><span id="line-1585">          if (this.gets.size() == opts.multiGet) {</span>
+<span class="source-line-no">1586</span><span id="line-1586">            Result[] rs =</span>
+<span class="source-line-no">1587</span><span id="line-1587">              this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);</span>
+<span class="source-line-no">1588</span><span id="line-1588">            updateValueSize(rs);</span>
+<span class="source-line-no">1589</span><span id="line-1589">            this.gets.clear();</span>
+<span class="source-line-no">1590</span><span id="line-1590">          } else {</span>
+<span class="source-line-no">1591</span><span id="line-1591">            return false;</span>
+<span class="source-line-no">1592</span><span id="line-1592">          }</span>
+<span class="source-line-no">1593</span><span id="line-1593">        } else {</span>
+<span class="source-line-no">1594</span><span id="line-1594">          updateValueSize(this.table.get(get).get());</span>
+<span class="source-line-no">1595</span><span id="line-1595">        }</span>
+<span class="source-line-no">1596</span><span id="line-1596">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">1597</span><span id="line-1597">        throw new IOException(e);</span>
 <span class="source-line-no">1598</span><span id="line-1598">      }</span>
-<span class="source-line-no">1599</span><span id="line-1599">    }</span>
-<span class="source-line-no">1600</span><span id="line-1600"></span>
-<span class="source-line-no">1601</span><span id="line-1601">    @Override</span>
-<span class="source-line-no">1602</span><span id="line-1602">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1603</span><span id="line-1603">      int period = opts.perClientRunRows / 10;</span>
-<span class="source-line-no">1604</span><span id="line-1604">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">1605</span><span id="line-1605">    }</span>
-<span class="source-line-no">1606</span><span id="line-1606"></span>
-<span class="source-line-no">1607</span><span id="line-1607">    @Override</span>
-<span class="source-line-no">1608</span><span id="line-1608">    protected void testTakedown() throws IOException {</span>
-<span class="source-line-no">1609</span><span id="line-1609">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
-<span class="source-line-no">1610</span><span id="line-1610">        this.table.get(gets);</span>
-<span class="source-line-no">1611</span><span id="line-1611">        this.gets.clear();</span>
-<span class="source-line-no">1612</span><span id="line-1612">      }</span>
-<span class="source-line-no">1613</span><span id="line-1613">      super.testTakedown();</span>
-<span class="source-line-no">1614</span><span id="line-1614">    }</span>
-<span class="source-line-no">1615</span><span id="line-1615">  }</span>
+<span class="source-line-no">1599</span><span id="line-1599">      return true;</span>
+<span class="source-line-no">1600</span><span id="line-1600">    }</span>
+<span class="source-line-no">1601</span><span id="line-1601"></span>
+<span class="source-line-no">1602</span><span id="line-1602">    public static RuntimeException runtime(Throwable e) {</span>
+<span class="source-line-no">1603</span><span id="line-1603">      if (e instanceof RuntimeException) {</span>
+<span class="source-line-no">1604</span><span id="line-1604">        return (RuntimeException) e;</span>
+<span class="source-line-no">1605</span><span id="line-1605">      }</span>
+<span class="source-line-no">1606</span><span id="line-1606">      return new RuntimeException(e);</span>
+<span class="source-line-no">1607</span><span id="line-1607">    }</span>
+<span class="source-line-no">1608</span><span id="line-1608"></span>
+<span class="source-line-no">1609</span><span id="line-1609">    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {</span>
+<span class="source-line-no">1610</span><span id="line-1610">      try {</span>
+<span class="source-line-no">1611</span><span id="line-1611">        return callable.call();</span>
+<span class="source-line-no">1612</span><span id="line-1612">      } catch (Exception e) {</span>
+<span class="source-line-no">1613</span><span id="line-1613">        throw runtime(e);</span>
+<span class="source-line-no">1614</span><span id="line-1614">      }</span>
+<span class="source-line-no">1615</span><span id="line-1615">    }</span>
 <span class="source-line-no">1616</span><span id="line-1616"></span>
-<span class="source-line-no">1617</span><span id="line-1617">  static class AsyncRandomWriteTest extends AsyncSequentialWriteTest {</span>
-<span class="source-line-no">1618</span><span id="line-1618"></span>
-<span class="source-line-no">1619</span><span id="line-1619">    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1620</span><span id="line-1620">      super(con, options, status);</span>
+<span class="source-line-no">1617</span><span id="line-1617">    @Override</span>
+<span class="source-line-no">1618</span><span id="line-1618">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1619</span><span id="line-1619">      int period = opts.perClientRunRows / 10;</span>
+<span class="source-line-no">1620</span><span id="line-1620">      return period == 0 ? opts.perClientRunRows : period;</span>
 <span class="source-line-no">1621</span><span id="line-1621">    }</span>
 <span class="source-line-no">1622</span><span id="line-1622"></span>
 <span class="source-line-no">1623</span><span id="line-1623">    @Override</span>
-<span class="source-line-no">1624</span><span id="line-1624">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">1625</span><span id="line-1625">      return getRandomRow(this.rand, opts.totalRows);</span>
-<span class="source-line-no">1626</span><span id="line-1626">    }</span>
-<span class="source-line-no">1627</span><span id="line-1627">  }</span>
-<span class="source-line-no">1628</span><span id="line-1628"></span>
-<span class="source-line-no">1629</span><span id="line-1629">  static class AsyncScanTest extends AsyncTableTest {</span>
-<span class="source-line-no">1630</span><span id="line-1630">    private ResultScanner testScanner;</span>
-<span class="source-line-no">1631</span><span id="line-1631">    private AsyncTable&lt;?&gt; asyncTable;</span>
+<span class="source-line-no">1624</span><span id="line-1624">    protected void testTakedown() throws IOException {</span>
+<span class="source-line-no">1625</span><span id="line-1625">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
+<span class="source-line-no">1626</span><span id="line-1626">        this.table.get(gets);</span>
+<span class="source-line-no">1627</span><span id="line-1627">        this.gets.clear();</span>
+<span class="source-line-no">1628</span><span id="line-1628">      }</span>
+<span class="source-line-no">1629</span><span id="line-1629">      super.testTakedown();</span>
+<span class="source-line-no">1630</span><span id="line-1630">    }</span>
+<span class="source-line-no">1631</span><span id="line-1631">  }</span>
 <span class="source-line-no">1632</span><span id="line-1632"></span>
-<span class="source-line-no">1633</span><span id="line-1633">    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1634</span><span id="line-1634">      super(con, options, status);</span>
-<span class="source-line-no">1635</span><span id="line-1635">    }</span>
-<span class="source-line-no">1636</span><span id="line-1636"></span>
-<span class="source-line-no">1637</span><span id="line-1637">    @Override</span>
-<span class="source-line-no">1638</span><span id="line-1638">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1639</span><span id="line-1639">      this.asyncTable = connection.getTable(TableName.valueOf(opts.tableName),</span>
-<span class="source-line-no">1640</span><span id="line-1640">        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));</span>
-<span class="source-line-no">1641</span><span id="line-1641">    }</span>
-<span class="source-line-no">1642</span><span id="line-1642"></span>
-<span class="source-line-no">1643</span><span id="line-1643">    @Override</span>
-<span class="source-line-no">1644</span><span id="line-1644">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">1645</span><span id="line-1645">      if (this.testScanner != null) {</span>
-<span class="source-line-no">1646</span><span id="line-1646">        updateScanMetrics(this.testScanner.getScanMetrics());</span>
-<span class="source-line-no">1647</span><span id="line-1647">        this.testScanner.close();</span>
-<span class="source-line-no">1648</span><span id="line-1648">      }</span>
-<span class="source-line-no">1649</span><span id="line-1649">      super.testTakedown();</span>
-<span class="source-line-no">1650</span><span id="line-1650">    }</span>
-<span class="source-line-no">1651</span><span id="line-1651"></span>
-<span class="source-line-no">1652</span><span id="line-1652">    @Override</span>
-<span class="source-line-no">1653</span><span id="line-1653">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">1654</span><span id="line-1654">      if (this.testScanner == null) {</span>
-<span class="source-line-no">1655</span><span id="line-1655">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
-<span class="source-line-no">1656</span><span id="line-1656">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">1657</span><span id="line-1657">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">1658</span><span id="line-1658">        for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1659</span><span id="line-1659">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1660</span><span id="line-1660">          if (opts.addColumns) {</span>
-<span class="source-line-no">1661</span><span id="line-1661">            for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1662</span><span id="line-1662">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1663</span><span id="line-1663">              scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1664</span><span id="line-1664">            }</span>
-<span class="source-line-no">1665</span><span id="line-1665">          } else {</span>
-<span class="source-line-no">1666</span><span id="line-1666">            scan.addFamily(familyName);</span>
-<span class="source-line-no">1667</span><span id="line-1667">          }</span>
-<span class="source-line-no">1668</span><span id="line-1668">        }</span>
-<span class="source-line-no">1669</span><span id="line-1669">        if (opts.filterAll) {</span>
-<span class="source-line-no">1670</span><span id="line-1670">          scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1671</span><span id="line-1671">        }</span>
-<span class="source-line-no">1672</span><span id="line-1672">        this.testScanner = asyncTable.getScanner(scan);</span>
-<span class="source-line-no">1673</span><span id="line-1673">      }</span>
-<span class="source-line-no">1674</span><span id="line-1674">      Result r = testScanner.next();</span>
-<span class="source-line-no">1675</span><span id="line-1675">      updateValueSize(r);</span>
-<span class="source-line-no">1676</span><span id="line-1676">      return true;</span>
-<span class="source-line-no">1677</span><span id="line-1677">    }</span>
-<span class="source-line-no">1678</span><span id="line-1678">  }</span>
-<span class="source-line-no">1679</span><span id="line-1679"></span>
-<span class="source-line-no">1680</span><span id="line-1680">  static class AsyncSequentialReadTest extends AsyncTableTest {</span>
-<span class="source-line-no">1681</span><span id="line-1681">    AsyncSequentialReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1682</span><span id="line-1682">      super(con, options, status);</span>
-<span class="source-line-no">1683</span><span id="line-1683">    }</span>
-<span class="source-line-no">1684</span><span id="line-1684"></span>
-<span class="source-line-no">1685</span><span id="line-1685">    @Override</span>
-<span class="source-line-no">1686</span><span id="line-1686">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1687</span><span id="line-1687">      Get get = new Get(format(i));</span>
-<span class="source-line-no">1688</span><span id="line-1688">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1689</span><span id="line-1689">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1690</span><span id="line-1690">        if (opts.addColumns) {</span>
-<span class="source-line-no">1691</span><span id="line-1691">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1692</span><span id="line-1692">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1693</span><span id="line-1693">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1694</span><span id="line-1694">          }</span>
-<span class="source-line-no">1695</span><span id="line-1695">        } else {</span>
-<span class="source-line-no">1696</span><span id="line-1696">          get.addFamily(familyName);</span>
-<span class="source-line-no">1697</span><span id="line-1697">        }</span>
-<span class="source-line-no">1698</span><span id="line-1698">      }</span>
-<span class="source-line-no">1699</span><span id="line-1699">      if (opts.filterAll) {</span>
-<span class="source-line-no">1700</span><span id="line-1700">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1701</span><span id="line-1701">      }</span>
-<span class="source-line-no">1702</span><span id="line-1702">      try {</span>
-<span class="source-line-no">1703</span><span id="line-1703">        updateValueSize(table.get(get).get());</span>
-<span class="source-line-no">1704</span><span id="line-1704">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">1705</span><span id="line-1705">        throw new IOException(e);</span>
-<span class="source-line-no">1706</span><span id="line-1706">      }</span>
-<span class="source-line-no">1707</span><span id="line-1707">      return true;</span>
-<span class="source-line-no">1708</span><span id="line-1708">    }</span>
-<span class="source-line-no">1709</span><span id="line-1709">  }</span>
-<span class="source-line-no">1710</span><span id="line-1710"></span>
-<span class="source-line-no">1711</span><span id="line-1711">  static class AsyncSequentialWriteTest extends AsyncTableTest {</span>
-<span class="source-line-no">1712</span><span id="line-1712">    private ArrayList&lt;Put&gt; puts;</span>
-<span class="source-line-no">1713</span><span id="line-1713"></span>
-<span class="source-line-no">1714</span><span id="line-1714">    AsyncSequentialWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1715</span><span id="line-1715">      super(con, options, status);</span>
-<span class="source-line-no">1716</span><span id="line-1716">      if (opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">1717</span><span id="line-1717">        LOG.info("MultiPut enabled. Sending PUTs in batches of " + opts.multiPut + ".");</span>
-<span class="source-line-no">1718</span><span id="line-1718">        this.puts = new ArrayList&lt;&gt;(opts.multiPut);</span>
-<span class="source-line-no">1719</span><span id="line-1719">      }</span>
-<span class="source-line-no">1720</span><span id="line-1720">    }</span>
-<span class="source-line-no">1721</span><span id="line-1721"></span>
-<span class="source-line-no">1722</span><span id="line-1722">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">1723</span><span id="line-1723">      return format(i);</span>
+<span class="source-line-no">1633</span><span id="line-1633">  static class AsyncRandomWriteTest extends AsyncSequentialWriteTest {</span>
+<span class="source-line-no">1634</span><span id="line-1634"></span>
+<span class="source-line-no">1635</span><span id="line-1635">    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1636</span><span id="line-1636">      super(con, options, status);</span>
+<span class="source-line-no">1637</span><span id="line-1637">    }</span>
+<span class="source-line-no">1638</span><span id="line-1638"></span>
+<span class="source-line-no">1639</span><span id="line-1639">    @Override</span>
+<span class="source-line-no">1640</span><span id="line-1640">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">1641</span><span id="line-1641">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">1642</span><span id="line-1642">    }</span>
+<span class="source-line-no">1643</span><span id="line-1643">  }</span>
+<span class="source-line-no">1644</span><span id="line-1644"></span>
+<span class="source-line-no">1645</span><span id="line-1645">  static class AsyncScanTest extends AsyncTableTest {</span>
+<span class="source-line-no">1646</span><span id="line-1646">    private ResultScanner testScanner;</span>
+<span class="source-line-no">1647</span><span id="line-1647">    private AsyncTable&lt;?&gt; asyncTable;</span>
+<span class="source-line-no">1648</span><span id="line-1648"></span>
+<span class="source-line-no">1649</span><span id="line-1649">    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1650</span><span id="line-1650">      super(con, options, status);</span>
+<span class="source-line-no">1651</span><span id="line-1651">    }</span>
+<span class="source-line-no">1652</span><span id="line-1652"></span>
+<span class="source-line-no">1653</span><span id="line-1653">    @Override</span>
+<span class="source-line-no">1654</span><span id="line-1654">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1655</span><span id="line-1655">      this.asyncTable = connection.getTable(TableName.valueOf(opts.tableName),</span>
+<span class="source-line-no">1656</span><span id="line-1656">        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));</span>
+<span class="source-line-no">1657</span><span id="line-1657">    }</span>
+<span class="source-line-no">1658</span><span id="line-1658"></span>
+<span class="source-line-no">1659</span><span id="line-1659">    @Override</span>
+<span class="source-line-no">1660</span><span id="line-1660">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">1661</span><span id="line-1661">      if (this.testScanner != null) {</span>
+<span class="source-line-no">1662</span><span id="line-1662">        updateScanMetrics(this.testScanner.getScanMetrics());</span>
+<span class="source-line-no">1663</span><span id="line-1663">        this.testScanner.close();</span>
+<span class="source-line-no">1664</span><span id="line-1664">      }</span>
+<span class="source-line-no">1665</span><span id="line-1665">      super.testTakedown();</span>
+<span class="source-line-no">1666</span><span id="line-1666">    }</span>
+<span class="source-line-no">1667</span><span id="line-1667"></span>
+<span class="source-line-no">1668</span><span id="line-1668">    @Override</span>
+<span class="source-line-no">1669</span><span id="line-1669">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">1670</span><span id="line-1670">      if (this.testScanner == null) {</span>
+<span class="source-line-no">1671</span><span id="line-1671">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
+<span class="source-line-no">1672</span><span id="line-1672">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">1673</span><span id="line-1673">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">1674</span><span id="line-1674">        for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1675</span><span id="line-1675">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1676</span><span id="line-1676">          if (opts.addColumns) {</span>
+<span class="source-line-no">1677</span><span id="line-1677">            for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1678</span><span id="line-1678">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1679</span><span id="line-1679">              scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1680</span><span id="line-1680">            }</span>
+<span class="source-line-no">1681</span><span id="line-1681">          } else {</span>
+<span class="source-line-no">1682</span><span id="line-1682">            scan.addFamily(familyName);</span>
+<span class="source-line-no">1683</span><span id="line-1683">          }</span>
+<span class="source-line-no">1684</span><span id="line-1684">        }</span>
+<span class="source-line-no">1685</span><span id="line-1685">        if (opts.filterAll) {</span>
+<span class="source-line-no">1686</span><span id="line-1686">          scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1687</span><span id="line-1687">        }</span>
+<span class="source-line-no">1688</span><span id="line-1688">        this.testScanner = asyncTable.getScanner(scan);</span>
+<span class="source-line-no">1689</span><span id="line-1689">      }</span>
+<span class="source-line-no">1690</span><span id="line-1690">      Result r = testScanner.next();</span>
+<span class="source-line-no">1691</span><span id="line-1691">      updateValueSize(r);</span>
+<span class="source-line-no">1692</span><span id="line-1692">      return true;</span>
+<span class="source-line-no">1693</span><span id="line-1693">    }</span>
+<span class="source-line-no">1694</span><span id="line-1694">  }</span>
+<span class="source-line-no">1695</span><span id="line-1695"></span>
+<span class="source-line-no">1696</span><span id="line-1696">  static class AsyncSequentialReadTest extends AsyncTableTest {</span>
+<span class="source-line-no">1697</span><span id="line-1697">    AsyncSequentialReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1698</span><span id="line-1698">      super(con, options, status);</span>
+<span class="source-line-no">1699</span><span id="line-1699">    }</span>
+<span class="source-line-no">1700</span><span id="line-1700"></span>
+<span class="source-line-no">1701</span><span id="line-1701">    @Override</span>
+<span class="source-line-no">1702</span><span id="line-1702">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1703</span><span id="line-1703">      Get get = new Get(format(i));</span>
+<span class="source-line-no">1704</span><span id="line-1704">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1705</span><span id="line-1705">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1706</span><span id="line-1706">        if (opts.addColumns) {</span>
+<span class="source-line-no">1707</span><span id="line-1707">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1708</span><span id="line-1708">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1709</span><span id="line-1709">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1710</span><span id="line-1710">          }</span>
+<span class="source-line-no">1711</span><span id="line-1711">        } else {</span>
+<span class="source-line-no">1712</span><span id="line-1712">          get.addFamily(familyName);</span>
+<span class="source-line-no">1713</span><span id="line-1713">        }</span>
+<span class="source-line-no">1714</span><span id="line-1714">      }</span>
+<span class="source-line-no">1715</span><span id="line-1715">      if (opts.filterAll) {</span>
+<span class="source-line-no">1716</span><span id="line-1716">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1717</span><span id="line-1717">      }</span>
+<span class="source-line-no">1718</span><span id="line-1718">      try {</span>
+<span class="source-line-no">1719</span><span id="line-1719">        updateValueSize(table.get(get).get());</span>
+<span class="source-line-no">1720</span><span id="line-1720">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">1721</span><span id="line-1721">        throw new IOException(e);</span>
+<span class="source-line-no">1722</span><span id="line-1722">      }</span>
+<span class="source-line-no">1723</span><span id="line-1723">      return true;</span>
 <span class="source-line-no">1724</span><span id="line-1724">    }</span>
-<span class="source-line-no">1725</span><span id="line-1725"></span>
-<span class="source-line-no">1726</span><span id="line-1726">    @Override</span>
-<span class="source-line-no">1727</span><span id="line-1727">    @SuppressWarnings("ReturnValueIgnored")</span>
-<span class="source-line-no">1728</span><span id="line-1728">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1729</span><span id="line-1729">      byte[] row = generateRow(i);</span>
-<span class="source-line-no">1730</span><span id="line-1730">      Put put = new Put(row);</span>
-<span class="source-line-no">1731</span><span id="line-1731">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1732</span><span id="line-1732">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1733</span><span id="line-1733">        for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1734</span><span id="line-1734">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1735</span><span id="line-1735">          byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
-<span class="source-line-no">1736</span><span id="line-1736">          if (opts.useTags) {</span>
-<span class="source-line-no">1737</span><span id="line-1737">            byte[] tag = generateData(this.rand, TAG_LENGTH);</span>
-<span class="source-line-no">1738</span><span id="line-1738">            Tag[] tags = new Tag[opts.noOfTags];</span>
-<span class="source-line-no">1739</span><span id="line-1739">            for (int n = 0; n &lt; opts.noOfTags; n++) {</span>
-<span class="source-line-no">1740</span><span id="line-1740">              Tag t = new ArrayBackedTag((byte) n, tag);</span>
-<span class="source-line-no">1741</span><span id="line-1741">              tags[n] = t;</span>
-<span class="source-line-no">1742</span><span id="line-1742">            }</span>
-<span class="source-line-no">1743</span><span id="line-1743">            KeyValue kv =</span>
-<span class="source-line-no">1744</span><span id="line-1744">              new KeyValue(row, familyName, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);</span>
-<span class="source-line-no">1745</span><span id="line-1745">            put.add(kv);</span>
-<span class="source-line-no">1746</span><span id="line-1746">            updateValueSize(kv.getValueLength());</span>
-<span class="source-line-no">1747</span><span id="line-1747">          } else {</span>
-<span class="source-line-no">1748</span><span id="line-1748">            put.addColumn(familyName, qualifier, value);</span>
-<span class="source-line-no">1749</span><span id="line-1749">            updateValueSize(value.length);</span>
-<span class="source-line-no">1750</span><span id="line-1750">          }</span>
-<span class="source-line-no">1751</span><span id="line-1751">        }</span>
-<span class="source-line-no">1752</span><span id="line-1752">      }</span>
-<span class="source-line-no">1753</span><span id="line-1753">      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
-<span class="source-line-no">1754</span><span id="line-1754">      try {</span>
-<span class="source-line-no">1755</span><span id="line-1755">        table.put(put).get();</span>
-<span class="source-line-no">1756</span><span id="line-1756">        if (opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">1757</span><span id="line-1757">          this.puts.add(put);</span>
-<span class="source-line-no">1758</span><span id="line-1758">          if (this.puts.size() == opts.multiPut) {</span>
-<span class="source-line-no">1759</span><span id="line-1759">            this.table.put(puts).stream().map(f -&gt; AsyncRandomReadTest.propagate(f::get));</span>
-<span class="source-line-no">1760</span><span id="line-1760">            this.puts.clear();</span>
-<span class="source-line-no">1761</span><span id="line-1761">          } else {</span>
-<span class="source-line-no">1762</span><span id="line-1762">            return false;</span>
-<span class="source-line-no">1763</span><span id="line-1763">          }</span>
-<span class="source-line-no">1764</span><span id="line-1764">        } else {</span>
-<span class="source-line-no">1765</span><span id="line-1765">          table.put(put).get();</span>
-<span class="source-line-no">1766</span><span id="line-1766">        }</span>
-<span class="source-line-no">1767</span><span id="line-1767">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">1768</span><span id="line-1768">        throw new IOException(e);</span>
-<span class="source-line-no">1769</span><span id="line-1769">      }</span>
-<span class="source-line-no">1770</span><span id="line-1770">      return true;</span>
-<span class="source-line-no">1771</span><span id="line-1771">    }</span>
-<span class="source-line-no">1772</span><span id="line-1772">  }</span>
-<span class="source-line-no">1773</span><span id="line-1773"></span>
-<span class="source-line-no">1774</span><span id="line-1774">  static abstract class BufferedMutatorTest extends Test {</span>
-<span class="source-line-no">1775</span><span id="line-1775">    protected BufferedMutator mutator;</span>
-<span class="source-line-no">1776</span><span id="line-1776">    protected Table table;</span>
-<span class="source-line-no">1777</span><span id="line-1777"></span>
-<span class="source-line-no">1778</span><span id="line-1778">    BufferedMutatorTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1779</span><span id="line-1779">      super(con, options, status);</span>
-<span class="source-line-no">1780</span><span id="line-1780">    }</span>
-<span class="source-line-no">1781</span><span id="line-1781"></span>
-<span class="source-line-no">1782</span><span id="line-1782">    @Override</span>
-<span class="source-line-no">1783</span><span id="line-1783">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1784</span><span id="line-1784">      BufferedMutatorParams p = new BufferedMutatorParams(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1785</span><span id="line-1785">      p.writeBufferSize(opts.bufferSize);</span>
-<span class="source-line-no">1786</span><span id="line-1786">      this.mutator = connection.getBufferedMutator(p);</span>
-<span class="source-line-no">1787</span><span id="line-1787">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1788</span><span id="line-1788">    }</span>
+<span class="source-line-no">1725</span><span id="line-1725">  }</span>
+<span class="source-line-no">1726</span><span id="line-1726"></span>
+<span class="source-line-no">1727</span><span id="line-1727">  static class AsyncSequentialWriteTest extends AsyncTableTest {</span>
+<span class="source-line-no">1728</span><span id="line-1728">    private ArrayList&lt;Put&gt; puts;</span>
+<span class="source-line-no">1729</span><span id="line-1729"></span>
+<span class="source-line-no">1730</span><span id="line-1730">    AsyncSequentialWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1731</span><span id="line-1731">      super(con, options, status);</span>
+<span class="source-line-no">1732</span><span id="line-1732">      if (opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">1733</span><span id="line-1733">        LOG.info("MultiPut enabled. Sending PUTs in batches of " + opts.multiPut + ".");</span>
+<span class="source-line-no">1734</span><span id="line-1734">        this.puts = new ArrayList&lt;&gt;(opts.multiPut);</span>
+<span class="source-line-no">1735</span><span id="line-1735">      }</span>
+<span class="source-line-no">1736</span><span id="line-1736">    }</span>
+<span class="source-line-no">1737</span><span id="line-1737"></span>
+<span class="source-line-no">1738</span><span id="line-1738">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">1739</span><span id="line-1739">      return format(i);</span>
+<span class="source-line-no">1740</span><span id="line-1740">    }</span>
+<span class="source-line-no">1741</span><span id="line-1741"></span>
+<span class="source-line-no">1742</span><span id="line-1742">    @Override</span>
+<span class="source-line-no">1743</span><span id="line-1743">    @SuppressWarnings("ReturnValueIgnored")</span>
+<span class="source-line-no">1744</span><span id="line-1744">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1745</span><span id="line-1745">      byte[] row = generateRow(i);</span>
+<span class="source-line-no">1746</span><span id="line-1746">      Put put = new Put(row);</span>
+<span class="source-line-no">1747</span><span id="line-1747">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1748</span><span id="line-1748">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1749</span><span id="line-1749">        for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1750</span><span id="line-1750">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1751</span><span id="line-1751">          byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
+<span class="source-line-no">1752</span><span id="line-1752">          if (opts.useTags) {</span>
+<span class="source-line-no">1753</span><span id="line-1753">            byte[] tag = generateData(this.rand, TAG_LENGTH);</span>
+<span class="source-line-no">1754</span><span id="line-1754">            Tag[] tags = new Tag[opts.noOfTags];</span>
+<span class="source-line-no">1755</span><span id="line-1755">            for (int n = 0; n &lt; opts.noOfTags; n++) {</span>
+<span class="source-line-no">1756</span><span id="line-1756">              Tag t = new ArrayBackedTag((byte) n, tag);</span>
+<span class="source-line-no">1757</span><span id="line-1757">              tags[n] = t;</span>
+<span class="source-line-no">1758</span><span id="line-1758">            }</span>
+<span class="source-line-no">1759</span><span id="line-1759">            KeyValue kv =</span>
+<span class="source-line-no">1760</span><span id="line-1760">              new KeyValue(row, familyName, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);</span>
+<span class="source-line-no">1761</span><span id="line-1761">            put.add(kv);</span>
+<span class="source-line-no">1762</span><span id="line-1762">            updateValueSize(kv.getValueLength());</span>
+<span class="source-line-no">1763</span><span id="line-1763">          } else {</span>
+<span class="source-line-no">1764</span><span id="line-1764">            put.addColumn(familyName, qualifier, value);</span>
+<span class="source-line-no">1765</span><span id="line-1765">            updateValueSize(value.length);</span>
+<span class="source-line-no">1766</span><span id="line-1766">          }</span>
+<span class="source-line-no">1767</span><span id="line-1767">        }</span>
+<span class="source-line-no">1768</span><span id="line-1768">      }</span>
+<span class="source-line-no">1769</span><span id="line-1769">      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
+<span class="source-line-no">1770</span><span id="line-1770">      try {</span>
+<span class="source-line-no">1771</span><span id="line-1771">        table.put(put).get();</span>
+<span class="source-line-no">1772</span><span id="line-1772">        if (opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">1773</span><span id="line-1773">          this.puts.add(put);</span>
+<span class="source-line-no">1774</span><span id="line-1774">          if (this.puts.size() == opts.multiPut) {</span>
+<span class="source-line-no">1775</span><span id="line-1775">            this.table.put(puts).stream().map(f -&gt; AsyncRandomReadTest.propagate(f::get));</span>
+<span class="source-line-no">1776</span><span id="line-1776">            this.puts.clear();</span>
+<span class="source-line-no">1777</span><span id="line-1777">          } else {</span>
+<span class="source-line-no">1778</span><span id="line-1778">            return false;</span>
+<span class="source-line-no">1779</span><span id="line-1779">          }</span>
+<span class="source-line-no">1780</span><span id="line-1780">        } else {</span>
+<span class="source-line-no">1781</span><span id="line-1781">          table.put(put).get();</span>
+<span class="source-line-no">1782</span><span id="line-1782">        }</span>
+<span class="source-line-no">1783</span><span id="line-1783">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">1784</span><span id="line-1784">        throw new IOException(e);</span>
+<span class="source-line-no">1785</span><span id="line-1785">      }</span>
+<span class="source-line-no">1786</span><span id="line-1786">      return true;</span>
+<span class="source-line-no">1787</span><span id="line-1787">    }</span>
+<span class="source-line-no">1788</span><span id="line-1788">  }</span>
 <span class="source-line-no">1789</span><span id="line-1789"></span>
-<span class="source-line-no">1790</span><span id="line-1790">    @Override</span>
-<span class="source-line-no">1791</span><span id="line-1791">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1792</span><span id="line-1792">      mutator.close();</span>
-<span class="source-line-no">1793</span><span id="line-1793">      table.close();</span>
-<span class="source-line-no">1794</span><span id="line-1794">    }</span>
-<span class="source-line-no">1795</span><span id="line-1795">  }</span>
-<span class="source-line-no">1796</span><span id="line-1796"></span>
-<span class="source-line-no">1797</span><span id="line-1797">  static class RandomSeekScanTest extends TableTest {</span>
-<span class="source-line-no">1798</span><span id="line-1798">    RandomSeekScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1799</span><span id="line-1799">      super(con, options, status);</span>
-<span class="source-line-no">1800</span><span id="line-1800">    }</span>
-<span class="source-line-no">1801</span><span id="line-1801"></span>
-<span class="source-line-no">1802</span><span id="line-1802">    @Override</span>
-<span class="source-line-no">1803</span><span id="line-1803">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">1804</span><span id="line-1804">      Scan scan =</span>
-<span class="source-line-no">1805</span><span id="line-1805">        new Scan().withStartRow(getRandomRow(this.rand, opts.totalRows)).setCaching(opts.caching)</span>
-<span class="source-line-no">1806</span><span id="line-1806">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">1807</span><span id="line-1807">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">1808</span><span id="line-1808">      FilterList list = new FilterList();</span>
-<span class="source-line-no">1809</span><span id="line-1809">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1810</span><span id="line-1810">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1811</span><span id="line-1811">        if (opts.addColumns) {</span>
-<span class="source-line-no">1812</span><span id="line-1812">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1813</span><span id="line-1813">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1814</span><span id="line-1814">            scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1815</span><span id="line-1815">          }</span>
-<span class="source-line-no">1816</span><span id="line-1816">        } else {</span>
-<span class="source-line-no">1817</span><span id="line-1817">          scan.addFamily(familyName);</span>
-<span class="source-line-no">1818</span><span id="line-1818">        }</span>
-<span class="source-line-no">1819</span><span id="line-1819">      }</span>
-<span class="source-line-no">1820</span><span id="line-1820">      if (opts.filterAll) {</span>
-<span class="source-line-no">1821</span><span id="line-1821">        list.addFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1822</span><span id="line-1822">      }</span>
-<span class="source-line-no">1823</span><span id="line-1823">      list.addFilter(new WhileMatchFilter(new PageFilter(120)));</span>
-<span class="source-line-no">1824</span><span id="line-1824">      scan.setFilter(list);</span>
-<span class="source-line-no">1825</span><span id="line-1825">      ResultScanner s = this.table.getScanner(scan);</span>
-<span class="source-line-no">1826</span><span id="line-1826">      try {</span>
-<span class="source-line-no">1827</span><span id="line-1827">        for (Result rr; (rr = s.next()) != null;) {</span>
-<span class="source-line-no">1828</span><span id="line-1828">          updateValueSize(rr);</span>
-<span class="source-line-no">1829</span><span id="line-1829">        }</span>
-<span class="source-line-no">1830</span><span id="line-1830">      } finally {</span>
-<span class="source-line-no">1831</span><span id="line-1831">        updateScanMetrics(s.getScanMetrics());</span>
-<span class="source-line-no">1832</span><span id="line-1832">        s.close();</span>
-<span class="source-line-no">1833</span><span id="line-1833">      }</span>
-<span class="source-line-no">1834</span><span id="line-1834">      return true;</span>
-<span class="source-line-no">1835</span><span id="line-1835">    }</span>
-<span class="source-line-no">1836</span><span id="line-1836"></span>
-<span class="source-line-no">1837</span><span id="line-1837">    @Override</span>
-<span class="source-line-no">1838</span><span id="line-1838">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1839</span><span id="line-1839">      int period = opts.perClientRunRows / 100;</span>
-<span class="source-line-no">1840</span><span id="line-1840">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">1841</span><span id="line-1841">    }</span>
-<span class="source-line-no">1842</span><span id="line-1842"></span>
-<span class="source-line-no">1843</span><span id="line-1843">  }</span>
-<span class="source-line-no">1844</span><span id="line-1844"></span>
-<span class="source-line-no">1845</span><span id="line-1845">  static abstract class RandomScanWithRangeTest extends TableTest {</span>
-<span class="source-line-no">1846</span><span id="line-1846">    RandomScanWithRangeTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1847</span><span id="line-1847">      super(con, options, status);</span>
-<span class="source-line-no">1848</span><span id="line-1848">    }</span>
-<span class="source-line-no">1849</span><span id="line-1849"></span>
-<span class="source-line-no">1850</span><span id="line-1850">    @Override</span>
-<span class="source-line-no">1851</span><span id="line-1851">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">1852</span><span id="line-1852">      Pair&lt;byte[], byte[]&gt; startAndStopRow = getStartAndStopRow();</span>
-<span class="source-line-no">1853</span><span id="line-1853">      Scan scan = new Scan().withStartRow(startAndStopRow.getFirst())</span>
-<span class="source-line-no">1854</span><span id="line-1854">        .withStopRow(startAndStopRow.getSecond()).setCaching(opts.caching)</span>
-<span class="source-line-no">1855</span><span id="line-1855">        .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">1856</span><span id="line-1856">        .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">1857</span><span id="line-1857">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1858</span><span id="line-1858">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1859</span><span id="line-1859">        if (opts.addColumns) {</span>
-<span class="source-line-no">1860</span><span id="line-1860">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1861</span><span id="line-1861">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1862</span><span id="line-1862">            scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1863</span><span id="line-1863">          }</span>
-<span class="source-line-no">1864</span><span id="line-1864">        } else {</span>
-<span class="source-line-no">1865</span><span id="line-1865">          scan.addFamily(familyName);</span>
-<span class="source-line-no">1866</span><span id="line-1866">        }</span>
-<span class="source-line-no">1867</span><span id="line-1867">      }</span>
-<span class="source-line-no">1868</span><span id="line-1868">      if (opts.filterAll) {</span>
-<span class="source-line-no">1869</span><span id="line-1869">        scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1870</span><span id="line-1870">      }</span>
-<span class="source-line-no">1871</span><span id="line-1871">      Result r = null;</span>
-<span class="source-line-no">1872</span><span id="line-1872">      int count = 0;</span>
-<span class="source-line-no">1873</span><span id="line-1873">      ResultScanner s = this.table.getScanner(scan);</span>
-<span class="source-line-no">1874</span><span id="line-1874">      try {</span>
-<span class="source-line-no">1875</span><span id="line-1875">        for (; (r = s.next()) != null;) {</span>
-<span class="source-line-no">1876</span><span id="line-1876">          updateValueSize(r);</span>
-<span class="source-line-no">1877</span><span id="line-1877">          count++;</span>
-<span class="source-line-no">1878</span><span id="line-1878">        }</span>
-<span class="source-line-no">1879</span><span id="line-1879">        if (i % 100 == 0) {</span>
-<span class="source-line-no">1880</span><span id="line-1880">          LOG.info(String.format("Scan for key range %s - %s returned %s rows",</span>
-<span class="source-line-no">1881</span><span id="line-1881">            Bytes.toString(startAndStopRow.getFirst()), Bytes.toString(startAndStopRow.getSecond()),</span>
-<span class="source-line-no">1882</span><span id="line-1882">            count));</span>
-<span class="source-line-no">1883</span><span id="line-1883">        }</span>
-<span class="source-line-no">1884</span><span id="line-1884">      } finally {</span>
-<span class="source-line-no">1885</span><span id="line-1885">        updateScanMetrics(s.getScanMetrics());</span>
-<span class="source-line-no">1886</span><span id="line-1886">        s.close();</span>
-<span class="source-line-no">1887</span><span id="line-1887">      }</span>
-<span class="source-line-no">1888</span><span id="line-1888">      return true;</span>
-<span class="source-line-no">1889</span><span id="line-1889">    }</span>
-<span class="source-line-no">1890</span><span id="line-1890"></span>
-<span class="source-line-no">1891</span><span id="line-1891">    protected abstract Pair&lt;byte[], byte[]&gt; getStartAndStopRow();</span>
-<span class="source-line-no">1892</span><span id="line-1892"></span>
-<span class="source-line-no">1893</span><span id="line-1893">    protected Pair&lt;byte[], byte[]&gt; generateStartAndStopRows(int maxRange) {</span>
-<span class="source-line-no">1894</span><span id="line-1894">      int start = this.rand.nextInt(Integer.MAX_VALUE) % opts.totalRows;</span>
-<span class="source-line-no">1895</span><span id="line-1895">      int stop = start + maxRange;</span>
-<span class="source-line-no">1896</span><span id="line-1896">      return new Pair&lt;&gt;(format(start), format(stop));</span>
-<span class="source-line-no">1897</span><span id="line-1897">    }</span>
-<span class="source-line-no">1898</span><span id="line-1898"></span>
-<span class="source-line-no">1899</span><span id="line-1899">    @Override</span>
-<span class="source-line-no">1900</span><span id="line-1900">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1901</span><span id="line-1901">      int period = opts.perClientRunRows / 100;</span>
-<span class="source-line-no">1902</span><span id="line-1902">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">1903</span><span id="line-1903">    }</span>
-<span class="source-line-no">1904</span><span id="line-1904">  }</span>
-<span class="source-line-no">1905</span><span id="line-1905"></span>
-<span class="source-line-no">1906</span><span id="line-1906">  static class RandomScanWithRange10Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1907</span><span id="line-1907">    RandomScanWithRange10Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1908</span><span id="line-1908">      super(con, options, status);</span>
-<span class="source-line-no">1909</span><span id="line-1909">    }</span>
-<span class="source-line-no">1910</span><span id="line-1910"></span>
-<span class="source-line-no">1911</span><span id="line-1911">    @Override</span>
-<span class="source-line-no">1912</span><span id="line-1912">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1913</span><span id="line-1913">      return generateStartAndStopRows(10);</span>
-<span class="source-line-no">1914</span><span id="line-1914">    }</span>
-<span class="source-line-no">1915</span><span id="line-1915">  }</span>
-<span class="source-line-no">1916</span><span id="line-1916"></span>
-<span class="source-line-no">1917</span><span id="line-1917">  static class RandomScanWithRange100Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1918</span><span id="line-1918">    RandomScanWithRange100Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1919</span><span id="line-1919">      super(con, options, status);</span>
-<span class="source-line-no">1920</span><span id="line-1920">    }</span>
+<span class="source-line-no">1790</span><span id="line-1790">  static abstract class BufferedMutatorTest extends Test {</span>
+<span class="source-line-no">1791</span><span id="line-1791">    protected BufferedMutator mutator;</span>
+<span class="source-line-no">1792</span><span id="line-1792">    protected Table table;</span>
+<span class="source-line-no">1793</span><span id="line-1793"></span>
+<span class="source-line-no">1794</span><span id="line-1794">    BufferedMutatorTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1795</span><span id="line-1795">      super(con, options, status);</span>
+<span class="source-line-no">1796</span><span id="line-1796">    }</span>
+<span class="source-line-no">1797</span><span id="line-1797"></span>
+<span class="source-line-no">1798</span><span id="line-1798">    @Override</span>
+<span class="source-line-no">1799</span><span id="line-1799">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1800</span><span id="line-1800">      BufferedMutatorParams p = new BufferedMutatorParams(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1801</span><span id="line-1801">      p.writeBufferSize(opts.bufferSize);</span>
+<span class="source-line-no">1802</span><span id="line-1802">      this.mutator = connection.getBufferedMutator(p);</span>
+<span class="source-line-no">1803</span><span id="line-1803">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1804</span><span id="line-1804">    }</span>
+<span class="source-line-no">1805</span><span id="line-1805"></span>
+<span class="source-line-no">1806</span><span id="line-1806">    @Override</span>
+<span class="source-line-no">1807</span><span id="line-1807">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1808</span><span id="line-1808">      mutator.close();</span>
+<span class="source-line-no">1809</span><span id="line-1809">      table.close();</span>
+<span class="source-line-no">1810</span><span id="line-1810">    }</span>
+<span class="source-line-no">1811</span><span id="line-1811">  }</span>
+<span class="source-line-no">1812</span><span id="line-1812"></span>
+<span class="source-line-no">1813</span><span id="line-1813">  static class RandomSeekScanTest extends TableTest {</span>
+<span class="source-line-no">1814</span><span id="line-1814">    RandomSeekScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1815</span><span id="line-1815">      super(con, options, status);</span>
+<span class="source-line-no">1816</span><span id="line-1816">    }</span>
+<span class="source-line-no">1817</span><span id="line-1817"></span>
+<span class="source-line-no">1818</span><span id="line-1818">    @Override</span>
+<span class="source-line-no">1819</span><span id="line-1819">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">1820</span><span id="line-1820">      Scan scan =</span>
+<span class="source-line-no">1821</span><span id="line-1821">        new Scan().withStartRow(getRandomRow(this.rand, opts.totalRows)).setCaching(opts.caching)</span>
+<span class="source-line-no">1822</span><span id="line-1822">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">1823</span><span id="line-1823">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">1824</span><span id="line-1824">      FilterList list = new FilterList();</span>
+<span class="source-line-no">1825</span><span id="line-1825">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1826</span><span id="line-1826">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1827</span><span id="line-1827">        if (opts.addColumns) {</span>
+<span class="source-line-no">1828</span><span id="line-1828">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1829</span><span id="line-1829">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1830</span><span id="line-1830">            scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1831</span><span id="line-1831">          }</span>
+<span class="source-line-no">1832</span><span id="line-1832">        } else {</span>
+<span class="source-line-no">1833</span><span id="line-1833">          scan.addFamily(familyName);</span>
+<span class="source-line-no">1834</span><span id="line-1834">        }</span>
+<span class="source-line-no">1835</span><span id="line-1835">      }</span>
+<span class="source-line-no">1836</span><span id="line-1836">      if (opts.filterAll) {</span>
+<span class="source-line-no">1837</span><span id="line-1837">        list.addFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1838</span><span id="line-1838">      }</span>
+<span class="source-line-no">1839</span><span id="line-1839">      list.addFilter(new WhileMatchFilter(new PageFilter(120)));</span>
+<span class="source-line-no">1840</span><span id="line-1840">      scan.setFilter(list);</span>
+<span class="source-line-no">1841</span><span id="line-1841">      ResultScanner s = this.table.getScanner(scan);</span>
+<span class="source-line-no">1842</span><span id="line-1842">      try {</span>
+<span class="source-line-no">1843</span><span id="line-1843">        for (Result rr; (rr = s.next()) != null;) {</span>
+<span class="source-line-no">1844</span><span id="line-1844">          updateValueSize(rr);</span>
+<span class="source-line-no">1845</span><span id="line-1845">        }</span>
+<span class="source-line-no">1846</span><span id="line-1846">      } finally {</span>
+<span class="source-line-no">1847</span><span id="line-1847">        updateScanMetrics(s.getScanMetrics());</span>
+<span class="source-line-no">1848</span><span id="line-1848">        s.close();</span>
+<span class="source-line-no">1849</span><span id="line-1849">      }</span>
+<span class="source-line-no">1850</span><span id="line-1850">      return true;</span>
+<span class="source-line-no">1851</span><span id="line-1851">    }</span>
+<span class="source-line-no">1852</span><span id="line-1852"></span>
+<span class="source-line-no">1853</span><span id="line-1853">    @Override</span>
+<span class="source-line-no">1854</span><span id="line-1854">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1855</span><span id="line-1855">      int period = opts.perClientRunRows / 100;</span>
+<span class="source-line-no">1856</span><span id="line-1856">      return period == 0 ? opts.perClientRunRows : period;</span>
+<span class="source-line-no">1857</span><span id="line-1857">    }</span>
+<span class="source-line-no">1858</span><span id="line-1858"></span>
+<span class="source-line-no">1859</span><span id="line-1859">  }</span>
+<span class="source-line-no">1860</span><span id="line-1860"></span>
+<span class="source-line-no">1861</span><span id="line-1861">  static abstract class RandomScanWithRangeTest extends TableTest {</span>
+<span class="source-line-no">1862</span><span id="line-1862">    RandomScanWithRangeTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1863</span><span id="line-1863">      super(con, options, status);</span>
+<span class="source-line-no">1864</span><span id="line-1864">    }</span>
+<span class="source-line-no">1865</span><span id="line-1865"></span>
+<span class="source-line-no">1866</span><span id="line-1866">    @Override</span>
+<span class="source-line-no">1867</span><span id="line-1867">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">1868</span><span id="line-1868">      Pair&lt;byte[], byte[]&gt; startAndStopRow = getStartAndStopRow();</span>
+<span class="source-line-no">1869</span><span id="line-1869">      Scan scan = new Scan().withStartRow(startAndStopRow.getFirst())</span>
+<span class="source-line-no">1870</span><span id="line-1870">        .withStopRow(startAndStopRow.getSecond()).setCaching(opts.caching)</span>
+<span class="source-line-no">1871</span><span id="line-1871">        .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">1872</span><span id="line-1872">        .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">1873</span><span id="line-1873">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1874</span><span id="line-1874">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1875</span><span id="line-1875">        if (opts.addColumns) {</span>
+<span class="source-line-no">1876</span><span id="line-1876">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1877</span><span id="line-1877">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1878</span><span id="line-1878">            scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1879</span><span id="line-1879">          }</span>
+<span class="source-line-no">1880</span><span id="line-1880">        } else {</span>
+<span class="source-line-no">1881</span><span id="line-1881">          scan.addFamily(familyName);</span>
+<span class="source-line-no">1882</span><span id="line-1882">        }</span>
+<span class="source-line-no">1883</span><span id="line-1883">      }</span>
+<span class="source-line-no">1884</span><span id="line-1884">      if (opts.filterAll) {</span>
+<span class="source-line-no">1885</span><span id="line-1885">        scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1886</span><span id="line-1886">      }</span>
+<span class="source-line-no">1887</span><span id="line-1887">      Result r = null;</span>
+<span class="source-line-no">1888</span><span id="line-1888">      int count = 0;</span>
+<span class="source-line-no">1889</span><span id="line-1889">      ResultScanner s = this.table.getScanner(scan);</span>
+<span class="source-line-no">1890</span><span id="line-1890">      try {</span>
+<span class="source-line-no">1891</span><span id="line-1891">        for (; (r = s.next()) != null;) {</span>
+<span class="source-line-no">1892</span><span id="line-1892">          updateValueSize(r);</span>
+<span class="source-line-no">1893</span><span id="line-1893">          count++;</span>
+<span class="source-line-no">1894</span><span id="line-1894">        }</span>
+<span class="source-line-no">1895</span><span id="line-1895">        if (i % 100 == 0) {</span>
+<span class="source-line-no">1896</span><span id="line-1896">          LOG.info(String.format("Scan for key range %s - %s returned %s rows",</span>
+<span class="source-line-no">1897</span><span id="line-1897">            Bytes.toString(startAndStopRow.getFirst()), Bytes.toString(startAndStopRow.getSecond()),</span>
+<span class="source-line-no">1898</span><span id="line-1898">            count));</span>
+<span class="source-line-no">1899</span><span id="line-1899">        }</span>
+<span class="source-line-no">1900</span><span id="line-1900">      } finally {</span>
+<span class="source-line-no">1901</span><span id="line-1901">        updateScanMetrics(s.getScanMetrics());</span>
+<span class="source-line-no">1902</span><span id="line-1902">        s.close();</span>
+<span class="source-line-no">1903</span><span id="line-1903">      }</span>
+<span class="source-line-no">1904</span><span id="line-1904">      return true;</span>
+<span class="source-line-no">1905</span><span id="line-1905">    }</span>
+<span class="source-line-no">1906</span><span id="line-1906"></span>
+<span class="source-line-no">1907</span><span id="line-1907">    protected abstract Pair&lt;byte[], byte[]&gt; getStartAndStopRow();</span>
+<span class="source-line-no">1908</span><span id="line-1908"></span>
+<span class="source-line-no">1909</span><span id="line-1909">    protected Pair&lt;byte[], byte[]&gt; generateStartAndStopRows(int maxRange) {</span>
+<span class="source-line-no">1910</span><span id="line-1910">      int start = this.rand.nextInt(Integer.MAX_VALUE) % opts.totalRows;</span>
+<span class="source-line-no">1911</span><span id="line-1911">      int stop = start + maxRange;</span>
+<span class="source-line-no">1912</span><span id="line-1912">      return new Pair&lt;&gt;(format(start), format(stop));</span>
+<span class="source-line-no">1913</span><span id="line-1913">    }</span>
+<span class="source-line-no">1914</span><span id="line-1914"></span>
+<span class="source-line-no">1915</span><span id="line-1915">    @Override</span>
+<span class="source-line-no">1916</span><span id="line-1916">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1917</span><span id="line-1917">      int period = opts.perClientRunRows / 100;</span>
+<span class="source-line-no">1918</span><span id="line-1918">      return period == 0 ? opts.perClientRunRows : period;</span>
+<span class="source-line-no">1919</span><span id="line-1919">    }</span>
+<span class="source-line-no">1920</span><span id="line-1920">  }</span>
 <span class="source-line-no">1921</span><span id="line-1921"></span>
-<span class="source-line-no">1922</span><span id="line-1922">    @Override</span>
-<span class="source-line-no">1923</span><span id="line-1923">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1924</span><span id="line-1924">      return generateStartAndStopRows(100);</span>
+<span class="source-line-no">1922</span><span id="line-1922">  static class RandomScanWithRange10Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1923</span><span id="line-1923">    RandomScanWithRange10Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1924</span><span id="line-1924">      super(con, options, status);</span>
 <span class="source-line-no">1925</span><span id="line-1925">    }</span>
-<span class="source-line-no">1926</span><span id="line-1926">  }</span>
-<span class="source-line-no">1927</span><span id="line-1927"></span>
-<span class="source-line-no">1928</span><span id="line-1928">  static class RandomScanWithRange1000Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1929</span><span id="line-1929">    RandomScanWithRange1000Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1930</span><span id="line-1930">      super(con, options, status);</span>
-<span class="source-line-no">1931</span><span id="line-1931">    }</span>
+<span class="source-line-no">1926</span><span id="line-1926"></span>
+<span class="source-line-no">1927</span><span id="line-1927">    @Override</span>
+<span class="source-line-no">1928</span><span id="line-1928">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1929</span><span id="line-1929">      return generateStartAndStopRows(10);</span>
+<span class="source-line-no">1930</span><span id="line-1930">    }</span>
+<span class="source-line-no">1931</span><span id="line-1931">  }</span>
 <span class="source-line-no">1932</span><span id="line-1932"></span>
-<span class="source-line-no">1933</span><span id="line-1933">    @Override</span>
-<span class="source-line-no">1934</span><span id="line-1934">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1935</span><span id="line-1935">      return generateStartAndStopRows(1000);</span>
+<span class="source-line-no">1933</span><span id="line-1933">  static class RandomScanWithRange100Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1934</span><span id="line-1934">    RandomScanWithRange100Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1935</span><span id="line-1935">      super(con, options, status);</span>
 <span class="source-line-no">1936</span><span id="line-1936">    }</span>
-<span class="source-line-no">1937</span><span id="line-1937">  }</span>
-<span class="source-line-no">1938</span><span id="line-1938"></span>
-<span class="source-line-no">1939</span><span id="line-1939">  static class RandomScanWithRange10000Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1940</span><span id="line-1940">    RandomScanWithRange10000Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1941</span><span id="line-1941">      super(con, options, status);</span>
-<span class="source-line-no">1942</span><span id="line-1942">    }</span>
+<span class="source-line-no">1937</span><span id="line-1937"></span>
+<span class="source-line-no">1938</span><span id="line-1938">    @Override</span>
+<span class="source-line-no">1939</span><span id="line-1939">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1940</span><span id="line-1940">      return generateStartAndStopRows(100);</span>
+<span class="source-line-no">1941</span><span id="line-1941">    }</span>
+<span class="source-line-no">1942</span><span id="line-1942">  }</span>
 <span class="source-line-no">1943</span><span id="line-1943"></span>
-<span class="source-line-no">1944</span><span id="line-1944">    @Override</span>
-<span class="source-line-no">1945</span><span id="line-1945">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1946</span><span id="line-1946">      return generateStartAndStopRows(10000);</span>
+<span class="source-line-no">1944</span><span id="line-1944">  static class RandomScanWithRange1000Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1945</span><span id="line-1945">    RandomScanWithRange1000Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1946</span><span id="line-1946">      super(con, options, status);</span>
 <span class="source-line-no">1947</span><span id="line-1947">    }</span>
-<span class="source-line-no">1948</span><span id="line-1948">  }</span>
-<span class="source-line-no">1949</span><span id="line-1949"></span>
-<span class="source-line-no">1950</span><span id="line-1950">  static class RandomReadTest extends TableTest {</span>
-<span class="source-line-no">1951</span><span id="line-1951">    private final Consistency consistency;</span>
-<span class="source-line-no">1952</span><span id="line-1952">    private ArrayList&lt;Get&gt; gets;</span>
-<span class="source-line-no">1953</span><span id="line-1953"></span>
-<span class="source-line-no">1954</span><span id="line-1954">    RandomReadTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1955</span><span id="line-1955">      super(con, options, status);</span>
-<span class="source-line-no">1956</span><span id="line-1956">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
-<span class="source-line-no">1957</span><span id="line-1957">      if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1958</span><span id="line-1958">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
-<span class="source-line-no">1959</span><span id="line-1959">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
-<span class="source-line-no">1960</span><span id="line-1960">      }</span>
-<span class="source-line-no">1961</span><span id="line-1961">    }</span>
-<span class="source-line-no">1962</span><span id="line-1962"></span>
-<span class="source-line-no">1963</span><span id="line-1963">    @Override</span>
-<span class="source-line-no">1964</span><span id="line-1964">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1965</span><span id="line-1965">      if (opts.randomSleep &gt; 0) {</span>
-<span class="source-line-no">1966</span><span id="line-1966">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
-<span class="source-line-no">1967</span><span id="line-1967">      }</span>
-<span class="source-line-no">1968</span><span id="line-1968">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
-<span class="source-line-no">1969</span><span id="line-1969">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1970</span><span id="line-1970">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1971</span><span id="line-1971">        if (opts.addColumns) {</span>
-<span class="source-line-no">1972</span><span id="line-1972">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1973</span><span id="line-1973">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1974</span><span id="line-1974">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1975</span><span id="line-1975">          }</span>
-<span class="source-line-no">1976</span><span id="line-1976">        } else {</span>
-<span class="source-line-no">1977</span><span id="line-1977">          get.addFamily(familyName);</span>
-<span class="source-line-no">1978</span><span id="line-1978">        }</span>
-<span class="source-line-no">1979</span><span id="line-1979">      }</span>
-<span class="source-line-no">1980</span><span id="line-1980">      if (opts.filterAll) {</span>
-<span class="source-line-no">1981</span><span id="line-1981">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1982</span><span id="line-1982">      }</span>
-<span class="source-line-no">1983</span><span id="line-1983">      get.setConsistency(consistency);</span>
-<span class="source-line-no">1984</span><span id="line-1984">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
-<span class="source-line-no">1985</span><span id="line-1985">      if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1986</span><span id="line-1986">        this.gets.add(get);</span>
-<span class="source-line-no">1987</span><span id="line-1987">        if (this.gets.size() == opts.multiGet) {</span>
-<span class="source-line-no">1988</span><span id="line-1988">          Result[] rs = this.table.get(this.gets);</span>
-<span class="source-line-no">1989</span><span id="line-1989">          if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">1990</span><span id="line-1990">            long latency = System.nanoTime() - startTime;</span>
-<span class="source-line-no">1991</span><span id="line-1991">            updateValueSize(rs, latency);</span>
-<span class="source-line-no">1992</span><span id="line-1992">          } else {</span>
-<span class="source-line-no">1993</span><span id="line-1993">            updateValueSize(rs);</span>
-<span class="source-line-no">1994</span><span id="line-1994">          }</span>
-<span class="source-line-no">1995</span><span id="line-1995">          this.gets.clear();</span>
-<span class="source-line-no">1996</span><span id="line-1996">        } else {</span>
-<span class="source-line-no">1997</span><span id="line-1997">          return false;</span>
-<span class="source-line-no">1998</span><span id="line-1998">        }</span>
-<span class="source-line-no">1999</span><span id="line-1999">      } else {</span>
-<span class="source-line-no">2000</span><span id="line-2000">        if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">2001</span><span id="line-2001">          Result r = this.table.get(get);</span>
-<span class="source-line-no">2002</span><span id="line-2002">          long latency = System.nanoTime() - startTime;</span>
-<span class="source-line-no">2003</span><span id="line-2003">          updateValueSize(r, latency);</span>
-<span class="source-line-no">2004</span><span id="line-2004">        } else {</span>
-<span class="source-line-no">2005</span><span id="line-2005">          updateValueSize(this.table.get(get));</span>
-<span class="source-line-no">2006</span><span id="line-2006">        }</span>
-<span class="source-line-no">2007</span><span id="line-2007">      }</span>
-<span class="source-line-no">2008</span><span id="line-2008">      return true;</span>
-<span class="source-line-no">2009</span><span id="line-2009">    }</span>
-<span class="source-line-no">2010</span><span id="line-2010"></span>
-<span class="source-line-no">2011</span><span id="line-2011">    @Override</span>
-<span class="source-line-no">2012</span><span id="line-2012">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">2013</span><span id="line-2013">      int period = opts.perClientRunRows / 10;</span>
-<span class="source-line-no">2014</span><span id="line-2014">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">2015</span><span id="line-2015">    }</span>
-<span class="source-line-no">2016</span><span id="line-2016"></span>
-<span class="source-line-no">2017</span><span id="line-2017">    @Override</span>
-<span class="source-line-no">2018</span><span id="line-2018">    protected void testTakedown() throws IOException {</span>
-<span class="source-line-no">2019</span><span id="line-2019">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
-<span class="source-line-no">2020</span><span id="line-2020">        this.table.get(gets);</span>
-<span class="source-line-no">2021</span><span id="line-2021">        this.gets.clear();</span>
-<span class="source-line-no">2022</span><span id="line-2022">      }</span>
-<span class="source-line-no">2023</span><span id="line-2023">      super.testTakedown();</span>
-<span class="source-line-no">2024</span><span id="line-2024">    }</span>
-<span class="source-line-no">2025</span><span id="line-2025">  }</span>
+<span class="source-line-no">1948</span><span id="line-1948"></span>
+<span class="source-line-no">1949</span><span id="line-1949">    @Override</span>
+<span class="source-line-no">1950</span><span id="line-1950">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1951</span><span id="line-1951">      return generateStartAndStopRows(1000);</span>
+<span class="source-line-no">1952</span><span id="line-1952">    }</span>
+<span class="source-line-no">1953</span><span id="line-1953">  }</span>
+<span class="source-line-no">1954</span><span id="line-1954"></span>
+<span class="source-line-no">1955</span><span id="line-1955">  static class RandomScanWithRange10000Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1956</span><span id="line-1956">    RandomScanWithRange10000Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1957</span><span id="line-1957">      super(con, options, status);</span>
+<span class="source-line-no">1958</span><span id="line-1958">    }</span>
+<span class="source-line-no">1959</span><span id="line-1959"></span>
+<span class="source-line-no">1960</span><span id="line-1960">    @Override</span>
+<span class="source-line-no">1961</span><span id="line-1961">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1962</span><span id="line-1962">      return generateStartAndStopRows(10000);</span>
+<span class="source-line-no">1963</span><span id="line-1963">    }</span>
+<span class="source-line-no">1964</span><span id="line-1964">  }</span>
+<span class="source-line-no">1965</span><span id="line-1965"></span>
+<span class="source-line-no">1966</span><span id="line-1966">  static class RandomReadTest extends TableTest {</span>
+<span class="source-line-no">1967</span><span id="line-1967">    private final Consistency consistency;</span>
+<span class="source-line-no">1968</span><span id="line-1968">    private ArrayList&lt;Get&gt; gets;</span>
+<span class="source-line-no">1969</span><span id="line-1969"></span>
+<span class="source-line-no">1970</span><span id="line-1970">    RandomReadTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1971</span><span id="line-1971">      super(con, options, status);</span>
+<span class="source-line-no">1972</span><span id="line-1972">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
+<span class="source-line-no">1973</span><span id="line-1973">      if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">1974</span><span id="line-1974">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
+<span class="source-line-no">1975</span><span id="line-1975">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
+<span class="source-line-no">1976</span><span id="line-1976">      }</span>
+<span class="source-line-no">1977</span><span id="line-1977">    }</span>
+<span class="source-line-no">1978</span><span id="line-1978"></span>
+<span class="source-line-no">1979</span><span id="line-1979">    @Override</span>
+<span class="source-line-no">1980</span><span id="line-1980">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1981</span><span id="line-1981">      if (opts.randomSleep &gt; 0) {</span>
+<span class="source-line-no">1982</span><span id="line-1982">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
+<span class="source-line-no">1983</span><span id="line-1983">      }</span>
+<span class="source-line-no">1984</span><span id="line-1984">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
+<span class="source-line-no">1985</span><span id="line-1985">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1986</span><span id="line-1986">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1987</span><span id="line-1987">        if (opts.addColumns) {</span>
+<span class="source-line-no">1988</span><span id="line-1988">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1989</span><span id="line-1989">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1990</span><span id="line-1990">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1991</span><span id="line-1991">          }</span>
+<span class="source-line-no">1992</span><span id="line-1992">        } else {</span>
+<span class="source-line-no">1993</span><span id="line-1993">          get.addFamily(familyName);</span>
+<span class="source-line-no">1994</span><span id="line-1994">        }</span>
+<span class="source-line-no">1995</span><span id="line-1995">      }</span>
+<span class="source-line-no">1996</span><span id="line-1996">      if (opts.filterAll) {</span>
+<span class="source-line-no">1997</span><span id="line-1997">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1998</span><span id="line-1998">      }</span>
+<span class="source-line-no">1999</span><span id="line-1999">      get.setConsistency(consistency);</span>
+<span class="source-line-no">2000</span><span id="line-2000">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
+<span class="source-line-no">2001</span><span id="line-2001">      if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">2002</span><span id="line-2002">        this.gets.add(get);</span>
+<span class="source-line-no">2003</span><span id="line-2003">        if (this.gets.size() == opts.multiGet) {</span>
+<span class="source-line-no">2004</span><span id="line-2004">          Result[] rs = this.table.get(this.gets);</span>
+<span class="source-line-no">2005</span><span id="line-2005">          if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">2006</span><span id="line-2006">            long latency = System.nanoTime() - startTime;</span>
+<span class="source-line-no">2007</span><span id="line-2007">            updateValueSize(rs, latency);</span>
+<span class="source-line-no">2008</span><span id="line-2008">          } else {</span>
+<span class="source-line-no">2009</span><span id="line-2009">            updateValueSize(rs);</span>
+<span class="source-line-no">2010</span><span id="line-2010">          }</span>
+<span class="source-line-no">2011</span><span id="line-2011">          this.gets.clear();</span>
+<span class="source-line-no">2012</span><span id="line-2012">        } else {</span>
+<span class="source-line-no">2013</span><span id="line-2013">          return false;</span>
+<span class="source-line-no">2014</span><span id="line-2014">        }</span>
+<span class="source-line-no">2015</span><span id="line-2015">      } else {</span>
+<span class="source-line-no">2016</span><span id="line-2016">        if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">2017</span><span id="line-2017">          Result r = this.table.get(get);</span>
+<span class="source-line-no">2018</span><span id="line-2018">          long latency = System.nanoTime() - startTime;</span>
+<span class="source-line-no">2019</span><span id="line-2019">          updateValueSize(r, latency);</span>
+<span class="source-line-no">2020</span><span id="line-2020">        } else {</span>
+<span class="source-line-no">2021</span><span id="line-2021">          updateValueSize(this.table.get(get));</span>
+<span class="source-line-no">2022</span><span id="line-2022">        }</span>
+<span class="source-line-no">2023</span><span id="line-2023">      }</span>
+<span class="source-line-no">2024</span><span id="line-2024">      return true;</span>
+<span class="source-line-no">2025</span><span id="line-2025">    }</span>
 <span class="source-line-no">2026</span><span id="line-2026"></span>
-<span class="source-line-no">2027</span><span id="line-2027">  /*</span>
-<span class="source-line-no">2028</span><span id="line-2028">   * Send random reads against fake regions inserted by MetaWriteTest</span>
-<span class="source-line-no">2029</span><span id="line-2029">   */</span>
-<span class="source-line-no">2030</span><span id="line-2030">  static class MetaRandomReadTest extends MetaTest {</span>
-<span class="source-line-no">2031</span><span id="line-2031">    private RegionLocator regionLocator;</span>
+<span class="source-line-no">2027</span><span id="line-2027">    @Override</span>
+<span class="source-line-no">2028</span><span id="line-2028">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">2029</span><span id="line-2029">      int period = opts.perClientRunRows / 10;</span>
+<span class="source-line-no">2030</span><span id="line-2030">      return period == 0 ? opts.perClientRunRows : period;</span>
+<span class="source-line-no">2031</span><span id="line-2031">    }</span>
 <span class="source-line-no">2032</span><span id="line-2032"></span>
-<span class="source-line-no">2033</span><span id="line-2033">    MetaRandomReadTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2034</span><span id="line-2034">      super(con, options, status);</span>
-<span class="source-line-no">2035</span><span id="line-2035">      LOG.info("call getRegionLocation");</span>
-<span class="source-line-no">2036</span><span id="line-2036">    }</span>
-<span class="source-line-no">2037</span><span id="line-2037"></span>
-<span class="source-line-no">2038</span><span id="line-2038">    @Override</span>
-<span class="source-line-no">2039</span><span id="line-2039">    void onStartup() throws IOException {</span>
-<span class="source-line-no">2040</span><span id="line-2040">      super.onStartup();</span>
-<span class="source-line-no">2041</span><span id="line-2041">      this.regionLocator = connection.getRegionLocator(table.getName());</span>
-<span class="source-line-no">2042</span><span id="line-2042">    }</span>
-<span class="source-line-no">2043</span><span id="line-2043"></span>
-<span class="source-line-no">2044</span><span id="line-2044">    @Override</span>
-<span class="source-line-no">2045</span><span id="line-2045">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">2046</span><span id="line-2046">      if (opts.randomSleep &gt; 0) {</span>
-<span class="source-line-no">2047</span><span id="line-2047">        Thread.sleep(rand.nextInt(opts.randomSleep));</span>
-<span class="source-line-no">2048</span><span id="line-2048">      }</span>
-<span class="source-line-no">2049</span><span id="line-2049">      HRegionLocation hRegionLocation =</span>
-<span class="source-line-no">2050</span><span id="line-2050">        regionLocator.getRegionLocation(getSplitKey(rand.nextInt(opts.perClientRunRows)), true);</span>
-<span class="source-line-no">2051</span><span id="line-2051">      LOG.debug("get location for region: " + hRegionLocation);</span>
-<span class="source-line-no">2052</span><span id="line-2052">      return true;</span>
-<span class="source-line-no">2053</span><span id="line-2053">    }</span>
-<span class="source-line-no">2054</span><span id="line-2054"></span>
-<span class="source-line-no">2055</span><span id="line-2055">    @Override</span>
-<span class="source-line-no">2056</span><span id="line-2056">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">2057</span><span id="line-2057">      int period = opts.perClientRunRows / 10;</span>
-<span class="source-line-no">2058</span><span id="line-2058">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">2059</span><span id="line-2059">    }</span>
-<span class="source-line-no">2060</span><span id="line-2060"></span>
-<span class="source-line-no">2061</span><span id="line-2061">    @Override</span>
-<span class="source-line-no">2062</span><span id="line-2062">    protected void testTakedown() throws IOException {</span>
-<span class="source-line-no">2063</span><span id="line-2063">      super.testTakedown();</span>
-<span class="source-line-no">2064</span><span id="line-2064">    }</span>
-<span class="source-line-no">2065</span><span id="line-2065">  }</span>
-<span class="source-line-no">2066</span><span id="line-2066"></span>
-<span class="source-line-no">2067</span><span id="line-2067">  static class RandomWriteTest extends SequentialWriteTest {</span>
-<span class="source-line-no">2068</span><span id="line-2068">    RandomWriteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2069</span><span id="line-2069">      super(con, options, status);</span>
-<span class="source-line-no">2070</span><span id="line-2070">    }</span>
-<span class="source-line-no">2071</span><span id="line-2071"></span>
-<span class="source-line-no">2072</span><span id="line-2072">    @Override</span>
-<span class="source-line-no">2073</span><span id="line-2073">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">2074</span><span id="line-2074">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">2033</span><span id="line-2033">    @Override</span>
+<span class="source-line-no">2034</span><span id="line-2034">    protected void testTakedown() throws IOException {</span>
+<span class="source-line-no">2035</span><span id="line-2035">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
+<span class="source-line-no">2036</span><span id="line-2036">        this.table.get(gets);</span>
+<span class="source-line-no">2037</span><span id="line-2037">        this.gets.clear();</span>
+<span class="source-line-no">2038</span><span id="line-2038">      }</span>
+<span class="source-line-no">2039</span><span id="line-2039">      super.testTakedown();</span>
+<span class="source-line-no">2040</span><span id="line-2040">    }</span>
+<span class="source-line-no">2041</span><span id="line-2041">  }</span>
+<span class="source-line-no">2042</span><span id="line-2042"></span>
+<span class="source-line-no">2043</span><span id="line-2043">  /*</span>
+<span class="source-line-no">2044</span><span id="line-2044">   * Send random reads against fake regions inserted by MetaWriteTest</span>
+<span class="source-line-no">2045</span><span id="line-2045">   */</span>
+<span class="source-line-no">2046</span><span id="line-2046">  static class MetaRandomReadTest extends MetaTest {</span>
+<span class="source-line-no">2047</span><span id="line-2047">    private RegionLocator regionLocator;</span>
+<span class="source-line-no">2048</span><span id="line-2048"></span>
+<span class="source-line-no">2049</span><span id="line-2049">    MetaRandomReadTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2050</span><span id="line-2050">      super(con, options, status);</span>
+<span class="source-line-no">2051</span><span id="line-2051">      LOG.info("call getRegionLocation");</span>
+<span class="source-line-no">2052</span><span id="line-2052">    }</span>
+<span class="source-line-no">2053</span><span id="line-2053"></span>
+<span class="source-line-no">2054</span><span id="line-2054">    @Override</span>
+<span class="source-line-no">2055</span><span id="line-2055">    void onStartup() throws IOException {</span>
+<span class="source-line-no">2056</span><span id="line-2056">      super.onStartup();</span>
+<span class="source-line-no">2057</span><span id="line-2057">      this.regionLocator = connection.getRegionLocator(table.getName());</span>
+<span class="source-line-no">2058</span><span id="line-2058">    }</span>
+<span class="source-line-no">2059</span><span id="line-2059"></span>
+<span class="source-line-no">2060</span><span id="line-2060">    @Override</span>
+<span class="source-line-no">2061</span><span id="line-2061">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">2062</span><span id="line-2062">      if (opts.randomSleep &gt; 0) {</span>
+<span class="source-line-no">2063</span><span id="line-2063">        Thread.sleep(rand.nextInt(opts.randomSleep));</span>
+<span class="source-line-no">2064</span><span id="line-2064">      }</span>
+<span class="source-line-no">2065</span><span id="line-2065">      HRegionLocation hRegionLocation =</span>
+<span class="source-line-no">2066</span><span id="line-2066">        regionLocator.getRegionLocation(getSplitKey(rand.nextInt(opts.perClientRunRows)), true);</span>
+<span class="source-line-no">2067</span><span id="line-2067">      LOG.debug("get location for region: " + hRegionLocation);</span>
+<span class="source-line-no">2068</span><span id="line-2068">      return true;</span>
+<span class="source-line-no">2069</span><span id="line-2069">    }</span>
+<span class="source-line-no">2070</span><span id="line-2070"></span>
+<span class="source-line-no">2071</span><span id="line-2071">    @Override</span>
+<span class="source-line-no">2072</span><span id="line-2072">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">2073</span><span id="line-2073">      int period = opts.perClientRunRows / 10;</span>
+<span class="source-line-no">2074</span><span id="line-2074">      return period == 0 ? opts.perClientRunRows : period;</span>
 <span class="source-line-no">2075</span><span id="line-2075">    }</span>
 <span class="source-line-no">2076</span><span id="line-2076"></span>
-<span class="source-line-no">2077</span><span id="line-2077">  }</span>
-<span class="source-line-no">2078</span><span id="line-2078"></span>
-<span class="source-line-no">2079</span><span id="line-2079">  static class RandomDeleteTest extends SequentialDeleteTest {</span>
-<span class="source-line-no">2080</span><span id="line-2080">    RandomDeleteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2081</span><span id="line-2081">      super(con, options, status);</span>
-<span class="source-line-no">2082</span><span id="line-2082">    }</span>
-<span class="source-line-no">2083</span><span id="line-2083"></span>
-<span class="source-line-no">2084</span><span id="line-2084">    @Override</span>
-<span class="source-line-no">2085</span><span id="line-2085">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">2086</span><span id="line-2086">      return getRandomRow(this.rand, opts.totalRows);</span>
-<span class="source-line-no">2087</span><span id="line-2087">    }</span>
-<span class="source-line-no">2088</span><span id="line-2088"></span>
-<span class="source-line-no">2089</span><span id="line-2089">  }</span>
-<span class="source-line-no">2090</span><span id="line-2090"></span>
-<span class="source-line-no">2091</span><span id="line-2091">  static class ScanTest extends TableTest {</span>
-<span class="source-line-no">2092</span><span id="line-2092">    private ResultScanner testScanner;</span>
-<span class="source-line-no">2093</span><span id="line-2093"></span>
-<span class="source-line-no">2094</span><span id="line-2094">    ScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2095</span><span id="line-2095">      super(con, options, status);</span>
-<span class="source-line-no">2096</span><span id="line-2096">    }</span>
-<span class="source-line-no">2097</span><span id="line-2097"></span>
-<span class="source-line-no">2098</span><span id="line-2098">    @Override</span>
-<span class="source-line-no">2099</span><span id="line-2099">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">2100</span><span id="line-2100">      if (this.testScanner != null) {</span>
-<span class="source-line-no">2101</span><span id="line-2101">        this.testScanner.close();</span>
-<span class="source-line-no">2102</span><span id="line-2102">      }</span>
-<span class="source-line-no">2103</span><span id="line-2103">      super.testTakedown();</span>
-<span class="source-line-no">2104</span><span id="line-2104">    }</span>
-<span class="source-line-no">2105</span><span id="line-2105"></span>
-<span class="source-line-no">2106</span><span id="line-2106">    @Override</span>
-<span class="source-line-no">2107</span><span id="line-2107">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2108</span><span id="line-2108">      if (this.testScanner == null) {</span>
-<span class="source-line-no">2109</span><span id="line-2109">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
-<span class="source-line-no">2110</span><span id="line-2110">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">2111</span><span id="line-2111">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">2112</span><span id="line-2112">        for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2113</span><span id="line-2113">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2114</span><span id="line-2114">          if (opts.addColumns) {</span>
-<span class="source-line-no">2115</span><span id="line-2115">            for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2116</span><span id="line-2116">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2117</span><span id="line-2117">              scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">2118</span><span id="line-2118">            }</span>
-<span class="source-line-no">2119</span><span id="line-2119">          } else {</span>
-<span class="source-line-no">2120</span><span id="line-2120">            scan.addFamily(familyName);</span>
-<span class="source-line-no">2121</span><span id="line-2121">          }</span>
-<span class="source-line-no">2122</span><span id="line-2122">        }</span>
-<span class="source-line-no">2123</span><span id="line-2123">        if (opts.filterAll) {</span>
-<span class="source-line-no">2124</span><span id="line-2124">          scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">2125</span><span id="line-2125">        }</span>
-<span class="source-line-no">2126</span><span id="line-2126">        this.testScanner = table.getScanner(scan);</span>
-<span class="source-line-no">2127</span><span id="line-2127">      }</span>
-<span class="source-line-no">2128</span><span id="line-2128">      Result r = testScanner.next();</span>
-<span class="source-line-no">2129</span><span id="line-2129">      updateValueSize(r);</span>
-<span class="source-line-no">2130</span><span id="line-2130">      return true;</span>
-<span class="source-line-no">2131</span><span id="line-2131">    }</span>
-<span class="source-line-no">2132</span><span id="line-2132">  }</span>
-<span class="source-line-no">2133</span><span id="line-2133"></span>
-<span class="source-line-no">2134</span><span id="line-2134">  static class ReverseScanTest extends TableTest {</span>
-<span class="source-line-no">2135</span><span id="line-2135">    private ResultScanner testScanner;</span>
-<span class="source-line-no">2136</span><span id="line-2136"></span>
-<span class="source-line-no">2137</span><span id="line-2137">    ReverseScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2138</span><span id="line-2138">      super(con, options, status);</span>
-<span class="source-line-no">2139</span><span id="line-2139">    }</span>
-<span class="source-line-no">2140</span><span id="line-2140"></span>
-<span class="source-line-no">2141</span><span id="line-2141">    @Override</span>
-<span class="source-line-no">2142</span><span id="line-2142">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">2143</span><span id="line-2143">      if (this.testScanner != null) {</span>
-<span class="source-line-no">2144</span><span id="line-2144">        this.testScanner.close();</span>
-<span class="source-line-no">2145</span><span id="line-2145">      }</span>
-<span class="source-line-no">2146</span><span id="line-2146">      super.testTakedown();</span>
+<span class="source-line-no">2077</span><span id="line-2077">    @Override</span>
+<span class="source-line-no">2078</span><span id="line-2078">    protected void testTakedown() throws IOException {</span>
+<span class="source-line-no">2079</span><span id="line-2079">      super.testTakedown();</span>
+<span class="source-line-no">2080</span><span id="line-2080">    }</span>
+<span class="source-line-no">2081</span><span id="line-2081">  }</span>
+<span class="source-line-no">2082</span><span id="line-2082"></span>
+<span class="source-line-no">2083</span><span id="line-2083">  static class RandomWriteTest extends SequentialWriteTest {</span>
+<span class="source-line-no">2084</span><span id="line-2084">    RandomWriteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2085</span><span id="line-2085">      super(con, options, status);</span>
+<span class="source-line-no">2086</span><span id="line-2086">    }</span>
+<span class="source-line-no">2087</span><span id="line-2087"></span>
+<span class="source-line-no">2088</span><span id="line-2088">    @Override</span>
+<span class="source-line-no">2089</span><span id="line-2089">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">2090</span><span id="line-2090">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">2091</span><span id="line-2091">    }</span>
+<span class="source-line-no">2092</span><span id="line-2092"></span>
+<span class="source-line-no">2093</span><span id="line-2093">  }</span>
+<span class="source-line-no">2094</span><span id="line-2094"></span>
+<span class="source-line-no">2095</span><span id="line-2095">  static class RandomDeleteTest extends SequentialDeleteTest {</span>
+<span class="source-line-no">2096</span><span id="line-2096">    RandomDeleteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2097</span><span id="line-2097">      super(con, options, status);</span>
+<span class="source-line-no">2098</span><span id="line-2098">    }</span>
+<span class="source-line-no">2099</span><span id="line-2099"></span>
+<span class="source-line-no">2100</span><span id="line-2100">    @Override</span>
+<span class="source-line-no">2101</span><span id="line-2101">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">2102</span><span id="line-2102">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">2103</span><span id="line-2103">    }</span>
+<span class="source-line-no">2104</span><span id="line-2104"></span>
+<span class="source-line-no">2105</span><span id="line-2105">  }</span>
+<span class="source-line-no">2106</span><span id="line-2106"></span>
+<span class="source-line-no">2107</span><span id="line-2107">  static class ScanTest extends TableTest {</span>
+<span class="source-line-no">2108</span><span id="line-2108">    private ResultScanner testScanner;</span>
+<span class="source-line-no">2109</span><span id="line-2109"></span>
+<span class="source-line-no">2110</span><span id="line-2110">    ScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2111</span><span id="line-2111">      super(con, options, status);</span>
+<span class="source-line-no">2112</span><span id="line-2112">    }</span>
+<span class="source-line-no">2113</span><span id="line-2113"></span>
+<span class="source-line-no">2114</span><span id="line-2114">    @Override</span>
+<span class="source-line-no">2115</span><span id="line-2115">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">2116</span><span id="line-2116">      if (this.testScanner != null) {</span>
+<span class="source-line-no">2117</span><span id="line-2117">        this.testScanner.close();</span>
+<span class="source-line-no">2118</span><span id="line-2118">      }</span>
+<span class="source-line-no">2119</span><span id="line-2119">      super.testTakedown();</span>
+<span class="source-line-no">2120</span><span id="line-2120">    }</span>
+<span class="source-line-no">2121</span><span id="line-2121"></span>
+<span class="source-line-no">2122</span><span id="line-2122">    @Override</span>
+<span class="source-line-no">2123</span><span id="line-2123">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2124</span><span id="line-2124">      if (this.testScanner == null) {</span>
+<span class="source-line-no">2125</span><span id="line-2125">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
+<span class="source-line-no">2126</span><span id="line-2126">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">2127</span><span id="line-2127">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">2128</span><span id="line-2128">        for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2129</span><span id="line-2129">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2130</span><span id="line-2130">          if (opts.addColumns) {</span>
+<span class="source-line-no">2131</span><span id="line-2131">            for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2132</span><span id="line-2132">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2133</span><span id="line-2133">              scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">2134</span><span id="line-2134">            }</span>
+<span class="source-line-no">2135</span><span id="line-2135">          } else {</span>
+<span class="source-line-no">2136</span><span id="line-2136">            scan.addFamily(familyName);</span>
+<span class="source-line-no">2137</span><span id="line-2137">          }</span>
+<span class="source-line-no">2138</span><span id="line-2138">        }</span>
+<span class="source-line-no">2139</span><span id="line-2139">        if (opts.filterAll) {</span>
+<span class="source-line-no">2140</span><span id="line-2140">          scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">2141</span><span id="line-2141">        }</span>
+<span class="source-line-no">2142</span><span id="line-2142">        this.testScanner = table.getScanner(scan);</span>
+<span class="source-line-no">2143</span><span id="line-2143">      }</span>
+<span class="source-line-no">2144</span><span id="line-2144">      Result r = testScanner.next();</span>
+<span class="source-line-no">2145</span><span id="line-2145">      updateValueSize(r);</span>
+<span class="source-line-no">2146</span><span id="line-2146">      return true;</span>
 <span class="source-line-no">2147</span><span id="line-2147">    }</span>
-<span class="source-line-no">2148</span><span id="line-2148"></span>
-<span class="source-line-no">2149</span><span id="line-2149">    @Override</span>
-<span class="source-line-no">2150</span><span id="line-2150">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2151</span><span id="line-2151">      if (this.testScanner == null) {</span>
-<span class="source-line-no">2152</span><span id="line-2152">        Scan scan = new Scan().setCaching(opts.caching).setCacheBlocks(opts.cacheBlocks)</span>
-<span class="source-line-no">2153</span><span id="line-2153">          .setAsyncPrefetch(opts.asyncPrefetch).setReadType(opts.scanReadType)</span>
-<span class="source-line-no">2154</span><span id="line-2154">          .setScanMetricsEnabled(true).setReversed(true);</span>
-<span class="source-line-no">2155</span><span id="line-2155">        for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2156</span><span id="line-2156">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2157</span><span id="line-2157">          if (opts.addColumns) {</span>
-<span class="source-line-no">2158</span><span id="line-2158">            for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2159</span><span id="line-2159">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2160</span><span id="line-2160">              scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">2161</span><span id="line-2161">            }</span>
-<span class="source-line-no">2162</span><span id="line-2162">          } else {</span>
-<span class="source-line-no">2163</span><span id="line-2163">            scan.addFamily(familyName);</span>
-<span class="source-line-no">2164</span><span id="line-2164">          }</span>
-<span class="source-line-no">2165</span><span id="line-2165">        }</span>
-<span class="source-line-no">2166</span><span id="line-2166">        if (opts.filterAll) {</span>
-<span class="source-line-no">2167</span><span id="line-2167">          scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">2168</span><span id="line-2168">        }</span>
-<span class="source-line-no">2169</span><span id="line-2169">        this.testScanner = table.getScanner(scan);</span>
-<span class="source-line-no">2170</span><span id="line-2170">      }</span>
-<span class="source-line-no">2171</span><span id="line-2171">      Result r = testScanner.next();</span>
-<span class="source-line-no">2172</span><span id="line-2172">      updateValueSize(r);</span>
-<span class="source-line-no">2173</span><span id="line-2173">      return true;</span>
-<span class="source-line-no">2174</span><span id="line-2174">    }</span>
-<span class="source-line-no">2175</span><span id="line-2175">  }</span>
-<span class="source-line-no">2176</span><span id="line-2176"></span>
-<span class="source-line-no">2177</span><span id="line-2177">  /**</span>
-<span class="source-line-no">2178</span><span id="line-2178">   * Base class for operations that are CAS-like; that read a value and then set it based off what</span>
-<span class="source-line-no">2179</span><span id="line-2179">   * they read. In this category is increment, append, checkAndPut, etc.</span>
-<span class="source-line-no">2180</span><span id="line-2180">   * &lt;p&gt;</span>
-<span class="source-line-no">2181</span><span id="line-2181">   * These operations also want some concurrency going on. Usually when these tests run, they</span>
-<span class="source-line-no">2182</span><span id="line-2182">   * operate in their own part of the key range. In CASTest, we will have them all overlap on the</span>
-<span class="source-line-no">2183</span><span id="line-2183">   * same key space. We do this with our getStartRow and getLastRow overrides.</span>
-<span class="source-line-no">2184</span><span id="line-2184">   */</span>
-<span class="source-line-no">2185</span><span id="line-2185">  static abstract class CASTableTest extends TableTest {</span>
-<span class="source-line-no">2186</span><span id="line-2186">    private final byte[] qualifier;</span>
-<span class="source-line-no">2187</span><span id="line-2187"></span>
-<span class="source-line-no">2188</span><span id="line-2188">    CASTableTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2189</span><span id="line-2189">      super(con, options, status);</span>
-<span class="source-line-no">2190</span><span id="line-2190">      qualifier = Bytes.toBytes(this.getClass().getSimpleName());</span>
-<span class="source-line-no">2191</span><span id="line-2191">    }</span>
+<span class="source-line-no">2148</span><span id="line-2148">  }</span>
+<span class="source-line-no">2149</span><span id="line-2149"></span>
+<span class="source-line-no">2150</span><span id="line-2150">  static class ReverseScanTest extends TableTest {</span>
+<span class="source-line-no">2151</span><span id="line-2151">    private ResultScanner testScanner;</span>
+<span class="source-line-no">2152</span><span id="line-2152"></span>
+<span class="source-line-no">2153</span><span id="line-2153">    ReverseScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2154</span><span id="line-2154">      super(con, options, status);</span>
+<span class="source-line-no">2155</span><span id="line-2155">    }</span>
+<span class="source-line-no">2156</span><span id="line-2156"></span>
+<span class="source-line-no">2157</span><span id="line-2157">    @Override</span>
+<span class="source-line-no">2158</span><span id="line-2158">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">2159</span><span id="line-2159">      if (this.testScanner != null) {</span>
+<span class="source-line-no">2160</span><span id="line-2160">        this.testScanner.close();</span>
+<span class="source-line-no">2161</span><span id="line-2161">      }</span>
+<span class="source-line-no">2162</span><span id="line-2162">      super.testTakedown();</span>
+<span class="source-line-no">2163</span><span id="line-2163">    }</span>
+<span class="source-line-no">2164</span><span id="line-2164"></span>
+<span class="source-line-no">2165</span><span id="line-2165">    @Override</span>
+<span class="source-line-no">2166</span><span id="line-2166">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2167</span><span id="line-2167">      if (this.testScanner == null) {</span>
+<span class="source-line-no">2168</span><span id="line-2168">        Scan scan = new Scan().setCaching(opts.caching).setCacheBlocks(opts.cacheBlocks)</span>
+<span class="source-line-no">2169</span><span id="line-2169">          .setAsyncPrefetch(opts.asyncPrefetch).setReadType(opts.scanReadType)</span>
+<span class="source-line-no">2170</span><span id="line-2170">          .setScanMetricsEnabled(true).setReversed(true);</span>
+<span class="source-line-no">2171</span><span id="line-2171">        for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2172</span><span id="line-2172">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2173</span><span id="line-2173">          if (opts.addColumns) {</span>
+<span class="source-line-no">2174</span><span id="line-2174">            for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2175</span><span id="line-2175">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2176</span><span id="line-2176">              scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">2177</span><span id="line-2177">            }</span>
+<span class="source-line-no">2178</span><span id="line-2178">          } else {</span>
+<span class="source-line-no">2179</span><span id="line-2179">            scan.addFamily(familyName);</span>
+<span class="source-line-no">2180</span><span id="line-2180">          }</span>
+<span class="source-line-no">2181</span><span id="line-2181">        }</span>
+<span class="source-line-no">2182</span><span id="line-2182">        if (opts.filterAll) {</span>
+<span class="source-line-no">2183</span><span id="line-2183">          scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">2184</span><span id="line-2184">        }</span>
+<span class="source-line-no">2185</span><span id="line-2185">        this.testScanner = table.getScanner(scan);</span>
+<span class="source-line-no">2186</span><span id="line-2186">      }</span>
+<span class="source-line-no">2187</span><span id="line-2187">      Result r = testScanner.next();</span>
+<span class="source-line-no">2188</span><span id="line-2188">      updateValueSize(r);</span>
+<span class="source-line-no">2189</span><span id="line-2189">      return true;</span>
+<span class="source-line-no">2190</span><span id="line-2190">    }</span>
+<span class="source-line-no">2191</span><span id="line-2191">  }</span>
 <span class="source-line-no">2192</span><span id="line-2192"></span>
-<span class="source-line-no">2193</span><span id="line-2193">    byte[] getQualifier() {</span>
-<span class="source-line-no">2194</span><span id="line-2194">      return this.qualifier;</span>
-<span class="source-line-no">2195</span><span id="line-2195">    }</span>
-<span class="source-line-no">2196</span><span id="line-2196"></span>
-<span class="source-line-no">2197</span><span id="line-2197">    @Override</span>
-<span class="source-line-no">2198</span><span id="line-2198">    int getStartRow() {</span>
-<span class="source-line-no">2199</span><span id="line-2199">      return 0;</span>
-<span class="source-line-no">2200</span><span id="line-2200">    }</span>
-<span class="source-line-no">2201</span><span id="line-2201"></span>
-<span class="source-line-no">2202</span><span id="line-2202">    @Override</span>
-<span class="source-line-no">2203</span><span id="line-2203">    int getLastRow() {</span>
-<span class="source-line-no">2204</span><span id="line-2204">      return opts.perClientRunRows;</span>
-<span class="source-line-no">2205</span><span id="line-2205">    }</span>
-<span class="source-line-no">2206</span><span id="line-2206">  }</span>
-<span class="source-line-no">2207</span><span id="line-2207"></span>
-<span class="source-line-no">2208</span><span id="line-2208">  static class IncrementTest extends CASTableTest {</span>
-<span class="source-line-no">2209</span><span id="line-2209">    IncrementTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2210</span><span id="line-2210">      super(con, options, status);</span>
+<span class="source-line-no">2193</span><span id="line-2193">  /**</span>
+<span class="source-line-no">2194</span><span id="line-2194">   * Base class for operations that are CAS-like; that read a value and then set it based off what</span>
+<span class="source-line-no">2195</span><span id="line-2195">   * they read. In this category is increment, append, checkAndPut, etc.</span>
+<span class="source-line-no">2196</span><span id="line-2196">   * &lt;p&gt;</span>
+<span class="source-line-no">2197</span><span id="line-2197">   * These operations also want some concurrency going on. Usually when these tests run, they</span>
+<span class="source-line-no">2198</span><span id="line-2198">   * operate in their own part of the key range. In CASTest, we will have them all overlap on the</span>
+<span class="source-line-no">2199</span><span id="line-2199">   * same key space. We do this with our getStartRow and getLastRow overrides.</span>
+<span class="source-line-no">2200</span><span id="line-2200">   */</span>
+<span class="source-line-no">2201</span><span id="line-2201">  static abstract class CASTableTest extends TableTest {</span>
+<span class="source-line-no">2202</span><span id="line-2202">    private final byte[] qualifier;</span>
+<span class="source-line-no">2203</span><span id="line-2203"></span>
+<span class="source-line-no">2204</span><span id="line-2204">    CASTableTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2205</span><span id="line-2205">      super(con, options, status);</span>
+<span class="source-line-no">2206</span><span id="line-2206">      qualifier = Bytes.toBytes(this.getClass().getSimpleName());</span>
+<span class="source-line-no">2207</span><span id="line-2207">    }</span>
+<span class="source-line-no">2208</span><span id="line-2208"></span>
+<span class="source-line-no">2209</span><span id="line-2209">    byte[] getQualifier() {</span>
+<span class="source-line-no">2210</span><span id="line-2210">      return this.qualifier;</span>
 <span class="source-line-no">2211</span><span id="line-2211">    }</span>
 <span class="source-line-no">2212</span><span id="line-2212"></span>
 <span class="source-line-no">2213</span><span id="line-2213">    @Override</span>
-<span class="source-line-no">2214</span><span id="line-2214">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2215</span><span id="line-2215">      Increment increment = new Increment(format(i));</span>
-<span class="source-line-no">2216</span><span id="line-2216">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
-<span class="source-line-no">2217</span><span id="line-2217">      // if multiple families are specified for an increment test we assume it is</span>
-<span class="source-line-no">2218</span><span id="line-2218">      // meant to raise the work factor</span>
-<span class="source-line-no">2219</span><span id="line-2219">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2220</span><span id="line-2220">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2221</span><span id="line-2221">        increment.addColumn(familyName, getQualifier(), 1l);</span>
-<span class="source-line-no">2222</span><span id="line-2222">      }</span>
-<span class="source-line-no">2223</span><span id="line-2223">      updateValueSize(this.table.increment(increment));</span>
-<span class="source-line-no">2224</span><span id="line-2224">      return true;</span>
-<span class="source-line-no">2225</span><span id="line-2225">    }</span>
-<span class="source-line-no">2226</span><span id="line-2226">  }</span>
-<span class="source-line-no">2227</span><span id="line-2227"></span>
-<span class="source-line-no">2228</span><span id="line-2228">  static class AppendTest extends CASTableTest {</span>
-<span class="source-line-no">2229</span><span id="line-2229">    AppendTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2230</span><span id="line-2230">      super(con, options, status);</span>
-<span class="source-line-no">2231</span><span id="line-2231">    }</span>
-<span class="source-line-no">2232</span><span id="line-2232"></span>
-<span class="source-line-no">2233</span><span id="line-2233">    @Override</span>
-<span class="source-line-no">2234</span><span id="line-2234">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2235</span><span id="line-2235">      byte[] bytes = format(i);</span>
-<span class="source-line-no">2236</span><span id="line-2236">      Append append = new Append(bytes);</span>
-<span class="source-line-no">2237</span><span id="line-2237">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
-<span class="source-line-no">2238</span><span id="line-2238">      // if multiple families are specified for an append test we assume it is</span>
-<span class="source-line-no">2239</span><span id="line-2239">      // meant to raise the work factor</span>
-<span class="source-line-no">2240</span><span id="line-2240">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2241</span><span id="line-2241">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2242</span><span id="line-2242">        append.addColumn(familyName, getQualifier(), bytes);</span>
-<span class="source-line-no">2243</span><span id="line-2243">      }</span>
-<span class="source-line-no">2244</span><span id="line-2244">      updateValueSize(this.table.append(append));</span>
-<span class="source-line-no">2245</span><span id="line-2245">      return true;</span>
-<span class="source-line-no">2246</span><span id="line-2246">    }</span>
-<span class="source-line-no">2247</span><span id="line-2247">  }</span>
+<span class="source-line-no">2214</span><span id="line-2214">    int getStartRow() {</span>
+<span class="source-line-no">2215</span><span id="line-2215">      return 0;</span>
+<span class="source-line-no">2216</span><span id="line-2216">    }</span>
+<span class="source-line-no">2217</span><span id="line-2217"></span>
+<span class="source-line-no">2218</span><span id="line-2218">    @Override</span>
+<span class="source-line-no">2219</span><span id="line-2219">    int getLastRow() {</span>
+<span class="source-line-no">2220</span><span id="line-2220">      return opts.perClientRunRows;</span>
+<span class="source-line-no">2221</span><span id="line-2221">    }</span>
+<span class="source-line-no">2222</span><span id="line-2222">  }</span>
+<span class="source-line-no">2223</span><span id="line-2223"></span>
+<span class="source-line-no">2224</span><span id="line-2224">  static class IncrementTest extends CASTableTest {</span>
+<span class="source-line-no">2225</span><span id="line-2225">    IncrementTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2226</span><span id="line-2226">      super(con, options, status);</span>
+<span class="source-line-no">2227</span><span id="line-2227">    }</span>
+<span class="source-line-no">2228</span><span id="line-2228"></span>
+<span class="source-line-no">2229</span><span id="line-2229">    @Override</span>
+<span class="source-line-no">2230</span><span id="line-2230">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2231</span><span id="line-2231">      Increment increment = new Increment(format(i));</span>
+<span class="source-line-no">2232</span><span id="line-2232">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
+<span class="source-line-no">2233</span><span id="line-2233">      // if multiple families are specified for an increment test we assume it is</span>
+<span class="source-line-no">2234</span><span id="line-2234">      // meant to raise the work factor</span>
+<span class="source-line-no">2235</span><span id="line-2235">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2236</span><span id="line-2236">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2237</span><span id="line-2237">        increment.addColumn(familyName, getQualifier(), 1l);</span>
+<span class="source-line-no">2238</span><span id="line-2238">      }</span>
+<span class="source-line-no">2239</span><span id="line-2239">      updateValueSize(this.table.increment(increment));</span>
+<span class="source-line-no">2240</span><span id="line-2240">      return true;</span>
+<span class="source-line-no">2241</span><span id="line-2241">    }</span>
+<span class="source-line-no">2242</span><span id="line-2242">  }</span>
+<span class="source-line-no">2243</span><span id="line-2243"></span>
+<span class="source-line-no">2244</span><span id="line-2244">  static class AppendTest extends CASTableTest {</span>
+<span class="source-line-no">2245</span><span id="line-2245">    AppendTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2246</span><span id="line-2246">      super(con, options, status);</span>
+<span class="source-line-no">2247</span><span id="line-2247">    }</span>
 <span class="source-line-no">2248</span><span id="line-2248"></span>
-<span class="source-line-no">2249</span><span id="line-2249">  static class CheckAndMutateTest extends CASTableTest {</span>
-<span class="source-line-no">2250</span><span id="line-2250">    CheckAndMutateTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2251</span><span id="line-2251">      super(con, options, status);</span>
-<span class="source-line-no">2252</span><span id="line-2252">    }</span>
-<span class="source-line-no">2253</span><span id="line-2253"></span>
-<span class="source-line-no">2254</span><span id="line-2254">    @Override</span>
-<span class="source-line-no">2255</span><span id="line-2255">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2256</span><span id="line-2256">      final byte[] bytes = format(i);</span>
-<span class="source-line-no">2257</span><span id="line-2257">      // checkAndXXX tests operate on only a single value</span>
-<span class="source-line-no">2258</span><span id="line-2258">      // Put a known value so when we go to check it, it is there.</span>
-<span class="source-line-no">2259</span><span id="line-2259">      Put put = new Put(bytes);</span>
-<span class="source-line-no">2260</span><span id="line-2260">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
-<span class="source-line-no">2261</span><span id="line-2261">      this.table.put(put);</span>
-<span class="source-line-no">2262</span><span id="line-2262">      RowMutations mutations = new RowMutations(bytes);</span>
-<span class="source-line-no">2263</span><span id="line-2263">      mutations.add(put);</span>
-<span class="source-line-no">2264</span><span id="line-2264">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
-<span class="source-line-no">2265</span><span id="line-2265">        .thenMutate(mutations);</span>
-<span class="source-line-no">2266</span><span id="line-2266">      return true;</span>
-<span class="source-line-no">2267</span><span id="line-2267">    }</span>
-<span class="source-line-no">2268</span><span id="line-2268">  }</span>
+<span class="source-line-no">2249</span><span id="line-2249">    @Override</span>
+<span class="source-line-no">2250</span><span id="line-2250">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2251</span><span id="line-2251">      byte[] bytes = format(i);</span>
+<span class="source-line-no">2252</span><span id="line-2252">      Append append = new Append(bytes);</span>
+<span class="source-line-no">2253</span><span id="line-2253">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
+<span class="source-line-no">2254</span><span id="line-2254">      // if multiple families are specified for an append test we assume it is</span>
+<span class="source-line-no">2255</span><span id="line-2255">      // meant to raise the work factor</span>
+<span class="source-line-no">2256</span><span id="line-2256">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2257</span><span id="line-2257">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2258</span><span id="line-2258">        append.addColumn(familyName, getQualifier(), bytes);</span>
+<span class="source-line-no">2259</span><span id="line-2259">      }</span>
+<span class="source-line-no">2260</span><span id="line-2260">      updateValueSize(this.table.append(append));</span>
+<span class="source-line-no">2261</span><span id="line-2261">      return true;</span>
+<span class="source-line-no">2262</span><span id="line-2262">    }</span>
+<span class="source-line-no">2263</span><span id="line-2263">  }</span>
+<span class="source-line-no">2264</span><span id="line-2264"></span>
+<span class="source-line-no">2265</span><span id="line-2265">  static class CheckAndMutateTest extends CASTableTest {</span>
+<span class="source-line-no">2266</span><span id="line-2266">    CheckAndMutateTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2267</span><span id="line-2267">      super(con, options, status);</span>
+<span class="source-line-no">2268</span><span id="line-2268">    }</span>
 <span class="source-line-no">2269</span><span id="line-2269"></span>
-<span class="source-line-no">2270</span><span id="line-2270">  static class CheckAndPutTest extends CASTableTest {</span>
-<span class="source-line-no">2271</span><span id="line-2271">    CheckAndPutTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2272</span><span id="line-2272">      super(con, options, status);</span>
-<span class="source-line-no">2273</span><span id="line-2273">    }</span>
-<span class="source-line-no">2274</span><span id="line-2274"></span>
-<span class="source-line-no">2275</span><span id="line-2275">    @Override</span>
-<span class="source-line-no">2276</span><span id="line-2276">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2277</span><span id="line-2277">      final byte[] bytes = format(i);</span>
-<span class="source-line-no">2278</span><span id="line-2278">      // checkAndXXX tests operate on only a single value</span>
-<span class="source-line-no">2279</span><span id="line-2279">      // Put a known value so when we go to check it, it is there.</span>
-<span class="source-line-no">2280</span><span id="line-2280">      Put put = new Put(bytes);</span>
-<span class="source-line-no">2281</span><span id="line-2281">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
-<span class="source-line-no">2282</span><span id="line-2282">      this.table.put(put);</span>
-<span class="source-line-no">2283</span><span id="line-2283">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
-<span class="source-line-no">2284</span><span id="line-2284">        .thenPut(put);</span>
-<span class="source-line-no">2285</span><span id="line-2285">      return true;</span>
-<span class="source-line-no">2286</span><span id="line-2286">    }</span>
-<span class="source-line-no">2287</span><span id="line-2287">  }</span>
-<span class="source-line-no">2288</span><span id="line-2288"></span>
-<span class="source-line-no">2289</span><span id="line-2289">  static class CheckAndDeleteTest extends CASTableTest {</span>
-<span class="source-line-no">2290</span><span id="line-2290">    CheckAndDeleteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2291</span><span id="line-2291">      super(con, options, status);</span>
-<span class="source-line-no">2292</span><span id="line-2292">    }</span>
-<span class="source-line-no">2293</span><span id="line-2293"></span>
-<span class="source-line-no">2294</span><span id="line-2294">    @Override</span>
-<span class="source-line-no">2295</span><span id="line-2295">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2296</span><span id="line-2296">      final byte[] bytes = format(i);</span>
-<span class="source-line-no">2297</span><span id="line-2297">      // checkAndXXX tests operate on only a single value</span>
-<span class="source-line-no">2298</span><span id="line-2298">      // Put a known value so when we go to check it, it is there.</span>
-<span class="source-line-no">2299</span><span id="line-2299">      Put put = new Put(bytes);</span>
-<span class="source-line-no">2300</span><span id="line-2300">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
-<span class="source-line-no">2301</span><span id="line-2301">      this.table.put(put);</span>
-<span class="source-line-no">2302</span><span id="line-2302">      Delete delete = new Delete(put.getRow());</span>
-<span class="source-line-no">2303</span><span id="line-2303">      delete.addColumn(FAMILY_ZERO, getQualifier());</span>
-<span class="source-line-no">2304</span><span id="line-2304">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
-<span class="source-line-no">2305</span><span id="line-2305">        .thenDelete(delete);</span>
-<span class="source-line-no">2306</span><span id="line-2306">      return true;</span>
-<span class="source-line-no">2307</span><span id="line-2307">    }</span>
-<span class="source-line-no">2308</span><span id="line-2308">  }</span>
+<span class="source-line-no">2270</span><span id="line-2270">    @Override</span>
+<span class="source-line-no">2271</span><span id="line-2271">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2272</span><span id="line-2272">      final byte[] bytes = format(i);</span>
+<span class="source-line-no">2273</span><span id="line-2273">      // checkAndXXX tests operate on only a single value</span>
+<span class="source-line-no">2274</span><span id="line-2274">      // Put a known value so when we go to check it, it is there.</span>
+<span class="source-line-no">2275</span><span id="line-2275">      Put put = new Put(bytes);</span>
+<span class="source-line-no">2276</span><span id="line-2276">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
+<span class="source-line-no">2277</span><span id="line-2277">      this.table.put(put);</span>
+<span class="source-line-no">2278</span><span id="line-2278">      RowMutations mutations = new RowMutations(bytes);</span>
+<span class="source-line-no">2279</span><span id="line-2279">      mutations.add(put);</span>
+<span class="source-line-no">2280</span><span id="line-2280">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
+<span class="source-line-no">2281</span><span id="line-2281">        .thenMutate(mutations);</span>
+<span class="source-line-no">2282</span><span id="line-2282">      return true;</span>
+<span class="source-line-no">2283</span><span id="line-2283">    }</span>
+<span class="source-line-no">2284</span><span id="line-2284">  }</span>
+<span class="source-line-no">2285</span><span id="line-2285"></span>
+<span class="source-line-no">2286</span><span id="line-2286">  static class CheckAndPutTest extends CASTableTest {</span>
+<span class="source-line-no">2287</span><span id="line-2287">    CheckAndPutTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2288</span><span id="line-2288">      super(con, options, status);</span>
+<span class="source-line-no">2289</span><span id="line-2289">    }</span>
+<span class="source-line-no">2290</span><span id="line-2290"></span>
+<span class="source-line-no">2291</span><span id="line-2291">    @Override</span>
+<span class="source-line-no">2292</span><span id="line-2292">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2293</span><span id="line-2293">      final byte[] bytes = format(i);</span>
+<span class="source-line-no">2294</span><span id="line-2294">      // checkAndXXX tests operate on only a single value</span>
+<span class="source-line-no">2295</span><span id="line-2295">      // Put a known value so when we go to check it, it is there.</span>
+<span class="source-line-no">2296</span><span id="line-2296">      Put put = new Put(bytes);</span>
+<span class="source-line-no">2297</span><span id="line-2297">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
+<span class="source-line-no">2298</span><span id="line-2298">      this.table.put(put);</span>
+<span class="source-line-no">2299</span><span id="line-2299">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
+<span class="source-line-no">2300</span><span id="line-2300">        .thenPut(put);</span>
+<span class="source-line-no">2301</span><span id="line-2301">      return true;</span>
+<span class="source-line-no">2302</span><span id="line-2302">    }</span>
+<span class="source-line-no">2303</span><span id="line-2303">  }</span>
+<span class="source-line-no">2304</span><span id="line-2304"></span>
+<span class="source-line-no">2305</span><span id="line-2305">  static class CheckAndDeleteTest extends CASTableTest {</span>
+<span class="source-line-no">2306</span><span id="line-2306">    CheckAndDeleteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2307</span><span id="line-2307">      super(con, options, status);</span>
+<span class="source-line-no">2308</span><span id="line-2308">    }</span>
 <span class="source-line-no">2309</span><span id="line-2309"></span>
-<span class="source-line-no">2310</span><span id="line-2310">  /*</span>
-<span class="source-line-no">2311</span><span id="line-2311">   * Delete all fake regions inserted to meta table by MetaWriteTest.</span>
-<span class="source-line-no">2312</span><span id="line-2312">   */</span>
-<span class="source-line-no">2313</span><span id="line-2313">  static class CleanMetaTest extends MetaTest {</span>
-<span class="source-line-no">2314</span><span id="line-2314">    CleanMetaTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2315</span><span id="line-2315">      super(con, options, status);</span>
-<span class="source-line-no">2316</span><span id="line-2316">    }</span>
-<span class="source-line-no">2317</span><span id="line-2317"></span>
-<span class="source-line-no">2318</span><span id="line-2318">    @Override</span>
-<span class="source-line-no">2319</span><span id="line-2319">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2320</span><span id="line-2320">      try {</span>
-<span class="source-line-no">2321</span><span id="line-2321">        RegionInfo regionInfo = connection.getRegionLocator(table.getName())</span>
-<span class="source-line-no">2322</span><span id="line-2322">          .getRegionLocation(getSplitKey(i), false).getRegion();</span>
-<span class="source-line-no">2323</span><span id="line-2323">        LOG.debug("deleting region from meta: " + regionInfo);</span>
-<span class="source-line-no">2324</span><span id="line-2324"></span>
-<span class="source-line-no">2325</span><span id="line-2325">        Delete delete =</span>
-<span class="source-line-no">2326</span><span id="line-2326">          MetaTableAccessor.makeDeleteFromRegionInfo(regionInfo, HConstants.LATEST_TIMESTAMP);</span>
-<span class="source-line-no">2327</span><span id="line-2327">        try (Table t = MetaTableAccessor.getMetaHTable(connection)) {</span>
-<span class="source-line-no">2328</span><span id="line-2328">          t.delete(delete);</span>
-<span class="source-line-no">2329</span><span id="line-2329">        }</span>
-<span class="source-line-no">2330</span><span id="line-2330">      } catch (IOException ie) {</span>
-<span class="source-line-no">2331</span><span id="line-2331">        // Log and continue</span>
-<span class="source-line-no">2332</span><span id="line-2332">        LOG.error("cannot find region with start key: " + i);</span>
-<span class="source-line-no">2333</span><span id="line-2333">      }</span>
-<span class="source-line-no">2334</span><span id="line-2334">      return true;</span>
-<span class="source-line-no">2335</span><span id="line-2335">    }</span>
-<span class="source-line-no">2336</span><span id="line-2336">  }</span>
-<span class="source-line-no">2337</span><span id="line-2337"></span>
-<span class="source-line-no">2338</span><span id="line-2338">  static class SequentialReadTest extends TableTest {</span>
-<span class="source-line-no">2339</span><span id="line-2339">    SequentialReadTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2340</span><span id="line-2340">      super(con, options, status);</span>
-<span class="source-line-no">2341</span><span id="line-2341">    }</span>
-<span class="source-line-no">2342</span><span id="line-2342"></span>
-<span class="source-line-no">2343</span><span id="line-2343">    @Override</span>
-<span class="source-line-no">2344</span><span id="line-2344">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2345</span><span id="line-2345">      Get get = new Get(format(i));</span>
-<span class="source-line-no">2346</span><span id="line-2346">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2347</span><span id="line-2347">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2348</span><span id="line-2348">        if (opts.addColumns) {</span>
-<span class="source-line-no">2349</span><span id="line-2349">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2350</span><span id="line-2350">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2351</span><span id="line-2351">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">2352</span><span id="line-2352">          }</span>
-<span class="source-line-no">2353</span><span id="line-2353">        } else {</span>
-<span class="source-line-no">2354</span><span id="line-2354">          get.addFamily(familyName);</span>
-<span class="source-line-no">2355</span><span id="line-2355">        }</span>
-<span class="source-line-no">2356</span><span id="line-2356">      }</span>
-<span class="source-line-no">2357</span><span id="line-2357">      if (opts.filterAll) {</span>
-<span class="source-line-no">2358</span><span id="line-2358">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">2359</span><span id="line-2359">      }</span>
-<span class="source-line-no">2360</span><span id="line-2360">      updateValueSize(table.get(get));</span>
-<span class="source-line-no">2361</span><span id="line-2361">      return true;</span>
-<span class="source-line-no">2362</span><span id="line-2362">    }</span>
-<span class="source-line-no">2363</span><span id="line-2363">  }</span>
-<span class="source-line-no">2364</span><span id="line-2364"></span>
-<span class="source-line-no">2365</span><span id="line-2365">  static class SequentialWriteTest extends BufferedMutatorTest {</span>
-<span class="source-line-no">2366</span><span id="line-2366">    private ArrayList&lt;Put&gt; puts;</span>
-<span class="source-line-no">2367</span><span id="line-2367"></span>
-<span class="source-line-no">2368</span><span id="line-2368">    SequentialWriteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2369</span><span id="line-2369">      super(con, options, status);</span>
-<span class="source-line-no">2370</span><span id="line-2370">      if (opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">2371</span><span id="line-2371">        LOG.info("MultiPut enabled. Sending PUTs in batches of " + opts.multiPut + ".");</span>
-<span class="source-line-no">2372</span><span id="line-2372">        this.puts = new ArrayList&lt;&gt;(opts.multiPut);</span>
-<span class="source-line-no">2373</span><span id="line-2373">      }</span>
-<span class="source-line-no">2374</span><span id="line-2374">    }</span>
-<span class="source-line-no">2375</span><span id="line-2375"></span>
-<span class="source-line-no">2376</span><span id="line-2376">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">2377</span><span id="line-2377">      return format(i);</span>
+<span class="source-line-no">2310</span><span id="line-2310">    @Override</span>
+<span class="source-line-no">2311</span><span id="line-2311">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2312</span><span id="line-2312">      final byte[] bytes = format(i);</span>
+<span class="source-line-no">2313</span><span id="line-2313">      // checkAndXXX tests operate on only a single value</span>
+<span class="source-line-no">2314</span><span id="line-2314">      // Put a known value so when we go to check it, it is there.</span>
+<span class="source-line-no">2315</span><span id="line-2315">      Put put = new Put(bytes);</span>
+<span class="source-line-no">2316</span><span id="line-2316">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
+<span class="source-line-no">2317</span><span id="line-2317">      this.table.put(put);</span>
+<span class="source-line-no">2318</span><span id="line-2318">      Delete delete = new Delete(put.getRow());</span>
+<span class="source-line-no">2319</span><span id="line-2319">      delete.addColumn(FAMILY_ZERO, getQualifier());</span>
+<span class="source-line-no">2320</span><span id="line-2320">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
+<span class="source-line-no">2321</span><span id="line-2321">        .thenDelete(delete);</span>
+<span class="source-line-no">2322</span><span id="line-2322">      return true;</span>
+<span class="source-line-no">2323</span><span id="line-2323">    }</span>
+<span class="source-line-no">2324</span><span id="line-2324">  }</span>
+<span class="source-line-no">2325</span><span id="line-2325"></span>
+<span class="source-line-no">2326</span><span id="line-2326">  /*</span>
+<span class="source-line-no">2327</span><span id="line-2327">   * Delete all fake regions inserted to meta table by MetaWriteTest.</span>
+<span class="source-line-no">2328</span><span id="line-2328">   */</span>
+<span class="source-line-no">2329</span><span id="line-2329">  static class CleanMetaTest extends MetaTest {</span>
+<span class="source-line-no">2330</span><span id="line-2330">    CleanMetaTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2331</span><span id="line-2331">      super(con, options, status);</span>
+<span class="source-line-no">2332</span><span id="line-2332">    }</span>
+<span class="source-line-no">2333</span><span id="line-2333"></span>
+<span class="source-line-no">2334</span><span id="line-2334">    @Override</span>
+<span class="source-line-no">2335</span><span id="line-2335">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2336</span><span id="line-2336">      try {</span>
+<span class="source-line-no">2337</span><span id="line-2337">        RegionInfo regionInfo = connection.getRegionLocator(table.getName())</span>
+<span class="source-line-no">2338</span><span id="line-2338">          .getRegionLocation(getSplitKey(i), false).getRegion();</span>
+<span class="source-line-no">2339</span><span id="line-2339">        LOG.debug("deleting region from meta: " + regionInfo);</span>
+<span class="source-line-no">2340</span><span id="line-2340"></span>
+<span class="source-line-no">2341</span><span id="line-2341">        Delete delete =</span>
+<span class="source-line-no">2342</span><span id="line-2342">          MetaTableAccessor.makeDeleteFromRegionInfo(regionInfo, HConstants.LATEST_TIMESTAMP);</span>
+<span class="source-line-no">2343</span><span id="line-2343">        try (Table t = MetaTableAccessor.getMetaHTable(connection)) {</span>
+<span class="source-line-no">2344</span><span id="line-2344">          t.delete(delete);</span>
+<span class="source-line-no">2345</span><span id="line-2345">        }</span>
+<span class="source-line-no">2346</span><span id="line-2346">      } catch (IOException ie) {</span>
+<span class="source-line-no">2347</span><span id="line-2347">        // Log and continue</span>
+<span class="source-line-no">2348</span><span id="line-2348">        LOG.error("cannot find region with start key: " + i);</span>
+<span class="source-line-no">2349</span><span id="line-2349">      }</span>
+<span class="source-line-no">2350</span><span id="line-2350">      return true;</span>
+<span class="source-line-no">2351</span><span id="line-2351">    }</span>
+<span class="source-line-no">2352</span><span id="line-2352">  }</span>
+<span class="source-line-no">2353</span><span id="line-2353"></span>
+<span class="source-line-no">2354</span><span id="line-2354">  static class SequentialReadTest extends TableTest {</span>
+<span class="source-line-no">2355</span><span id="line-2355">    SequentialReadTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2356</span><span id="line-2356">      super(con, options, status);</span>
+<span class="source-line-no">2357</span><span id="line-2357">    }</span>
+<span class="source-line-no">2358</span><span id="line-2358"></span>
+<span class="source-line-no">2359</span><span id="line-2359">    @Override</span>
+<span class="source-line-no">2360</span><span id="line-2360">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2361</span><span id="line-2361">      Get get = new Get(format(i));</span>
+<span class="source-line-no">2362</span><span id="line-2362">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2363</span><span id="line-2363">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2364</span><span id="line-2364">        if (opts.addColumns) {</span>
+<span class="source-line-no">2365</span><span id="line-2365">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2366</span><span id="line-2366">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2367</span><span id="line-2367">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">2368</span><span id="line-2368">          }</span>
+<span class="source-line-no">2369</span><span id="line-2369">        } else {</span>
+<span class="source-line-no">2370</span><span id="line-2370">          get.addFamily(familyName);</span>
+<span class="source-line-no">2371</span><span id="line-2371">        }</span>
+<span class="source-line-no">2372</span><span id="line-2372">      }</span>
+<span class="source-line-no">2373</span><span id="line-2373">      if (opts.filterAll) {</span>
+<span class="source-line-no">2374</span><span id="line-2374">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">2375</span><span id="line-2375">      }</span>
+<span class="source-line-no">2376</span><span id="line-2376">      updateValueSize(table.get(get));</span>
+<span class="source-line-no">2377</span><span id="line-2377">      return true;</span>
 <span class="source-line-no">2378</span><span id="line-2378">    }</span>
-<span class="source-line-no">2379</span><span id="line-2379"></span>
-<span class="source-line-no">2380</span><span id="line-2380">    @Override</span>
-<span class="source-line-no">2381</span><span id="line-2381">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2382</span><span id="line-2382">      byte[] row = generateRow(i);</span>
-<span class="source-line-no">2383</span><span id="line-2383">      Put put = new Put(row);</span>
-<span class="source-line-no">2384</span><span id="line-2384">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2385</span><span id="line-2385">        byte familyName[] = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2386</span><span id="line-2386">        for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2387</span><span id="line-2387">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2388</span><span id="line-2388">          byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
-<span class="source-line-no">2389</span><span id="line-2389">          if (opts.useTags) {</span>
-<span class="source-line-no">2390</span><span id="line-2390">            byte[] tag = generateData(this.rand, TAG_LENGTH);</span>
-<span class="source-line-no">2391</span><span id="line-2391">            Tag[] tags = new Tag[opts.noOfTags];</span>
-<span class="source-line-no">2392</span><span id="line-2392">            for (int n = 0; n &lt; opts.noOfTags; n++) {</span>
-<span class="source-line-no">2393</span><span id="line-2393">              Tag t = new ArrayBackedTag((byte) n, tag);</span>
-<span class="source-line-no">2394</span><span id="line-2394">              tags[n] = t;</span>
-<span class="source-line-no">2395</span><span id="line-2395">            }</span>
-<span class="source-line-no">2396</span><span id="line-2396">            KeyValue kv =</span>
-<span class="source-line-no">2397</span><span id="line-2397">              new KeyValue(row, familyName, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);</span>
-<span class="source-line-no">2398</span><span id="line-2398">            put.add(kv);</span>
-<span class="source-line-no">2399</span><span id="line-2399">            updateValueSize(kv.getValueLength());</span>
-<span class="source-line-no">2400</span><span id="line-2400">          } else {</span>
-<span class="source-line-no">2401</span><span id="line-2401">            put.addColumn(familyName, qualifier, value);</span>
-<span class="source-line-no">2402</span><span id="line-2402">            updateValueSize(value.length);</span>
-<span class="source-line-no">2403</span><span id="line-2403">          }</span>
-<span class="source-line-no">2404</span><span id="line-2404">        }</span>
-<span class="source-line-no">2405</span><span id="line-2405">      }</span>
-<span class="source-line-no">2406</span><span id="line-2406">      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
-<span class="source-line-no">2407</span><span id="line-2407">      if (opts.autoFlush) {</span>
-<span class="source-line-no">2408</span><span id="line-2408">        if (opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">2409</span><span id="line-2409">          this.puts.add(put);</span>
-<span class="source-line-no">2410</span><span id="line-2410">          if (this.puts.size() == opts.multiPut) {</span>
-<span class="source-line-no">2411</span><span id="line-2411">            table.put(this.puts);</span>
-<span class="source-line-no">2412</span><span id="line-2412">            this.puts.clear();</span>
-<span class="source-line-no">2413</span><span id="line-2413">          } else {</span>
-<span class="source-line-no">2414</span><span id="line-2414">            return false;</span>
-<span class="source-line-no">2415</span><span id="line-2415">          }</span>
-<span class="source-line-no">2416</span><span id="line-2416">        } else {</span>
-<span class="source-line-no">2417</span><span id="line-2417">          table.put(put);</span>
-<span class="source-line-no">2418</span><span id="line-2418">        }</span>
-<span class="source-line-no">2419</span><span id="line-2419">      } else {</span>
-<span class="source-line-no">2420</span><span id="line-2420">        mutator.mutate(put);</span>
+<span class="source-line-no">2379</span><span id="line-2379">  }</span>
+<span class="source-line-no">2380</span><span id="line-2380"></span>
+<span class="source-line-no">2381</span><span id="line-2381">  static class SequentialWriteTest extends BufferedMutatorTest {</span>
+<span class="source-line-no">2382</span><span id="line-2382">    private ArrayList&lt;Put&gt; puts;</span>
+<span class="source-line-no">2383</span><span id="line-2383"></span>
+<span class="source-line-no">2384</span><span id="line-2384">    SequentialWriteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2385</span><span id="line-2385">      super(con, options, status);</span>
+<span class="source-line-no">2386</span><span id="line-2386">      if (opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">2387</span><span id="line-2387">        LOG.info("MultiPut enabled. Sending PUTs in batches of " + opts.multiPut + ".");</span>
+<span class="source-line-no">2388</span><span id="line-2388">        this.puts = new ArrayList&lt;&gt;(opts.multiPut);</span>
+<span class="source-line-no">2389</span><span id="line-2389">      }</span>
+<span class="source-line-no">2390</span><span id="line-2390">    }</span>
+<span class="source-line-no">2391</span><span id="line-2391"></span>
+<span class="source-line-no">2392</span><span id="line-2392">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">2393</span><span id="line-2393">      return format(i);</span>
+<span class="source-line-no">2394</span><span id="line-2394">    }</span>
+<span class="source-line-no">2395</span><span id="line-2395"></span>
+<span class="source-line-no">2396</span><span id="line-2396">    @Override</span>
+<span class="source-line-no">2397</span><span id="line-2397">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2398</span><span id="line-2398">      byte[] row = generateRow(i);</span>
+<span class="source-line-no">2399</span><span id="line-2399">      Put put = new Put(row);</span>
+<span class="source-line-no">2400</span><span id="line-2400">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2401</span><span id="line-2401">        byte familyName[] = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2402</span><span id="line-2402">        for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2403</span><span id="line-2403">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2404</span><span id="line-2404">          byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
+<span class="source-line-no">2405</span><span id="line-2405">          if (opts.useTags) {</span>
+<span class="source-line-no">2406</span><span id="line-2406">            byte[] tag = generateData(this.rand, TAG_LENGTH);</span>
+<span class="source-line-no">2407</span><span id="line-2407">            Tag[] tags = new Tag[opts.noOfTags];</span>
+<span class="source-line-no">2408</span><span id="line-2408">            for (int n = 0; n &lt; opts.noOfTags; n++) {</span>
+<span class="source-line-no">2409</span><span id="line-2409">              Tag t = new ArrayBackedTag((byte) n, tag);</span>
+<span class="source-line-no">2410</span><span id="line-2410">              tags[n] = t;</span>
+<span class="source-line-no">2411</span><span id="line-2411">            }</span>
+<span class="source-line-no">2412</span><span id="line-2412">            KeyValue kv =</span>
+<span class="source-line-no">2413</span><span id="line-2413">              new KeyValue(row, familyName, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);</span>
+<span class="source-line-no">2414</span><span id="line-2414">            put.add(kv);</span>
+<span class="source-line-no">2415</span><span id="line-2415">            updateValueSize(kv.getValueLength());</span>
+<span class="source-line-no">2416</span><span id="line-2416">          } else {</span>
+<span class="source-line-no">2417</span><span id="line-2417">            put.addColumn(familyName, qualifier, value);</span>
+<span class="source-line-no">2418</span><span id="line-2418">            updateValueSize(value.length);</span>
+<span class="source-line-no">2419</span><span id="line-2419">          }</span>
+<span class="source-line-no">2420</span><span id="line-2420">        }</span>
 <span class="source-line-no">2421</span><span id="line-2421">      }</span>
-<span class="source-line-no">2422</span><span id="line-2422">      return true;</span>
-<span class="source-line-no">2423</span><span id="line-2423">    }</span>
-<span class="source-line-no">2424</span><span id="line-2424">  }</span>
-<span class="source-line-no">2425</span><span id="line-2425"></span>
-<span class="source-line-no">2426</span><span id="line-2426">  static class SequentialDeleteTest extends BufferedMutatorTest {</span>
-<span class="source-line-no">2427</span><span id="line-2427"></span>
-<span class="source-line-no">2428</span><span id="line-2428">    SequentialDeleteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2429</span><span id="line-2429">      super(con, options, status);</span>
-<span class="source-line-no">2430</span><span id="line-2430">    }</span>
-<span class="source-line-no">2431</span><span id="line-2431"></span>
-<span class="source-line-no">2432</span><span id="line-2432">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">2433</span><span id="line-2433">      return format(i);</span>
-<span class="source-line-no">2434</span><span id="line-2434">    }</span>
-<span class="source-line-no">2435</span><span id="line-2435"></span>
-<span class="source-line-no">2436</span><span id="line-2436">    @Override</span>
-<span class="source-line-no">2437</span><span id="line-2437">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2438</span><span id="line-2438">      byte[] row = generateRow(i);</span>
-<span class="source-line-no">2439</span><span id="line-2439">      Delete delete = new Delete(row);</span>
-<span class="source-line-no">2440</span><span id="line-2440">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2441</span><span id="line-2441">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2442</span><span id="line-2442">        delete.addFamily(familyName);</span>
-<span class="source-line-no">2443</span><span id="line-2443">      }</span>
-<span class="source-line-no">2444</span><span id="line-2444">      delete.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
-<span class="source-line-no">2445</span><span id="line-2445">      if (opts.autoFlush) {</span>
-<span class="source-line-no">2446</span><span id="line-2446">        table.delete(delete);</span>
-<span class="source-line-no">2447</span><span id="line-2447">      } else {</span>
-<span class="source-line-no">2448</span><span id="line-2448">        mutator.mutate(delete);</span>
-<span class="source-line-no">2449</span><span id="line-2449">      }</span>
-<span class="source-line-no">2450</span><span id="line-2450">      return true;</span>
-<span class="source-line-no">2451</span><span id="line-2451">    }</span>
-<span class="source-line-no">2452</span><span id="line-2452">  }</span>
-<span class="source-line-no">2453</span><span id="line-2453"></span>
-<span class="source-line-no">2454</span><span id="line-2454">  /*</span>
-<span class="source-line-no">2455</span><span id="line-2455">   * Insert fake regions into meta table with contiguous split keys.</span>
-<span class="source-line-no">2456</span><span id="line-2456">   */</span>
-<span class="source-line-no">2457</span><span id="line-2457">  static class MetaWriteTest extends MetaTest {</span>
-<span class="source-line-no">2458</span><span id="line-2458"></span>
-<span class="source-line-no">2459</span><span id="line-2459">    MetaWriteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2460</span><span id="line-2460">      super(con, options, status);</span>
-<span class="source-line-no">2461</span><span id="line-2461">    }</span>
-<span class="source-line-no">2462</span><span id="line-2462"></span>
-<span class="source-line-no">2463</span><span id="line-2463">    @Override</span>
-<span class="source-line-no">2464</span><span id="line-2464">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2465</span><span id="line-2465">      List&lt;RegionInfo&gt; regionInfos = new ArrayList&lt;RegionInfo&gt;();</span>
-<span class="source-line-no">2466</span><span id="line-2466">      RegionInfo regionInfo = (RegionInfoBuilder.newBuilder(TableName.valueOf(TABLE_NAME))</span>
-<span class="source-line-no">2467</span><span id="line-2467">        .setStartKey(getSplitKey(i)).setEndKey(getSplitKey(i + 1)).build());</span>
-<span class="source-line-no">2468</span><span id="line-2468">      regionInfos.add(regionInfo);</span>
-<span class="source-line-no">2469</span><span id="line-2469">      MetaTableAccessor.addRegionsToMeta(connection, regionInfos, 1);</span>
-<span class="source-line-no">2470</span><span id="line-2470"></span>
-<span class="source-line-no">2471</span><span id="line-2471">      // write the serverName columns</span>
-<span class="source-line-no">2472</span><span id="line-2472">      MetaTableAccessor.updateRegionLocation(connection, regionInfo,</span>
-<span class="source-line-no">2473</span><span id="line-2473">        ServerName.valueOf("localhost", 60010, rand.nextLong()), i,</span>
-<span class="source-line-no">2474</span><span id="line-2474">        EnvironmentEdgeManager.currentTime());</span>
-<span class="source-line-no">2475</span><span id="line-2475">      return true;</span>
-<span class="source-line-no">2476</span><span id="line-2476">    }</span>
-<span class="source-line-no">2477</span><span id="line-2477">  }</span>
+<span class="source-line-no">2422</span><span id="line-2422">      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
+<span class="source-line-no">2423</span><span id="line-2423">      if (opts.autoFlush) {</span>
+<span class="source-line-no">2424</span><span id="line-2424">        if (opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">2425</span><span id="line-2425">          this.puts.add(put);</span>
+<span class="source-line-no">2426</span><span id="line-2426">          if (this.puts.size() == opts.multiPut) {</span>
+<span class="source-line-no">2427</span><span id="line-2427">            table.put(this.puts);</span>
+<span class="source-line-no">2428</span><span id="line-2428">            this.puts.clear();</span>
+<span class="source-line-no">2429</span><span id="line-2429">          } else {</span>
+<span class="source-line-no">2430</span><span id="line-2430">            return false;</span>
+<span class="source-line-no">2431</span><span id="line-2431">          }</span>
+<span class="source-line-no">2432</span><span id="line-2432">        } else {</span>
+<span class="source-line-no">2433</span><span id="line-2433">          table.put(put);</span>
+<span class="source-line-no">2434</span><span id="line-2434">        }</span>
+<span class="source-line-no">2435</span><span id="line-2435">      } else {</span>
+<span class="source-line-no">2436</span><span id="line-2436">        mutator.mutate(put);</span>
+<span class="source-line-no">2437</span><span id="line-2437">      }</span>
+<span class="source-line-no">2438</span><span id="line-2438">      return true;</span>
+<span class="source-line-no">2439</span><span id="line-2439">    }</span>
+<span class="source-line-no">2440</span><span id="line-2440">  }</span>
+<span class="source-line-no">2441</span><span id="line-2441"></span>
+<span class="source-line-no">2442</span><span id="line-2442">  static class SequentialDeleteTest extends BufferedMutatorTest {</span>
+<span class="source-line-no">2443</span><span id="line-2443"></span>
+<span class="source-line-no">2444</span><span id="line-2444">    SequentialDeleteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2445</span><span id="line-2445">      super(con, options, status);</span>
+<span class="source-line-no">2446</span><span id="line-2446">    }</span>
+<span class="source-line-no">2447</span><span id="line-2447"></span>
+<span class="source-line-no">2448</span><span id="line-2448">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">2449</span><span id="line-2449">      return format(i);</span>
+<span class="source-line-no">2450</span><span id="line-2450">    }</span>
+<span class="source-line-no">2451</span><span id="line-2451"></span>
+<span class="source-line-no">2452</span><span id="line-2452">    @Override</span>
+<span class="source-line-no">2453</span><span id="line-2453">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2454</span><span id="line-2454">      byte[] row = generateRow(i);</span>
+<span class="source-line-no">2455</span><span id="line-2455">      Delete delete = new Delete(row);</span>
+<span class="source-line-no">2456</span><span id="line-2456">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2457</span><span id="line-2457">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2458</span><span id="line-2458">        delete.addFamily(familyName);</span>
+<span class="source-line-no">2459</span><span id="line-2459">      }</span>
+<span class="source-line-no">2460</span><span id="line-2460">      delete.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
+<span class="source-line-no">2461</span><span id="line-2461">      if (opts.autoFlush) {</span>
+<span class="source-line-no">2462</span><span id="line-2462">        table.delete(delete);</span>
+<span class="source-line-no">2463</span><span id="line-2463">      } else {</span>
+<span class="source-line-no">2464</span><span id="line-2464">        mutator.mutate(delete);</span>
+<span class="source-line-no">2465</span><span id="line-2465">      }</span>
+<span class="source-line-no">2466</span><span id="line-2466">      return true;</span>
+<span class="source-line-no">2467</span><span id="line-2467">    }</span>
+<span class="source-line-no">2468</span><span id="line-2468">  }</span>
+<span class="source-line-no">2469</span><span id="line-2469"></span>
+<span class="source-line-no">2470</span><span id="line-2470">  /*</span>
+<span class="source-line-no">2471</span><span id="line-2471">   * Insert fake regions into meta table with contiguous split keys.</span>
+<span class="source-line-no">2472</span><span id="line-2472">   */</span>
+<span class="source-line-no">2473</span><span id="line-2473">  static class MetaWriteTest extends MetaTest {</span>
+<span class="source-line-no">2474</span><span id="line-2474"></span>
+<span class="source-line-no">2475</span><span id="line-2475">    MetaWriteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2476</span><span id="line-2476">      super(con, options, status);</span>
+<span class="source-line-no">2477</span><span id="line-2477">    }</span>
 <span class="source-line-no">2478</span><span id="line-2478"></span>
-<span class="source-line-no">2479</span><span id="line-2479">  static class FilteredScanTest extends TableTest {</span>
-<span class="source-line-no">2480</span><span id="line-2480">    protected static final Logger LOG = LoggerFactory.getLogger(FilteredScanTest.class.getName());</span>
-<span class="source-line-no">2481</span><span id="line-2481"></span>
-<span class="source-line-no">2482</span><span id="line-2482">    FilteredScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2483</span><span id="line-2483">      super(con, options, status);</span>
-<span class="source-line-no">2484</span><span id="line-2484">      if (opts.perClientRunRows == DEFAULT_ROWS_PER_GB) {</span>
-<span class="source-line-no">2485</span><span id="line-2485">        LOG.warn("Option \"rows\" unspecified. Using default value " + DEFAULT_ROWS_PER_GB</span>
-<span class="source-line-no">2486</span><span id="line-2486">          + ". This could take a very long time.");</span>
-<span class="source-line-no">2487</span><span id="line-2487">      }</span>
-<span class="source-line-no">2488</span><span id="line-2488">    }</span>
-<span class="source-line-no">2489</span><span id="line-2489"></span>
-<span class="source-line-no">2490</span><span id="line-2490">    @Override</span>
-<span class="source-line-no">2491</span><span id="line-2491">    boolean testRow(int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2492</span><span id="line-2492">      byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
-<span class="source-line-no">2493</span><span id="line-2493">      Scan scan = constructScan(value);</span>
-<span class="source-line-no">2494</span><span id="line-2494">      ResultScanner scanner = null;</span>
-<span class="source-line-no">2495</span><span id="line-2495">      try {</span>
-<span class="source-line-no">2496</span><span id="line-2496">        scanner = this.table.getScanner(scan);</span>
-<span class="source-line-no">2497</span><span id="line-2497">        for (Result r = null; (r = scanner.next()) != null;) {</span>
-<span class="source-line-no">2498</span><span id="line-2498">          updateValueSize(r);</span>
-<span class="source-line-no">2499</span><span id="line-2499">        }</span>
-<span class="source-line-no">2500</span><span id="line-2500">      } finally {</span>
-<span class="source-line-no">2501</span><span id="line-2501">        if (scanner != null) {</span>
-<span class="source-line-no">2502</span><span id="line-2502">          updateScanMetrics(scanner.getScanMetrics());</span>
-<span class="source-line-no">2503</span><span id="line-2503">          scanner.close();</span>
-<span class="source-line-no">2504</span><span id="line-2504">        }</span>
-<span class="source-line-no">2505</span><span id="line-2505">      }</span>
-<span class="source-line-no">2506</span><span id="line-2506">      return true;</span>
-<span class="source-line-no">2507</span><span id="line-2507">    }</span>
-<span class="source-line-no">2508</span><span id="line-2508"></span>
-<span class="source-line-no">2509</span><span id="line-2509">    protected Scan constructScan(byte[] valuePrefix) throws IOException {</span>
-<span class="source-line-no">2510</span><span id="line-2510">      FilterList list = new FilterList();</span>
-<span class="source-line-no">2511</span><span id="line-2511">      Filter filter = new SingleColumnValueFilter(FAMILY_ZERO, COLUMN_ZERO, CompareOperator.EQUAL,</span>
-<span class="source-line-no">2512</span><span id="line-2512">        new BinaryComparator(valuePrefix));</span>
-<span class="source-line-no">2513</span><span id="line-2513">      list.addFilter(filter);</span>
-<span class="source-line-no">2514</span><span id="line-2514">      if (opts.filterAll) {</span>
-<span class="source-line-no">2515</span><span id="line-2515">        list.addFilter(new FilterAllFilter());</span>
-<span class="source-line-no">2516</span><span id="line-2516">      }</span>
-<span class="source-line-no">2517</span><span id="line-2517">      Scan scan = new Scan().setCaching(opts.caching).setCacheBlocks(opts.cacheBlocks)</span>
-<span class="source-line-no">2518</span><span id="line-2518">        .setAsyncPrefetch(opts.asyncPrefetch).setReadType(opts.scanReadType)</span>
-<span class="source-line-no">2519</span><span id="line-2519">        .setScanMetricsEnabled(true);</span>
-<span class="source-line-no">2520</span><span id="line-2520">      if (opts.addColumns) {</span>
-<span class="source-line-no">2521</span><span id="line-2521">        for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2522</span><span id="line-2522">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2523</span><span id="line-2523">          scan.addColumn(FAMILY_ZERO, qualifier);</span>
-<span class="source-line-no">2524</span><span id="line-2524">        }</span>
-<span class="source-line-no">2525</span><span id="line-2525">      } else {</span>
-<span class="source-line-no">2526</span><span id="line-2526">        scan.addFamily(FAMILY_ZERO);</span>
-<span class="source-line-no">2527</span><span id="line-2527">      }</span>
-<span class="source-line-no">2528</span><span id="line-2528">      scan.setFilter(list);</span>
-<span class="source-line-no">2529</span><span id="line-2529">      return scan;</span>
-<span class="source-line-no">2530</span><span id="line-2530">    }</span>
-<span class="source-line-no">2531</span><span id="line-2531">  }</span>
-<span class="source-line-no">2532</span><span id="line-2532"></span>
-<span class="source-line-no">2533</span><span id="line-2533">  /**</span>
-<span class="source-line-no">2534</span><span id="line-2534">   * Compute a throughput rate in MB/s.</span>
-<span class="source-line-no">2535</span><span id="line-2535">   * @param rows   Number of records consumed.</span>
-<span class="source-line-no">2536</span><span id="line-2536">   * @param timeMs Time taken in milliseconds.</span>
-<span class="source-line-no">2537</span><span id="line-2537">   * @return String value with label, ie '123.76 MB/s'</span>
-<span class="source-line-no">2538</span><span id="line-2538">   */</span>
-<span class="source-line-no">2539</span><span id="line-2539">  private static String calculateMbps(int rows, long timeMs, final int valueSize, int families,</span>
-<span class="source-line-no">2540</span><span id="line-2540">    int columns) {</span>
-<span class="source-line-no">2541</span><span id="line-2541">    BigDecimal rowSize = BigDecimal.valueOf(ROW_LENGTH</span>
-<span class="source-line-no">2542</span><span id="line-2542">      + ((valueSize + (FAMILY_NAME_BASE.length() + 1) + COLUMN_ZERO.length) * columns) * families);</span>
-<span class="source-line-no">2543</span><span id="line-2543">    BigDecimal mbps = BigDecimal.valueOf(rows).multiply(rowSize, CXT)</span>
-<span class="source-line-no">2544</span><span id="line-2544">      .divide(BigDecimal.valueOf(timeMs), CXT).multiply(MS_PER_SEC, CXT).divide(BYTES_PER_MB, CXT);</span>
-<span class="source-line-no">2545</span><span id="line-2545">    return FMT.format(mbps) + " MB/s";</span>
-<span class="source-line-no">2546</span><span id="line-2546">  }</span>
-<span class="source-line-no">2547</span><span id="line-2547"></span>
-<span class="source-line-no">2548</span><span id="line-2548">  /*</span>
-<span class="source-line-no">2549</span><span id="line-2549">   * Format passed integer.</span>
-<span class="source-line-no">2550</span><span id="line-2550">   * @return Returns zero-prefixed ROW_LENGTH-byte wide decimal version of passed number (Does</span>
-<span class="source-line-no">2551</span><span id="line-2551">   * absolute in case number is negative).</span>
-<span class="source-line-no">2552</span><span id="line-2552">   */</span>
-<span class="source-line-no">2553</span><span id="line-2553">  public static byte[] format(final int number) {</span>
-<span class="source-line-no">2554</span><span id="line-2554">    byte[] b = new byte[ROW_LENGTH];</span>
-<span class="source-line-no">2555</span><span id="line-2555">    int d = Math.abs(number);</span>
-<span class="source-line-no">2556</span><span id="line-2556">    for (int i = b.length - 1; i &gt;= 0; i--) {</span>
-<span class="source-line-no">2557</span><span id="line-2557">      b[i] = (byte) ((d % 10) + '0');</span>
-<span class="source-line-no">2558</span><span id="line-2558">      d /= 10;</span>
-<span class="source-line-no">2559</span><span id="line-2559">    }</span>
-<span class="source-line-no">2560</span><span id="line-2560">    return b;</span>
-<span class="source-line-no">2561</span><span id="line-2561">  }</span>
-<span class="source-line-no">2562</span><span id="line-2562"></span>
-<span class="source-line-no">2563</span><span id="line-2563">  /*</span>
-<span class="source-line-no">2564</span><span id="line-2564">   * This method takes some time and is done inline uploading data. For example, doing the mapfile</span>
-<span class="source-line-no">2565</span><span id="line-2565">   * test, generation of the key and value consumes about 30% of CPU time.</span>
-<span class="source-line-no">2566</span><span id="line-2566">   * @return Generated random value to insert into a table cell.</span>
-<span class="source-line-no">2567</span><span id="line-2567">   */</span>
-<span class="source-line-no">2568</span><span id="line-2568">  public static byte[] generateData(final Random r, int length) {</span>
-<span class="source-line-no">2569</span><span id="line-2569">    byte[] b = new byte[length];</span>
-<span class="source-line-no">2570</span><span id="line-2570">    int i;</span>
-<span class="source-line-no">2571</span><span id="line-2571"></span>
-<span class="source-line-no">2572</span><span id="line-2572">    for (i = 0; i &lt; (length - 8); i += 8) {</span>
-<span class="source-line-no">2573</span><span id="line-2573">      b[i] = (byte) (65 + r.nextInt(26));</span>
-<span class="source-line-no">2574</span><span id="line-2574">      b[i + 1] = b[i];</span>
-<span class="source-line-no">2575</span><span id="line-2575">      b[i + 2] = b[i];</span>
-<span class="source-line-no">2576</span><span id="line-2576">      b[i + 3] = b[i];</span>
-<span class="source-line-no">2577</span><span id="line-2577">      b[i + 4] = b[i];</span>
-<span class="source-line-no">2578</span><span id="line-2578">      b[i + 5] = b[i];</span>
-<span class="source-line-no">2579</span><span id="line-2579">      b[i + 6] = b[i];</span>
-<span class="source-line-no">2580</span><span id="line-2580">      b[i + 7] = b[i];</span>
-<span class="source-line-no">2581</span><span id="line-2581">    }</span>
-<span class="source-line-no">2582</span><span id="line-2582"></span>
-<span class="source-line-no">2583</span><span id="line-2583">    byte a = (byte) (65 + r.nextInt(26));</span>
-<span class="source-line-no">2584</span><span id="line-2584">    for (; i &lt; length; i++) {</span>
-<span class="source-line-no">2585</span><span id="line-2585">      b[i] = a;</span>
-<span class="source-line-no">2586</span><span id="line-2586">    }</span>
-<span class="source-line-no">2587</span><span id="line-2587">    return b;</span>
-<span class="source-line-no">2588</span><span id="line-2588">  }</span>
-<span class="source-line-no">2589</span><span id="line-2589"></span>
-<span class="source-line-no">2590</span><span id="line-2590">  static byte[] getRandomRow(final Random random, final int totalRows) {</span>
-<span class="source-line-no">2591</span><span id="line-2591">    return format(generateRandomRow(random, totalRows));</span>
-<span class="source-line-no">2592</span><span id="line-2592">  }</span>
-<span class="source-line-no">2593</span><span id="line-2593"></span>
-<span class="source-line-no">2594</span><span id="line-2594">  static int generateRandomRow(final Random random, final int totalRows) {</span>
-<span class="source-line-no">2595</span><span id="line-2595">    return random.nextInt(Integer.MAX_VALUE) % totalRows;</span>
-<span class="source-line-no">2596</span><span id="line-2596">  }</span>
-<span class="source-line-no">2597</span><span id="line-2597"></span>
-<span class="source-line-no">2598</span><span id="line-2598">  static RunResult runOneClient(final Class&lt;? extends TestBase&gt; cmd, Configuration conf,</span>
-<span class="source-line-no">2599</span><span id="line-2599">    Connection con, AsyncConnection asyncCon, TestOptions opts, final Status status)</span>
-<span class="source-line-no">2600</span><span id="line-2600">    throws IOException, InterruptedException {</span>
-<span class="source-line-no">2601</span><span id="line-2601">    status.setStatus(</span>
-<span class="source-line-no">2602</span><span id="line-2602">      "Start " + cmd + " at offset " + opts.startRow + " for " + opts.perClientRunRows + " rows");</span>
-<span class="source-line-no">2603</span><span id="line-2603">    long totalElapsedTime;</span>
-<span class="source-line-no">2604</span><span id="line-2604"></span>
-<span class="source-line-no">2605</span><span id="line-2605">    final TestBase t;</span>
-<span class="source-line-no">2606</span><span id="line-2606">    try {</span>
-<span class="source-line-no">2607</span><span id="line-2607">      if (AsyncTest.class.isAssignableFrom(cmd)) {</span>
-<span class="source-line-no">2608</span><span id="line-2608">        Class&lt;? extends AsyncTest&gt; newCmd = (Class&lt;? extends AsyncTest&gt;) cmd;</span>
-<span class="source-line-no">2609</span><span id="line-2609">        Constructor&lt;? extends AsyncTest&gt; constructor =</span>
-<span class="source-line-no">2610</span><span id="line-2610">          newCmd.getDeclaredConstructor(AsyncConnection.class, TestOptions.class, Status.class);</span>
-<span class="source-line-no">2611</span><span id="line-2611">        t = constructor.newInstance(asyncCon, opts, status);</span>
-<span class="source-line-no">2612</span><span id="line-2612">      } else {</span>
-<span class="source-line-no">2613</span><span id="line-2613">        Class&lt;? extends Test&gt; newCmd = (Class&lt;? extends Test&gt;) cmd;</span>
-<span class="source-line-no">2614</span><span id="line-2614">        Constructor&lt;? extends Test&gt; constructor =</span>
-<span class="source-line-no">2615</span><span id="line-2615">          newCmd.getDeclaredConstructor(Connection.class, TestOptions.class, Status.class);</span>
-<span class="source-line-no">2616</span><span id="line-2616">        t = constructor.newInstance(con, opts, status);</span>
-<span class="source-line-no">2617</span><span id="line-2617">      }</span>
-<span class="source-line-no">2618</span><span id="line-2618">    } catch (NoSuchMethodException e) {</span>
-<span class="source-line-no">2619</span><span id="line-2619">      throw new IllegalArgumentException("Invalid command class: " + cmd.getName()</span>
-<span class="source-line-no">2620</span><span id="line-2620">        + ".  It does not provide a constructor as described by "</span>
-<span class="source-line-no">2621</span><span id="line-2621">        + "the javadoc comment.  Available constructors are: "</span>
-<span class="source-line-no">2622</span><span id="line-2622">        + Arrays.toString(cmd.getConstructors()));</span>
-<span class="source-line-no">2623</span><span id="line-2623">    } catch (Exception e) {</span>
-<span class="source-line-no">2624</span><span id="line-2624">      throw new IllegalStateException("Failed to construct command class", e);</span>
-<span class="source-line-no">2625</span><span id="line-2625">    }</span>
-<span class="source-line-no">2626</span><span id="line-2626">    totalElapsedTime = t.test();</span>
-<span class="source-line-no">2627</span><span id="line-2627"></span>
-<span class="source-line-no">2628</span><span id="line-2628">    status.setStatus("Finished " + cmd + " in " + totalElapsedTime + "ms at offset " + opts.startRow</span>
-<span class="source-line-no">2629</span><span id="line-2629">      + " for " + opts.perClientRunRows + " rows" + " ("</span>
-<span class="source-line-no">2630</span><span id="line-2630">      + calculateMbps((int) (opts.perClientRunRows * opts.sampleRate), totalElapsedTime,</span>
-<span class="source-line-no">2631</span><span id="line-2631">        getAverageValueLength(opts), opts.families, opts.columns)</span>
-<span class="source-line-no">2632</span><span id="line-2632">      + ")");</span>
-<span class="source-line-no">2633</span><span id="line-2633"></span>
-<span class="source-line-no">2634</span><span id="line-2634">    return new RunResult(totalElapsedTime, t.numOfReplyOverLatencyThreshold,</span>
-<span class="source-line-no">2635</span><span id="line-2635">      t.numOfReplyFromReplica, t.getLatencyHistogram());</span>
-<span class="source-line-no">2636</span><span id="line-2636">  }</span>
-<span class="source-line-no">2637</span><span id="line-2637"></span>
-<span class="source-line-no">2638</span><span id="line-2638">  private static int getAverageValueLength(final TestOptions opts) {</span>
-<span class="source-line-no">2639</span><span id="line-2639">    return opts.valueRandom ? opts.valueSize / 2 : opts.valueSize;</span>
-<span class="source-line-no">2640</span><span id="line-2640">  }</span>
-<span class="source-line-no">2641</span><span id="line-2641"></span>
-<span class="source-line-no">2642</span><span id="line-2642">  private void runTest(final Class&lt;? extends TestBase&gt; cmd, TestOptions opts)</span>
-<span class="source-line-no">2643</span><span id="line-2643">    throws IOException, InterruptedException, ClassNotFoundException, ExecutionException {</span>
-<span class="source-line-no">2644</span><span id="line-2644">    // Log the configuration we're going to run with. Uses JSON mapper because lazy. It'll do</span>
-<span class="source-line-no">2645</span><span id="line-2645">    // the TestOptions introspection for us and dump the output in a readable format.</span>
-<span class="source-line-no">2646</span><span id="line-2646">    LOG.info(cmd.getSimpleName() + " test run options=" + GSON.toJson(opts));</span>
-<span class="source-line-no">2647</span><span id="line-2647">    Admin admin = null;</span>
-<span class="source-line-no">2648</span><span id="line-2648">    Connection connection = null;</span>
-<span class="source-line-no">2649</span><span id="line-2649">    try {</span>
-<span class="source-line-no">2650</span><span id="line-2650">      connection = ConnectionFactory.createConnection(getConf());</span>
-<span class="source-line-no">2651</span><span id="line-2651">      admin = connection.getAdmin();</span>
-<span class="source-line-no">2652</span><span id="line-2652">      checkTable(admin, opts);</span>
-<span class="source-line-no">2653</span><span id="line-2653">    } finally {</span>
-<span class="source-line-no">2654</span><span id="line-2654">      if (admin != null) admin.close();</span>
-<span class="source-line-no">2655</span><span id="line-2655">      if (connection != null) connection.close();</span>
-<span class="source-line-no">2656</span><span id="line-2656">    }</span>
-<span class="source-line-no">2657</span><span id="line-2657">    if (opts.nomapred) {</span>
-<span class="source-line-no">2658</span><span id="line-2658">      doLocalClients(opts, getConf());</span>
-<span class="source-line-no">2659</span><span id="line-2659">    } else {</span>
-<span class="source-line-no">2660</span><span id="line-2660">      doMapReduce(opts, getConf());</span>
-<span class="source-line-no">2661</span><span id="line-2661">    }</span>
-<span class="source-line-no">2662</span><span id="line-2662">  }</span>
-<span class="source-line-no">2663</span><span id="line-2663"></span>
-<span class="source-line-no">2664</span><span id="line-2664">  protected void printUsage() {</span>
-<span class="source-line-no">2665</span><span id="line-2665">    printUsage(PE_COMMAND_SHORTNAME, null);</span>
-<span class="source-line-no">2666</span><span id="line-2666">  }</span>
-<span class="source-line-no">2667</span><span id="line-2667"></span>
-<span class="source-line-no">2668</span><span id="line-2668">  protected static void printUsage(final String message) {</span>
-<span class="source-line-no">2669</span><span id="line-2669">    printUsage(PE_COMMAND_SHORTNAME, message);</span>
-<span class="source-line-no">2670</span><span id="line-2670">  }</span>
-<span class="source-line-no">2671</span><span id="line-2671"></span>
-<span class="source-line-no">2672</span><span id="line-2672">  protected static void printUsageAndExit(final String message, final int exitCode) {</span>
-<span class="source-line-no">2673</span><span id="line-2673">    printUsage(message);</span>
-<span class="source-line-no">2674</span><span id="line-2674">    System.exit(exitCode);</span>
-<span class="source-line-no">2675</span><span id="line-2675">  }</span>
-<span class="source-line-no">2676</span><span id="line-2676"></span>
-<span class="source-line-no">2677</span><span id="line-2677">  protected static void printUsage(final String shortName, final String message) {</span>
-<span class="source-line-no">2678</span><span id="line-2678">    if (message != null &amp;&amp; message.length() &gt; 0) {</span>
-<span class="source-line-no">2679</span><span id="line-2679">      System.err.println(message);</span>
-<span class="source-line-no">2680</span><span id="line-2680">    }</span>
-<span class="source-line-no">2681</span><span id="line-2681">    System.err.print("Usage: hbase " + shortName);</span>
-<span class="source-line-no">2682</span><span id="line-2682">    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command|class&gt; &lt;nclients&gt;");</span>
-<span class="source-line-no">2683</span><span id="line-2683">    System.err.println();</span>
-<span class="source-line-no">2684</span><span id="line-2684">    System.err.println("General Options:");</span>
-<span class="source-line-no">2685</span><span id="line-2685">    System.err.println(</span>
-<span class="source-line-no">2686</span><span id="line-2686">      " nomapred        Run multiple clients using threads " + "(rather than use mapreduce)");</span>
-<span class="source-line-no">2687</span><span id="line-2687">    System.err</span>
-<span class="source-line-no">2688</span><span id="line-2688">      .println(" oneCon          all the threads share the same connection. Default: False");</span>
-<span class="source-line-no">2689</span><span id="line-2689">    System.err.println(" connCount          connections all threads share. "</span>
-<span class="source-line-no">2690</span><span id="line-2690">      + "For example, if set to 2, then all thread share 2 connection. "</span>
-<span class="source-line-no">2691</span><span id="line-2691">      + "Default: depend on oneCon parameter. if oneCon set to true, then connCount=1, "</span>
-<span class="source-line-no">2692</span><span id="line-2692">      + "if not, connCount=thread number");</span>
-<span class="source-line-no">2693</span><span id="line-2693"></span>
-<span class="source-line-no">2694</span><span id="line-2694">    System.err.println(" sampleRate      Execute test on a sample of total "</span>
-<span class="source-line-no">2695</span><span id="line-2695">      + "rows. Only supported by randomRead. Default: 1.0");</span>
-<span class="source-line-no">2696</span><span id="line-2696">    System.err.println(" period          Report every 'period' rows: "</span>
-<span class="source-line-no">2697</span><span id="line-2697">      + "Default: opts.perClientRunRows / 10 = " + DEFAULT_OPTS.getPerClientRunRows() / 10);</span>
-<span class="source-line-no">2698</span><span id="line-2698">    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");</span>
-<span class="source-line-no">2699</span><span id="line-2699">    System.err.println(</span>
-<span class="source-line-no">2700</span><span id="line-2700">      " traceRate       Enable HTrace spans. Initiate tracing every N rows. " + "Default: 0");</span>
-<span class="source-line-no">2701</span><span id="line-2701">    System.err.println(" latency         Set to report operation latencies. Default: False");</span>
-<span class="source-line-no">2702</span><span id="line-2702">    System.err.println(" latencyThreshold  Set to report number of operations with latency "</span>
-<span class="source-line-no">2703</span><span id="line-2703">      + "over lantencyThreshold, unit in millisecond, default 0");</span>
-<span class="source-line-no">2704</span><span id="line-2704">    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'"</span>
-<span class="source-line-no">2705</span><span id="line-2705">      + " rows have been treated. Default: 0");</span>
-<span class="source-line-no">2706</span><span id="line-2706">    System.err</span>
-<span class="source-line-no">2707</span><span id="line-2707">      .println(" valueSize       Pass value size to use: Default: " + DEFAULT_OPTS.getValueSize());</span>
-<span class="source-line-no">2708</span><span id="line-2708">    System.err.println(" valueRandom     Set if we should vary value size between 0 and "</span>
-<span class="source-line-no">2709</span><span id="line-2709">      + "'valueSize'; set on read for stats on size: Default: Not set.");</span>
-<span class="source-line-no">2710</span><span id="line-2710">    System.err.println(" blockEncoding   Block encoding to use. Value should be one of "</span>
-<span class="source-line-no">2711</span><span id="line-2711">      + Arrays.toString(DataBlockEncoding.values()) + ". Default: NONE");</span>
-<span class="source-line-no">2712</span><span id="line-2712">    System.err.println();</span>
-<span class="source-line-no">2713</span><span id="line-2713">    System.err.println("Table Creation / Write Tests:");</span>
-<span class="source-line-no">2714</span><span id="line-2714">    System.err.println(" table           Alternate table name. Default: 'TestTable'");</span>
+<span class="source-line-no">2479</span><span id="line-2479">    @Override</span>
+<span class="source-line-no">2480</span><span id="line-2480">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2481</span><span id="line-2481">      List&lt;RegionInfo&gt; regionInfos = new ArrayList&lt;RegionInfo&gt;();</span>
+<span class="source-line-no">2482</span><span id="line-2482">      RegionInfo regionInfo = (RegionInfoBuilder.newBuilder(TableName.valueOf(TABLE_NAME))</span>
+<span class="source-line-no">2483</span><span id="line-2483">        .setStartKey(getSplitKey(i)).setEndKey(getSplitKey(i + 1)).build());</span>
+<span class="source-line-no">2484</span><span id="line-2484">      regionInfos.add(regionInfo);</span>
+<span class="source-line-no">2485</span><span id="line-2485">      MetaTableAccessor.addRegionsToMeta(connection, regionInfos, 1);</span>
+<span class="source-line-no">2486</span><span id="line-2486"></span>
+<span class="source-line-no">2487</span><span id="line-2487">      // write the serverName columns</span>
+<span class="source-line-no">2488</span><span id="line-2488">      MetaTableAccessor.updateRegionLocation(connection, regionInfo,</span>
+<span class="source-line-no">2489</span><span id="line-2489">        ServerName.valueOf("localhost", 60010, rand.nextLong()), i,</span>
+<span class="source-line-no">2490</span><span id="line-2490">        EnvironmentEdgeManager.currentTime());</span>
+<span class="source-line-no">2491</span><span id="line-2491">      return true;</span>
+<span class="source-line-no">2492</span><span id="line-2492">    }</span>
+<span class="source-line-no">2493</span><span id="line-2493">  }</span>
+<span class="source-line-no">2494</span><span id="line-2494"></span>
+<span class="source-line-no">2495</span><span id="line-2495">  static class FilteredScanTest extends TableTest {</span>
+<span class="source-line-no">2496</span><span id="line-2496">    protected static final Logger LOG = LoggerFactory.getLogger(FilteredScanTest.class.getName());</span>
+<span class="source-line-no">2497</span><span id="line-2497"></span>
+<span class="source-line-no">2498</span><span id="line-2498">    FilteredScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2499</span><span id="line-2499">      super(con, options, status);</span>
+<span class="source-line-no">2500</span><span id="line-2500">      if (opts.perClientRunRows == DEFAULT_ROWS_PER_GB) {</span>
+<span class="source-line-no">2501</span><span id="line-2501">        LOG.warn("Option \"rows\" unspecified. Using default value " + DEFAULT_ROWS_PER_GB</span>
+<span class="source-line-no">2502</span><span id="line-2502">          + ". This could take a very long time.");</span>
+<span class="source-line-no">2503</span><span id="line-2503">      }</span>
+<span class="source-line-no">2504</span><span id="line-2504">    }</span>
+<span class="source-line-no">2505</span><span id="line-2505"></span>
+<span class="source-line-no">2506</span><span id="line-2506">    @Override</span>
+<span class="source-line-no">2507</span><span id="line-2507">    boolean testRow(int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2508</span><span id="line-2508">      byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
+<span class="source-line-no">2509</span><span id="line-2509">      Scan scan = constructScan(value);</span>
+<span class="source-line-no">2510</span><span id="line-2510">      ResultScanner scanner = null;</span>
+<span class="source-line-no">2511</span><span id="line-2511">      try {</span>
+<span class="source-line-no">2512</span><span id="line-2512">        scanner = this.table.getScanner(scan);</span>
+<span class="source-line-no">2513</span><span id="line-2513">        for (Result r = null; (r = scanner.next()) != null;) {</span>
+<span class="source-line-no">2514</span><span id="line-2514">          updateValueSize(r);</span>
+<span class="source-line-no">2515</span><span id="line-2515">        }</span>
+<span class="source-line-no">2516</span><span id="line-2516">      } finally {</span>
+<span class="source-line-no">2517</span><span id="line-2517">        if (scanner != null) {</span>
+<span class="source-line-no">2518</span><span id="line-2518">          updateScanMetrics(scanner.getScanMetrics());</span>
+<span class="source-line-no">2519</span><span id="line-2519">          scanner.close();</span>
+<span class="source-line-no">2520</span><span id="line-2520">        }</span>
+<span class="source-line-no">2521</span><span id="line-2521">      }</span>
+<span class="source-line-no">2522</span><span id="line-2522">      return true;</span>
+<span class="source-line-no">2523</span><span id="line-2523">    }</span>
+<span class="source-line-no">2524</span><span id="line-2524"></span>
+<span class="source-line-no">2525</span><span id="line-2525">    protected Scan constructScan(byte[] valuePrefix) throws IOException {</span>
+<span class="source-line-no">2526</span><span id="line-2526">      FilterList list = new FilterList();</span>
+<span class="source-line-no">2527</span><span id="line-2527">      Filter filter = new SingleColumnValueFilter(FAMILY_ZERO, COLUMN_ZERO, CompareOperator.EQUAL,</span>
+<span class="source-line-no">2528</span><span id="line-2528">        new BinaryComparator(valuePrefix));</span>
+<span class="source-line-no">2529</span><span id="line-2529">      list.addFilter(filter);</span>
+<span class="source-line-no">2530</span><span id="line-2530">      if (opts.filterAll) {</span>
+<span class="source-line-no">2531</span><span id="line-2531">        list.addFilter(new FilterAllFilter());</span>
+<span class="source-line-no">2532</span><span id="line-2532">      }</span>
+<span class="source-line-no">2533</span><span id="line-2533">      Scan scan = new Scan().setCaching(opts.caching).setCacheBlocks(opts.cacheBlocks)</span>
+<span class="source-line-no">2534</span><span id="line-2534">        .setAsyncPrefetch(opts.asyncPrefetch).setReadType(opts.scanReadType)</span>
+<span class="source-line-no">2535</span><span id="line-2535">        .setScanMetricsEnabled(true);</span>
+<span class="source-line-no">2536</span><span id="line-2536">      if (opts.addColumns) {</span>
+<span class="source-line-no">2537</span><span id="line-2537">        for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2538</span><span id="line-2538">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2539</span><span id="line-2539">          scan.addColumn(FAMILY_ZERO, qualifier);</span>
+<span class="source-line-no">2540</span><span id="line-2540">        }</span>
+<span class="source-line-no">2541</span><span id="line-2541">      } else {</span>
+<span class="source-line-no">2542</span><span id="line-2542">        scan.addFamily(FAMILY_ZERO);</span>
+<span class="source-line-no">2543</span><span id="line-2543">      }</span>
+<span class="source-line-no">2544</span><span id="line-2544">      scan.setFilter(list);</span>
+<span class="source-line-no">2545</span><span id="line-2545">      return scan;</span>
+<span class="source-line-no">2546</span><span id="line-2546">    }</span>
+<span class="source-line-no">2547</span><span id="line-2547">  }</span>
+<span class="source-line-no">2548</span><span id="line-2548"></span>
+<span class="source-line-no">2549</span><span id="line-2549">  /**</span>
+<span class="source-line-no">2550</span><span id="line-2550">   * Compute a throughput rate in MB/s.</span>
+<span class="source-line-no">2551</span><span id="line-2551">   * @param rows   Number of records consumed.</span>
+<span class="source-line-no">2552</span><span id="line-2552">   * @param timeMs Time taken in milliseconds.</span>
+<span class="source-line-no">2553</span><span id="line-2553">   * @return String value with label, ie '123.76 MB/s'</span>
+<span class="source-line-no">2554</span><span id="line-2554">   */</span>
+<span class="source-line-no">2555</span><span id="line-2555">  private static String calculateMbps(int rows, long timeMs, final int valueSize, int families,</span>
+<span class="source-line-no">2556</span><span id="line-2556">    int columns) {</span>
+<span class="source-line-no">2557</span><span id="line-2557">    BigDecimal rowSize = BigDecimal.valueOf(ROW_LENGTH</span>
+<span class="source-line-no">2558</span><span id="line-2558">      + ((valueSize + (FAMILY_NAME_BASE.length() + 1) + COLUMN_ZERO.length) * columns) * families);</span>
+<span class="source-line-no">2559</span><span id="line-2559">    BigDecimal mbps = BigDecimal.valueOf(rows).multiply(rowSize, CXT)</span>
+<span class="source-line-no">2560</span><span id="line-2560">      .divide(BigDecimal.valueOf(timeMs), CXT).multiply(MS_PER_SEC, CXT).divide(BYTES_PER_MB, CXT);</span>
+<span class="source-line-no">2561</span><span id="line-2561">    return FMT.format(mbps) + " MB/s";</span>
+<span class="source-line-no">2562</span><span id="line-2562">  }</span>
+<span class="source-line-no">2563</span><span id="line-2563"></span>
+<span class="source-line-no">2564</span><span id="line-2564">  /*</span>
+<span class="source-line-no">2565</span><span id="line-2565">   * Format passed integer.</span>
+<span class="source-line-no">2566</span><span id="line-2566">   * @return Returns zero-prefixed ROW_LENGTH-byte wide decimal version of passed number (Does</span>
+<span class="source-line-no">2567</span><span id="line-2567">   * absolute in case number is negative).</span>
+<span class="source-line-no">2568</span><span id="line-2568">   */</span>
+<span class="source-line-no">2569</span><span id="line-2569">  public static byte[] format(final int number) {</span>
+<span class="source-line-no">2570</span><span id="line-2570">    byte[] b = new byte[ROW_LENGTH];</span>
+<span class="source-line-no">2571</span><span id="line-2571">    int d = Math.abs(number);</span>
+<span class="source-line-no">2572</span><span id="line-2572">    for (int i = b.length - 1; i &gt;= 0; i--) {</span>
+<span class="source-line-no">2573</span><span id="line-2573">      b[i] = (byte) ((d % 10) + '0');</span>
+<span class="source-line-no">2574</span><span id="line-2574">      d /= 10;</span>
+<span class="source-line-no">2575</span><span id="line-2575">    }</span>
+<span class="source-line-no">2576</span><span id="line-2576">    return b;</span>
+<span class="source-line-no">2577</span><span id="line-2577">  }</span>
+<span class="source-line-no">2578</span><span id="line-2578"></span>
+<span class="source-line-no">2579</span><span id="line-2579">  /*</span>
+<span class="source-line-no">2580</span><span id="line-2580">   * This method takes some time and is done inline uploading data. For example, doing the mapfile</span>
+<span class="source-line-no">2581</span><span id="line-2581">   * test, generation of the key and value consumes about 30% of CPU time.</span>
+<span class="source-line-no">2582</span><span id="line-2582">   * @return Generated random value to insert into a table cell.</span>
+<span class="source-line-no">2583</span><span id="line-2583">   */</span>
+<span class="source-line-no">2584</span><span id="line-2584">  public static byte[] generateData(final Random r, int length) {</span>
+<span class="source-line-no">2585</span><span id="line-2585">    byte[] b = new byte[length];</span>
+<span class="source-line-no">2586</span><span id="line-2586">    int i;</span>
+<span class="source-line-no">2587</span><span id="line-2587"></span>
+<span class="source-line-no">2588</span><span id="line-2588">    for (i = 0; i &lt; (length - 8); i += 8) {</span>
+<span class="source-line-no">2589</span><span id="line-2589">      b[i] = (byte) (65 + r.nextInt(26));</span>
+<span class="source-line-no">2590</span><span id="line-2590">      b[i + 1] = b[i];</span>
+<span class="source-line-no">2591</span><span id="line-2591">      b[i + 2] = b[i];</span>
+<span class="source-line-no">2592</span><span id="line-2592">      b[i + 3] = b[i];</span>
+<span class="source-line-no">2593</span><span id="line-2593">      b[i + 4] = b[i];</span>
+<span class="source-line-no">2594</span><span id="line-2594">      b[i + 5] = b[i];</span>
+<span class="source-line-no">2595</span><span id="line-2595">      b[i + 6] = b[i];</span>
+<span class="source-line-no">2596</span><span id="line-2596">      b[i + 7] = b[i];</span>
+<span class="source-line-no">2597</span><span id="line-2597">    }</span>
+<span class="source-line-no">2598</span><span id="line-2598"></span>
+<span class="source-line-no">2599</span><span id="line-2599">    byte a = (byte) (65 + r.nextInt(26));</span>
+<span class="source-line-no">2600</span><span id="line-2600">    for (; i &lt; length; i++) {</span>
+<span class="source-line-no">2601</span><span id="line-2601">      b[i] = a;</span>
+<span class="source-line-no">2602</span><span id="line-2602">    }</span>
+<span class="source-line-no">2603</span><span id="line-2603">    return b;</span>
+<span class="source-line-no">2604</span><span id="line-2604">  }</span>
+<span class="source-line-no">2605</span><span id="line-2605"></span>
+<span class="source-line-no">2606</span><span id="line-2606">  static byte[] getRandomRow(final Random random, final int totalRows) {</span>
+<span class="source-line-no">2607</span><span id="line-2607">    return format(generateRandomRow(random, totalRows));</span>
+<span class="source-line-no">2608</span><span id="line-2608">  }</span>
+<span class="source-line-no">2609</span><span id="line-2609"></span>
+<span class="source-line-no">2610</span><span id="line-2610">  static int generateRandomRow(final Random random, final int totalRows) {</span>
+<span class="source-line-no">2611</span><span id="line-2611">    return random.nextInt(Integer.MAX_VALUE) % totalRows;</span>
+<span class="source-line-no">2612</span><span id="line-2612">  }</span>
+<span class="source-line-no">2613</span><span id="line-2613"></span>
+<span class="source-line-no">2614</span><span id="line-2614">  static RunResult runOneClient(final Class&lt;? extends TestBase&gt; cmd, Configuration conf,</span>
+<span class="source-line-no">2615</span><span id="line-2615">    Connection con, AsyncConnection asyncCon, TestOptions opts, final Status status)</span>
+<span class="source-line-no">2616</span><span id="line-2616">    throws IOException, InterruptedException {</span>
+<span class="source-line-no">2617</span><span id="line-2617">    status.setStatus(</span>
+<span class="source-line-no">2618</span><span id="line-2618">      "Start " + cmd + " at offset " + opts.startRow + " for " + opts.perClientRunRows + " rows");</span>
+<span class="source-line-no">2619</span><span id="line-2619">    long totalElapsedTime;</span>
+<span class="source-line-no">2620</span><span id="line-2620"></span>
+<span class="source-line-no">2621</span><span id="line-2621">    final TestBase t;</span>
+<span class="source-line-no">2622</span><span id="line-2622">    try {</span>
+<span class="source-line-no">2623</span><span id="line-2623">      if (AsyncTest.class.isAssignableFrom(cmd)) {</span>
+<span class="source-line-no">2624</span><span id="line-2624">        Class&lt;? extends AsyncTest&gt; newCmd = (Class&lt;? extends AsyncTest&gt;) cmd;</span>
+<span class="source-line-no">2625</span><span id="line-2625">        Constructor&lt;? extends AsyncTest&gt; constructor =</span>
+<span class="source-line-no">2626</span><span id="line-2626">          newCmd.getDeclaredConstructor(AsyncConnection.class, TestOptions.class, Status.class);</span>
+<span class="source-line-no">2627</span><span id="line-2627">        t = constructor.newInstance(asyncCon, opts, status);</span>
+<span class="source-line-no">2628</span><span id="line-2628">      } else {</span>
+<span class="source-line-no">2629</span><span id="line-2629">        Class&lt;? extends Test&gt; newCmd = (Class&lt;? extends Test&gt;) cmd;</span>
+<span class="source-line-no">2630</span><span id="line-2630">        Constructor&lt;? extends Test&gt; constructor =</span>
+<span class="source-line-no">2631</span><span id="line-2631">          newCmd.getDeclaredConstructor(Connection.class, TestOptions.class, Status.class);</span>
+<span class="source-line-no">2632</span><span id="line-2632">        t = constructor.newInstance(con, opts, status);</span>
+<span class="source-line-no">2633</span><span id="line-2633">      }</span>
+<span class="source-line-no">2634</span><span id="line-2634">    } catch (NoSuchMethodException e) {</span>
+<span class="source-line-no">2635</span><span id="line-2635">      throw new IllegalArgumentException("Invalid command class: " + cmd.getName()</span>
+<span class="source-line-no">2636</span><span id="line-2636">        + ".  It does not provide a constructor as described by "</span>
+<span class="source-line-no">2637</span><span id="line-2637">        + "the javadoc comment.  Available constructors are: "</span>
+<span class="source-line-no">2638</span><span id="line-2638">        + Arrays.toString(cmd.getConstructors()));</span>
+<span class="source-line-no">2639</span><span id="line-2639">    } catch (Exception e) {</span>
+<span class="source-line-no">2640</span><span id="line-2640">      throw new IllegalStateException("Failed to construct command class", e);</span>
+<span class="source-line-no">2641</span><span id="line-2641">    }</span>
+<span class="source-line-no">2642</span><span id="line-2642">    totalElapsedTime = t.test();</span>
+<span class="source-line-no">2643</span><span id="line-2643"></span>
+<span class="source-line-no">2644</span><span id="line-2644">    status.setStatus("Finished " + cmd + " in " + totalElapsedTime + "ms at offset " + opts.startRow</span>
+<span class="source-line-no">2645</span><span id="line-2645">      + " for " + opts.perClientRunRows + " rows" + " ("</span>
+<span class="source-line-no">2646</span><span id="line-2646">      + calculateMbps((int) (opts.perClientRunRows * opts.sampleRate), totalElapsedTime,</span>
+<span class="source-line-no">2647</span><span id="line-2647">        getAverageValueLength(opts), opts.families, opts.columns)</span>
+<span class="source-line-no">2648</span><span id="line-2648">      + ")");</span>
+<span class="source-line-no">2649</span><span id="line-2649"></span>
+<span class="source-line-no">2650</span><span id="line-2650">    return new RunResult(totalElapsedTime, t.numOfReplyOverLatencyThreshold,</span>
+<span class="source-line-no">2651</span><span id="line-2651">      t.numOfReplyFromReplica, t.getLatencyHistogram());</span>
+<span class="source-line-no">2652</span><span id="line-2652">  }</span>
+<span class="source-line-no">2653</span><span id="line-2653"></span>
+<span class="source-line-no">2654</span><span id="line-2654">  private static int getAverageValueLength(final TestOptions opts) {</span>
+<span class="source-line-no">2655</span><span id="line-2655">    return opts.valueRandom ? opts.valueSize / 2 : opts.valueSize;</span>
+<span class="source-line-no">2656</span><span id="line-2656">  }</span>
+<span class="source-line-no">2657</span><span id="line-2657"></span>
+<span class="source-line-no">2658</span><span id="line-2658">  private void runTest(final Class&lt;? extends TestBase&gt; cmd, TestOptions opts)</span>
+<span class="source-line-no">2659</span><span id="line-2659">    throws IOException, InterruptedException, ClassNotFoundException, ExecutionException {</span>
+<span class="source-line-no">2660</span><span id="line-2660">    // Log the configuration we're going to run with. Uses JSON mapper because lazy. It'll do</span>
+<span class="source-line-no">2661</span><span id="line-2661">    // the TestOptions introspection for us and dump the output in a readable format.</span>
+<span class="source-line-no">2662</span><span id="line-2662">    LOG.info(cmd.getSimpleName() + " test run options=" + GSON.toJson(opts));</span>
+<span class="source-line-no">2663</span><span id="line-2663">    Admin admin = null;</span>
+<span class="source-line-no">2664</span><span id="line-2664">    Connection connection = null;</span>
+<span class="source-line-no">2665</span><span id="line-2665">    try {</span>
+<span class="source-line-no">2666</span><span id="line-2666">      connection = ConnectionFactory.createConnection(getConf());</span>
+<span class="source-line-no">2667</span><span id="line-2667">      admin = connection.getAdmin();</span>
+<span class="source-line-no">2668</span><span id="line-2668">      checkTable(admin, opts);</span>
+<span class="source-line-no">2669</span><span id="line-2669">    } finally {</span>
+<span class="source-line-no">2670</span><span id="line-2670">      if (admin != null) admin.close();</span>
+<span class="source-line-no">2671</span><span id="line-2671">      if (connection != null) connection.close();</span>
+<span class="source-line-no">2672</span><span id="line-2672">    }</span>
+<span class="source-line-no">2673</span><span id="line-2673">    if (opts.nomapred) {</span>
+<span class="source-line-no">2674</span><span id="line-2674">      doLocalClients(opts, getConf());</span>
+<span class="source-line-no">2675</span><span id="line-2675">    } else {</span>
+<span class="source-line-no">2676</span><span id="line-2676">      doMapReduce(opts, getConf());</span>
+<span class="source-line-no">2677</span><span id="line-2677">    }</span>
+<span class="source-line-no">2678</span><span id="line-2678">  }</span>
+<span class="source-line-no">2679</span><span id="line-2679"></span>
+<span class="source-line-no">2680</span><span id="line-2680">  protected void printUsage() {</span>
+<span class="source-line-no">2681</span><span id="line-2681">    printUsage(PE_COMMAND_SHORTNAME, null);</span>
+<span class="source-line-no">2682</span><span id="line-2682">  }</span>
+<span class="source-line-no">2683</span><span id="line-2683"></span>
+<span class="source-line-no">2684</span><span id="line-2684">  protected static void printUsage(final String message) {</span>
+<span class="source-line-no">2685</span><span id="line-2685">    printUsage(PE_COMMAND_SHORTNAME, message);</span>
+<span class="source-line-no">2686</span><span id="line-2686">  }</span>
+<span class="source-line-no">2687</span><span id="line-2687"></span>
+<span class="source-line-no">2688</span><span id="line-2688">  protected static void printUsageAndExit(final String message, final int exitCode) {</span>
+<span class="source-line-no">2689</span><span id="line-2689">    printUsage(message);</span>
+<span class="source-line-no">2690</span><span id="line-2690">    System.exit(exitCode);</span>
+<span class="source-line-no">2691</span><span id="line-2691">  }</span>
+<span class="source-line-no">2692</span><span id="line-2692"></span>
+<span class="source-line-no">2693</span><span id="line-2693">  protected static void printUsage(final String shortName, final String message) {</span>
+<span class="source-line-no">2694</span><span id="line-2694">    if (message != null &amp;&amp; message.length() &gt; 0) {</span>
+<span class="source-line-no">2695</span><span id="line-2695">      System.err.println(message);</span>
+<span class="source-line-no">2696</span><span id="line-2696">    }</span>
+<span class="source-line-no">2697</span><span id="line-2697">    System.err.print("Usage: hbase " + shortName);</span>
+<span class="source-line-no">2698</span><span id="line-2698">    System.err.println("  &lt;OPTIONS&gt; [-D&lt;property=value&gt;]* &lt;command|class&gt; &lt;nclients&gt;");</span>
+<span class="source-line-no">2699</span><span id="line-2699">    System.err.println();</span>
+<span class="source-line-no">2700</span><span id="line-2700">    System.err.println("General Options:");</span>
+<span class="source-line-no">2701</span><span id="line-2701">    System.err.println(</span>
+<span class="source-line-no">2702</span><span id="line-2702">      " nomapred        Run multiple clients using threads " + "(rather than use mapreduce)");</span>
+<span class="source-line-no">2703</span><span id="line-2703">    System.err</span>
+<span class="source-line-no">2704</span><span id="line-2704">      .println(" oneCon          all the threads share the same connection. Default: False");</span>
+<span class="source-line-no">2705</span><span id="line-2705">    System.err.println(" connCount          connections all threads share. "</span>
+<span class="source-line-no">2706</span><span id="line-2706">      + "For example, if set to 2, then all thread share 2 connection. "</span>
+<span class="source-line-no">2707</span><span id="line-2707">      + "Default: depend on oneCon parameter. if oneCon set to true, then connCount=1, "</span>
+<span class="source-line-no">2708</span><span id="line-2708">      + "if not, connCount=thread number");</span>
+<span class="source-line-no">2709</span><span id="line-2709"></span>
+<span class="source-line-no">2710</span><span id="line-2710">    System.err.println(" sampleRate      Execute test on a sample of total "</span>
+<span class="source-line-no">2711</span><span id="line-2711">      + "rows. Only supported by randomRead. Default: 1.0");</span>
+<span class="source-line-no">2712</span><span id="line-2712">    System.err.println(" period          Report every 'period' rows: "</span>
+<span class="source-line-no">2713</span><span id="line-2713">      + "Default: opts.perClientRunRows / 10 = " + DEFAULT_OPTS.getPerClientRunRows() / 10);</span>
+<span class="source-line-no">2714</span><span id="line-2714">    System.err.println(" cycles          How many times to cycle the test. Defaults: 1.");</span>
 <span class="source-line-no">2715</span><span id="line-2715">    System.err.println(</span>
-<span class="source-line-no">2716</span><span id="line-2716">      " rows            Rows each client runs. Default: " + DEFAULT_OPTS.getPerClientRunRows()</span>
-<span class="source-line-no">2717</span><span id="line-2717">        + ".  In case of randomReads and randomSeekScans this could"</span>
-<span class="source-line-no">2718</span><span id="line-2718">        + " be specified along with --size to specify the number of rows to be scanned within"</span>
-<span class="source-line-no">2719</span><span id="line-2719">        + " the total range specified by the size.");</span>
-<span class="source-line-no">2720</span><span id="line-2720">    System.err.println(</span>
-<span class="source-line-no">2721</span><span id="line-2721">      " size            Total size in GiB. Mutually exclusive with --rows for writes and scans"</span>
-<span class="source-line-no">2722</span><span id="line-2722">        + ". But for randomReads and randomSeekScans when you use size with --rows you could"</span>
-<span class="source-line-no">2723</span><span id="line-2723">        + " use size to specify the end range and --rows"</span>
-<span class="source-line-no">2724</span><span id="line-2724">        + " specifies the number of rows within that range. " + "Default: 1.0.");</span>
-<span class="source-line-no">2725</span><span id="line-2725">    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");</span>
-<span class="source-line-no">2726</span><span id="line-2726">    System.err.println(" encryption      Encryption type to use (AES, ...). Default: 'NONE'");</span>
-<span class="source-line-no">2727</span><span id="line-2727">    System.err.println(</span>
-<span class="source-line-no">2728</span><span id="line-2728">      " flushCommits    Used to determine if the test should flush the table. " + "Default: false");</span>
-<span class="source-line-no">2729</span><span id="line-2729">    System.err.println(" valueZipf       Set if we should vary value size between 0 and "</span>
-<span class="source-line-no">2730</span><span id="line-2730">      + "'valueSize' in zipf form: Default: Not set.");</span>
-<span class="source-line-no">2731</span><span id="line-2731">    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");</span>
-<span class="source-line-no">2732</span><span id="line-2732">    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");</span>
-<span class="source-line-no">2733</span><span id="line-2733">    System.err.println(" multiPut        Batch puts together into groups of N. Only supported "</span>
-<span class="source-line-no">2734</span><span id="line-2734">      + "by write. If multiPut is bigger than 0, autoFlush need to set to true. Default: 0");</span>
-<span class="source-line-no">2735</span><span id="line-2735">    System.err.println(" presplit        Create presplit table. If a table with same name exists,"</span>
-<span class="source-line-no">2736</span><span id="line-2736">      + " it'll be deleted and recreated (instead of verifying count of its existing regions). "</span>
-<span class="source-line-no">2737</span><span id="line-2737">      + "Recommended for accurate perf analysis (see guide). Default: disabled");</span>
-<span class="source-line-no">2738</span><span id="line-2738">    System.err.println(</span>
-<span class="source-line-no">2739</span><span id="line-2739">      " usetags         Writes tags along with KVs. Use with HFile V3. " + "Default: false");</span>
-<span class="source-line-no">2740</span><span id="line-2740">    System.err.println(" numoftags       Specify the no of tags that would be needed. "</span>
-<span class="source-line-no">2741</span><span id="line-2741">      + "This works only if usetags is true. Default: " + DEFAULT_OPTS.noOfTags);</span>
-<span class="source-line-no">2742</span><span id="line-2742">    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");</span>
-<span class="source-line-no">2743</span><span id="line-2743">    System.err.println(" columns         Columns to write per row. Default: 1");</span>
-<span class="source-line-no">2744</span><span id="line-2744">    System.err</span>
-<span class="source-line-no">2745</span><span id="line-2745">      .println(" families        Specify number of column families for the table. Default: 1");</span>
-<span class="source-line-no">2746</span><span id="line-2746">    System.err.println();</span>
-<span class="source-line-no">2747</span><span id="line-2747">    System.err.println("Read Tests:");</span>
-<span class="source-line-no">2748</span><span id="line-2748">    System.err.println(" filterAll       Helps to filter out all the rows on the server side"</span>
-<span class="source-line-no">2749</span><span id="line-2749">      + " there by not returning any thing back to the client.  Helps to check the server side"</span>
-<span class="source-line-no">2750</span><span id="line-2750">      + " performance.  Uses FilterAllFilter internally. ");</span>
-<span class="source-line-no">2751</span><span id="line-2751">    System.err.println(" multiGet        Batch gets together into groups of N. Only supported "</span>
-<span class="source-line-no">2752</span><span id="line-2752">      + "by randomRead. Default: disabled");</span>
-<span class="source-line-no">2753</span><span id="line-2753">    System.err.println(" inmemory        Tries to keep the HFiles of the CF "</span>
-<span class="source-line-no">2754</span><span id="line-2754">      + "inmemory as far as possible. Not guaranteed that reads are always served "</span>
-<span class="source-line-no">2755</span><span id="line-2755">      + "from memory.  Default: false");</span>
-<span class="source-line-no">2756</span><span id="line-2756">    System.err</span>
-<span class="source-line-no">2757</span><span id="line-2757">      .println(" bloomFilter     Bloom filter type, one of " + Arrays.toString(BloomType.values()));</span>
-<span class="source-line-no">2758</span><span id="line-2758">    System.err.println(" blockSize       Blocksize to use when writing out hfiles. ");</span>
-<span class="source-line-no">2759</span><span id="line-2759">    System.err</span>
-<span class="source-line-no">2760</span><span id="line-2760">      .println(" inmemoryCompaction  Makes the column family to do inmemory flushes/compactions. "</span>
-<span class="source-line-no">2761</span><span id="line-2761">        + "Uses the CompactingMemstore");</span>
-<span class="source-line-no">2762</span><span id="line-2762">    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");</span>
-<span class="source-line-no">2763</span><span id="line-2763">    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");</span>
-<span class="source-line-no">2764</span><span id="line-2764">    System.err.println(</span>
-<span class="source-line-no">2765</span><span id="line-2765">      " randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");</span>
-<span class="source-line-no">2766</span><span id="line-2766">    System.err.println(" caching         Scan caching to use. Default: 30");</span>
-<span class="source-line-no">2767</span><span id="line-2767">    System.err.println(" asyncPrefetch   Enable asyncPrefetch for scan");</span>
-<span class="source-line-no">2768</span><span id="line-2768">    System.err.println(" cacheBlocks     Set the cacheBlocks option for scan. Default: true");</span>
-<span class="source-line-no">2769</span><span id="line-2769">    System.err.println(</span>
-<span class="source-line-no">2770</span><span id="line-2770">      " scanReadType    Set the readType option for scan, stream/pread/default. Default: default");</span>
-<span class="source-line-no">2771</span><span id="line-2771">    System.err.println(" bufferSize      Set the value of client side buffering. Default: 2MB");</span>
-<span class="source-line-no">2772</span><span id="line-2772">    System.err.println();</span>
-<span class="source-line-no">2773</span><span id="line-2773">    System.err.println(" Note: -D properties will be applied to the conf used. ");</span>
-<span class="source-line-no">2774</span><span id="line-2774">    System.err.println("  For example: ");</span>
-<span class="source-line-no">2775</span><span id="line-2775">    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");</span>
-<span class="source-line-no">2776</span><span id="line-2776">    System.err.println("   -Dmapreduce.task.timeout=60000");</span>
-<span class="source-line-no">2777</span><span id="line-2777">    System.err.println();</span>
-<span class="source-line-no">2778</span><span id="line-2778">    System.err.println("Command:");</span>
-<span class="source-line-no">2779</span><span id="line-2779">    for (CmdDescriptor command : COMMANDS.values()) {</span>
-<span class="source-line-no">2780</span><span id="line-2780">      System.err.println(String.format(" %-20s %s", command.getName(), command.getDescription()));</span>
-<span class="source-line-no">2781</span><span id="line-2781">    }</span>
-<span class="source-line-no">2782</span><span id="line-2782">    System.err.println();</span>
-<span class="source-line-no">2783</span><span id="line-2783">    System.err.println("Class:");</span>
-<span class="source-line-no">2784</span><span id="line-2784">    System.err.println("To run any custom implementation of PerformanceEvaluation.Test, "</span>
-<span class="source-line-no">2785</span><span id="line-2785">      + "provide the classname of the implementaion class in place of "</span>
-<span class="source-line-no">2786</span><span id="line-2786">      + "command name and it will be loaded at runtime from classpath.:");</span>
-<span class="source-line-no">2787</span><span id="line-2787">    System.err.println("Please consider to contribute back "</span>
-<span class="source-line-no">2788</span><span id="line-2788">      + "this custom test impl into a builtin PE command for the benefit of the community");</span>
-<span class="source-line-no">2789</span><span id="line-2789">    System.err.println();</span>
-<span class="source-line-no">2790</span><span id="line-2790">    System.err.println("Args:");</span>
-<span class="source-line-no">2791</span><span id="line-2791">    System.err.println(" nclients        Integer. Required. Total number of clients "</span>
-<span class="source-line-no">2792</span><span id="line-2792">      + "(and HRegionServers) running. 1 &lt;= value &lt;= 500");</span>
-<span class="source-line-no">2793</span><span id="line-2793">    System.err.println("Examples:");</span>
-<span class="source-line-no">2794</span><span id="line-2794">    System.err.println(" To run a single client doing the default 1M sequentialWrites:");</span>
-<span class="source-line-no">2795</span><span id="line-2795">    System.err.println(" $ hbase " + shortName + " sequentialWrite 1");</span>
-<span class="source-line-no">2796</span><span id="line-2796">    System.err.println(" To run 10 clients doing increments over ten rows:");</span>
-<span class="source-line-no">2797</span><span id="line-2797">    System.err.println(" $ hbase " + shortName + " --rows=10 --nomapred increment 10");</span>
-<span class="source-line-no">2798</span><span id="line-2798">  }</span>
-<span class="source-line-no">2799</span><span id="line-2799"></span>
-<span class="source-line-no">2800</span><span id="line-2800">  /**</span>
-<span class="source-line-no">2801</span><span id="line-2801">   * Parse options passed in via an arguments array. Assumes that array has been split on</span>
-<span class="source-line-no">2802</span><span id="line-2802">   * white-space and placed into a {@code Queue}. Any unknown arguments will remain in the queue at</span>
-<span class="source-line-no">2803</span><span id="line-2803">   * the conclusion of this method call. It's up to the caller to deal with these unrecognized</span>
-<span class="source-line-no">2804</span><span id="line-2804">   * arguments.</span>
-<span class="source-line-no">2805</span><span id="line-2805">   */</span>
-<span class="source-line-no">2806</span><span id="line-2806">  static TestOptions parseOpts(Queue&lt;String&gt; args) {</span>
-<span class="source-line-no">2807</span><span id="line-2807">    TestOptions opts = new TestOptions();</span>
-<span class="source-line-no">2808</span><span id="line-2808"></span>
-<span class="source-line-no">2809</span><span id="line-2809">    String cmd = null;</span>
-<span class="source-line-no">2810</span><span id="line-2810">    while ((cmd = args.poll()) != null) {</span>
-<span class="source-line-no">2811</span><span id="line-2811">      if (cmd.equals("-h") || cmd.startsWith("--h")) {</span>
-<span class="source-line-no">2812</span><span id="line-2812">        // place item back onto queue so that caller knows parsing was incomplete</span>
-<span class="source-line-no">2813</span><span id="line-2813">        args.add(cmd);</span>
-<span class="source-line-no">2814</span><span id="line-2814">        break;</span>
-<span class="source-line-no">2815</span><span id="line-2815">      }</span>
-<span class="source-line-no">2816</span><span id="line-2816"></span>
-<span class="source-line-no">2817</span><span id="line-2817">      final String nmr = "--nomapred";</span>
-<span class="source-line-no">2818</span><span id="line-2818">      if (cmd.startsWith(nmr)) {</span>
-<span class="source-line-no">2819</span><span id="line-2819">        opts.nomapred = true;</span>
-<span class="source-line-no">2820</span><span id="line-2820">        continue;</span>
-<span class="source-line-no">2821</span><span id="line-2821">      }</span>
-<span class="source-line-no">2822</span><span id="line-2822"></span>
-<span class="source-line-no">2823</span><span id="line-2823">      final String rows = "--rows=";</span>
-<span class="source-line-no">2824</span><span id="line-2824">      if (cmd.startsWith(rows)) {</span>
-<span class="source-line-no">2825</span><span id="line-2825">        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));</span>
-<span class="source-line-no">2826</span><span id="line-2826">        continue;</span>
-<span class="source-line-no">2827</span><span id="line-2827">      }</span>
-<span class="source-line-no">2828</span><span id="line-2828"></span>
-<span class="source-line-no">2829</span><span id="line-2829">      final String cycles = "--cycles=";</span>
-<span class="source-line-no">2830</span><span id="line-2830">      if (cmd.startsWith(cycles)) {</span>
-<span class="source-line-no">2831</span><span id="line-2831">        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));</span>
-<span class="source-line-no">2832</span><span id="line-2832">        continue;</span>
-<span class="source-line-no">2833</span><span id="line-2833">      }</span>
-<span class="source-line-no">2834</span><span id="line-2834"></span>
-<span class="source-line-no">2835</span><span id="line-2835">      final String sampleRate = "--sampleRate=";</span>
-<span class="source-line-no">2836</span><span id="line-2836">      if (cmd.startsWith(sampleRate)) {</span>
-<span class="source-line-no">2837</span><span id="line-2837">        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));</span>
-<span class="source-line-no">2838</span><span id="line-2838">        continue;</span>
-<span class="source-line-no">2839</span><span id="line-2839">      }</span>
-<span class="source-line-no">2840</span><span id="line-2840"></span>
-<span class="source-line-no">2841</span><span id="line-2841">      final String table = "--table=";</span>
-<span class="source-line-no">2842</span><span id="line-2842">      if (cmd.startsWith(table)) {</span>
-<span class="source-line-no">2843</span><span id="line-2843">        opts.tableName = cmd.substring(table.length());</span>
-<span class="source-line-no">2844</span><span id="line-2844">        continue;</span>
-<span class="source-line-no">2845</span><span id="line-2845">      }</span>
-<span class="source-line-no">2846</span><span id="line-2846"></span>
-<span class="source-line-no">2847</span><span id="line-2847">      final String startRow = "--startRow=";</span>
-<span class="source-line-no">2848</span><span id="line-2848">      if (cmd.startsWith(startRow)) {</span>
-<span class="source-line-no">2849</span><span id="line-2849">        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));</span>
-<span class="source-line-no">2850</span><span id="line-2850">        continue;</span>
-<span class="source-line-no">2851</span><span id="line-2851">      }</span>
-<span class="source-line-no">2852</span><span id="line-2852"></span>
-<span class="source-line-no">2853</span><span id="line-2853">      final String compress = "--compress=";</span>
-<span class="source-line-no">2854</span><span id="line-2854">      if (cmd.startsWith(compress)) {</span>
-<span class="source-line-no">2855</span><span id="line-2855">        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));</span>
-<span class="source-line-no">2856</span><span id="line-2856">        continue;</span>
-<span class="source-line-no">2857</span><span id="line-2857">      }</span>
-<span class="source-line-no">2858</span><span id="line-2858"></span>
-<span class="source-line-no">2859</span><span id="line-2859">      final String encryption = "--encryption=";</span>
-<span class="source-line-no">2860</span><span id="line-2860">      if (cmd.startsWith(encryption)) {</span>
-<span class="source-line-no">2861</span><span id="line-2861">        opts.encryption = cmd.substring(encryption.length());</span>
-<span class="source-line-no">2862</span><span id="line-2862">        continue;</span>
-<span class="source-line-no">2863</span><span id="line-2863">      }</span>
-<span class="source-line-no">2864</span><span id="line-2864"></span>
-<span class="source-line-no">2865</span><span id="line-2865">      final String traceRate = "--traceRate=";</span>
-<span class="source-line-no">2866</span><span id="line-2866">      if (cmd.startsWith(traceRate)) {</span>
-<span class="source-line-no">2867</span><span id="line-2867">        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));</span>
-<span class="source-line-no">2868</span><span id="line-2868">        continue;</span>
-<span class="source-line-no">2869</span><span id="line-2869">      }</span>
-<span class="source-line-no">2870</span><span id="line-2870"></span>
-<span class="source-line-no">2871</span><span id="line-2871">      final String blockEncoding = "--blockEncoding=";</span>
-<span class="source-line-no">2872</span><span id="line-2872">      if (cmd.startsWith(blockEncoding)) {</span>
-<span class="source-line-no">2873</span><span id="line-2873">        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));</span>
-<span class="source-line-no">2874</span><span id="line-2874">        continue;</span>
-<span class="source-line-no">2875</span><span id="line-2875">      }</span>
-<span class="source-line-no">2876</span><span id="line-2876"></span>
-<span class="source-line-no">2877</span><span id="line-2877">      final String flushCommits = "--flushCommits=";</span>
-<span class="source-line-no">2878</span><span id="line-2878">      if (cmd.startsWith(flushCommits)) {</span>
-<span class="source-line-no">2879</span><span id="line-2879">        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));</span>
-<span class="source-line-no">2880</span><span id="line-2880">        continue;</span>
-<span class="source-line-no">2881</span><span id="line-2881">      }</span>
-<span class="source-line-no">2882</span><span id="line-2882"></span>
-<span class="source-line-no">2883</span><span id="line-2883">      final String writeToWAL = "--writeToWAL=";</span>
-<span class="source-line-no">2884</span><span id="line-2884">      if (cmd.startsWith(writeToWAL)) {</span>
-<span class="source-line-no">2885</span><span id="line-2885">        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));</span>
-<span class="source-line-no">2886</span><span id="line-2886">        continue;</span>
-<span class="source-line-no">2887</span><span id="line-2887">      }</span>
-<span class="source-line-no">2888</span><span id="line-2888"></span>
-<span class="source-line-no">2889</span><span id="line-2889">      final String presplit = "--presplit=";</span>
-<span class="source-line-no">2890</span><span id="line-2890">      if (cmd.startsWith(presplit)) {</span>
-<span class="source-line-no">2891</span><span id="line-2891">        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));</span>
-<span class="source-line-no">2892</span><span id="line-2892">        continue;</span>
-<span class="source-line-no">2893</span><span id="line-2893">      }</span>
-<span class="source-line-no">2894</span><span id="line-2894"></span>
-<span class="source-line-no">2895</span><span id="line-2895">      final String inMemory = "--inmemory=";</span>
-<span class="source-line-no">2896</span><span id="line-2896">      if (cmd.startsWith(inMemory)) {</span>
-<span class="source-line-no">2897</span><span id="line-2897">        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));</span>
-<span class="source-line-no">2898</span><span id="line-2898">        continue;</span>
-<span class="source-line-no">2899</span><span id="line-2899">      }</span>
-<span class="source-line-no">2900</span><span id="line-2900"></span>
-<span class="source-line-no">2901</span><span id="line-2901">      final String autoFlush = "--autoFlush=";</span>
-<span class="source-line-no">2902</span><span id="line-2902">      if (cmd.startsWith(autoFlush)) {</span>
-<span class="source-line-no">2903</span><span id="line-2903">        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));</span>
-<span class="source-line-no">2904</span><span id="line-2904">        continue;</span>
-<span class="source-line-no">2905</span><span id="line-2905">      }</span>
-<span class="source-line-no">2906</span><span id="line-2906"></span>
-<span class="source-line-no">2907</span><span id="line-2907">      final String onceCon = "--oneCon=";</span>
-<span class="source-line-no">2908</span><span id="line-2908">      if (cmd.startsWith(onceCon)) {</span>
-<span class="source-line-no">2909</span><span id="line-2909">        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));</span>
-<span class="source-line-no">2910</span><span id="line-2910">        continue;</span>
-<span class="source-line-no">2911</span><span id="line-2911">      }</span>
-<span class="source-line-no">2912</span><span id="line-2912"></span>
-<span class="source-line-no">2913</span><span id="line-2913">      final String connCount = "--connCount=";</span>
-<span class="source-line-no">2914</span><span id="line-2914">      if (cmd.startsWith(connCount)) {</span>
-<span class="source-line-no">2915</span><span id="line-2915">        opts.connCount = Integer.parseInt(cmd.substring(connCount.length()));</span>
-<span class="source-line-no">2916</span><span id="line-2916">        continue;</span>
-<span class="source-line-no">2917</span><span id="line-2917">      }</span>
-<span class="source-line-no">2918</span><span id="line-2918"></span>
-<span class="source-line-no">2919</span><span id="line-2919">      final String latencyThreshold = "--latencyThreshold=";</span>
-<span class="source-line-no">2920</span><span id="line-2920">      if (cmd.startsWith(latencyThreshold)) {</span>
-<span class="source-line-no">2921</span><span id="line-2921">        opts.latencyThreshold = Integer.parseInt(cmd.substring(latencyThreshold.length()));</span>
-<span class="source-line-no">2922</span><span id="line-2922">        continue;</span>
-<span class="source-line-no">2923</span><span id="line-2923">      }</span>
-<span class="source-line-no">2924</span><span id="line-2924"></span>
-<span class="source-line-no">2925</span><span id="line-2925">      final String latency = "--latency";</span>
-<span class="source-line-no">2926</span><span id="line-2926">      if (cmd.startsWith(latency)) {</span>
-<span class="source-line-no">2927</span><span id="line-2927">        opts.reportLatency = true;</span>
-<span class="source-line-no">2928</span><span id="line-2928">        continue;</span>
-<span class="source-line-no">2929</span><span id="line-2929">      }</span>
-<span class="source-line-no">2930</span><span id="line-2930"></span>
-<span class="source-line-no">2931</span><span id="line-2931">      final String multiGet = "--multiGet=";</span>
-<span class="source-line-no">2932</span><span id="line-2932">      if (cmd.startsWith(multiGet)) {</span>
-<span class="source-line-no">2933</span><span id="line-2933">        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));</span>
-<span class="source-line-no">2934</span><span id="line-2934">        continue;</span>
-<span class="source-line-no">2935</span><span id="line-2935">      }</span>
-<span class="source-line-no">2936</span><span id="line-2936"></span>
-<span class="source-line-no">2937</span><span id="line-2937">      final String multiPut = "--multiPut=";</span>
-<span class="source-line-no">2938</span><span id="line-2938">      if (cmd.startsWith(multiPut)) {</span>
-<span class="source-line-no">2939</span><span id="line-2939">        opts.multiPut = Integer.parseInt(cmd.substring(multiPut.length()));</span>
-<span class="source-line-no">2940</span><span id="line-2940">        continue;</span>
-<span class="source-line-no">2941</span><span id="line-2941">      }</span>
-<span class="source-line-no">2942</span><span id="line-2942"></span>
-<span class="source-line-no">2943</span><span id="line-2943">      final String useTags = "--usetags=";</span>
-<span class="source-line-no">2944</span><span id="line-2944">      if (cmd.startsWith(useTags)) {</span>
-<span class="source-line-no">2945</span><span id="line-2945">        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));</span>
-<span class="source-line-no">2946</span><span id="line-2946">        continue;</span>
-<span class="source-line-no">2947</span><span id="line-2947">      }</span>
-<span class="source-line-no">2948</span><span id="line-2948"></span>
-<span class="source-line-no">2949</span><span id="line-2949">      final String noOfTags = "--numoftags=";</span>
-<span class="source-line-no">2950</span><span id="line-2950">      if (cmd.startsWith(noOfTags)) {</span>
-<span class="source-line-no">2951</span><span id="line-2951">        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));</span>
-<span class="source-line-no">2952</span><span id="line-2952">        continue;</span>
-<span class="source-line-no">2953</span><span id="line-2953">      }</span>
-<span class="source-line-no">2954</span><span id="line-2954"></span>
-<span class="source-line-no">2955</span><span id="line-2955">      final String replicas = "--replicas=";</span>
-<span class="source-line-no">2956</span><span id="line-2956">      if (cmd.startsWith(replicas)) {</span>
-<span class="source-line-no">2957</span><span id="line-2957">        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));</span>
-<span class="source-line-no">2958</span><span id="line-2958">        continue;</span>
-<span class="source-line-no">2959</span><span id="line-2959">      }</span>
-<span class="source-line-no">2960</span><span id="line-2960"></span>
-<span class="source-line-no">2961</span><span id="line-2961">      final String filterOutAll = "--filterAll";</span>
-<span class="source-line-no">2962</span><span id="line-2962">      if (cmd.startsWith(filterOutAll)) {</span>
-<span class="source-line-no">2963</span><span id="line-2963">        opts.filterAll = true;</span>
-<span class="source-line-no">2964</span><span id="line-2964">        continue;</span>
-<span class="source-line-no">2965</span><span id="line-2965">      }</span>
-<span class="source-line-no">2966</span><span id="line-2966"></span>
-<span class="source-line-no">2967</span><span id="line-2967">      final String size = "--size=";</span>
-<span class="source-line-no">2968</span><span id="line-2968">      if (cmd.startsWith(size)) {</span>
-<span class="source-line-no">2969</span><span id="line-2969">        opts.size = Float.parseFloat(cmd.substring(size.length()));</span>
-<span class="source-line-no">2970</span><span id="line-2970">        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");</span>
-<span class="source-line-no">2971</span><span id="line-2971">        continue;</span>
-<span class="source-line-no">2972</span><span id="line-2972">      }</span>
-<span class="source-line-no">2973</span><span id="line-2973"></span>
-<span class="source-line-no">2974</span><span id="line-2974">      final String splitPolicy = "--splitPolicy=";</span>
-<span class="source-line-no">2975</span><span id="line-2975">      if (cmd.startsWith(splitPolicy)) {</span>
-<span class="source-line-no">2976</span><span id="line-2976">        opts.splitPolicy = cmd.substring(splitPolicy.length());</span>
-<span class="source-line-no">2977</span><span id="line-2977">        continue;</span>
-<span class="source-line-no">2978</span><span id="line-2978">      }</span>
-<span class="source-line-no">2979</span><span id="line-2979"></span>
-<span class="source-line-no">2980</span><span id="line-2980">      final String randomSleep = "--randomSleep=";</span>
-<span class="source-line-no">2981</span><span id="line-2981">      if (cmd.startsWith(randomSleep)) {</span>
-<span class="source-line-no">2982</span><span id="line-2982">        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));</span>
-<span class="source-line-no">2983</span><span id="line-2983">        continue;</span>
-<span class="source-line-no">2984</span><span id="line-2984">      }</span>
-<span class="source-line-no">2985</span><span id="line-2985"></span>
-<span class="source-line-no">2986</span><span id="line-2986">      final String measureAfter = "--measureAfter=";</span>
-<span class="source-line-no">2987</span><span id="line-2987">      if (cmd.startsWith(measureAfter)) {</span>
-<span class="source-line-no">2988</span><span id="line-2988">        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));</span>
-<span class="source-line-no">2989</span><span id="line-2989">        continue;</span>
-<span class="source-line-no">2990</span><span id="line-2990">      }</span>
-<span class="source-line-no">2991</span><span id="line-2991"></span>
-<span class="source-line-no">2992</span><span id="line-2992">      final String bloomFilter = "--bloomFilter=";</span>
-<span class="source-line-no">2993</span><span id="line-2993">      if (cmd.startsWith(bloomFilter)) {</span>
-<span class="source-line-no">2994</span><span id="line-2994">        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));</span>
-<span class="source-line-no">2995</span><span id="line-2995">        continue;</span>
-<span class="source-line-no">2996</span><span id="line-2996">      }</span>
-<span class="source-line-no">2997</span><span id="line-2997"></span>
-<span class="source-line-no">2998</span><span id="line-2998">      final String blockSize = "--blockSize=";</span>
-<span class="source-line-no">2999</span><span id="line-2999">      if (cmd.startsWith(blockSize)) {</span>
-<span class="source-line-no">3000</span><span id="line-3000">        opts.blockSize = Integer.parseInt(cmd.substring(blockSize.length()));</span>
-<span class="source-line-no">3001</span><span id="line-3001">        continue;</span>
-<span class="source-line-no">3002</span><span id="line-3002">      }</span>
-<span class="source-line-no">3003</span><span id="line-3003"></span>
-<span class="source-line-no">3004</span><span id="line-3004">      final String valueSize = "--valueSize=";</span>
-<span class="source-line-no">3005</span><span id="line-3005">      if (cmd.startsWith(valueSize)) {</span>
-<span class="source-line-no">3006</span><span id="line-3006">        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));</span>
-<span class="source-line-no">3007</span><span id="line-3007">        continue;</span>
-<span class="source-line-no">3008</span><span id="line-3008">      }</span>
-<span class="source-line-no">3009</span><span id="line-3009"></span>
-<span class="source-line-no">3010</span><span id="line-3010">      final String valueRandom = "--valueRandom";</span>
-<span class="source-line-no">3011</span><span id="line-3011">      if (cmd.startsWith(valueRandom)) {</span>
-<span class="source-line-no">3012</span><span id="line-3012">        opts.valueRandom = true;</span>
-<span class="source-line-no">3013</span><span id="line-3013">        continue;</span>
-<span class="source-line-no">3014</span><span id="line-3014">      }</span>
-<span class="source-line-no">3015</span><span id="line-3015"></span>
-<span class="source-line-no">3016</span><span id="line-3016">      final String valueZipf = "--valueZipf";</span>
-<span class="source-line-no">3017</span><span id="line-3017">      if (cmd.startsWith(valueZipf)) {</span>
-<span class="source-line-no">3018</span><span id="line-3018">        opts.valueZipf = true;</span>
-<span class="source-line-no">3019</span><span id="line-3019">        continue;</span>
-<span class="source-line-no">3020</span><span id="line-3020">      }</span>
-<span class="source-line-no">3021</span><span id="line-3021"></span>
-<span class="source-line-no">3022</span><span id="line-3022">      final String period = "--period=";</span>
-<span class="source-line-no">3023</span><span id="line-3023">      if (cmd.startsWith(period)) {</span>
-<span class="source-line-no">3024</span><span id="line-3024">        opts.period = Integer.parseInt(cmd.substring(period.length()));</span>
-<span class="source-line-no">3025</span><span id="line-3025">        continue;</span>
-<span class="source-line-no">3026</span><span id="line-3026">      }</span>
-<span class="source-line-no">3027</span><span id="line-3027"></span>
-<span class="source-line-no">3028</span><span id="line-3028">      final String addColumns = "--addColumns=";</span>
-<span class="source-line-no">3029</span><span id="line-3029">      if (cmd.startsWith(addColumns)) {</span>
-<span class="source-line-no">3030</span><span id="line-3030">        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));</span>
-<span class="source-line-no">3031</span><span id="line-3031">        continue;</span>
-<span class="source-line-no">3032</span><span id="line-3032">      }</span>
-<span class="source-line-no">3033</span><span id="line-3033"></span>
-<span class="source-line-no">3034</span><span id="line-3034">      final String inMemoryCompaction = "--inmemoryCompaction=";</span>
-<span class="source-line-no">3035</span><span id="line-3035">      if (cmd.startsWith(inMemoryCompaction)) {</span>
-<span class="source-line-no">3036</span><span id="line-3036">        opts.inMemoryCompaction =</span>
-<span class="source-line-no">3037</span><span id="line-3037">          MemoryCompactionPolicy.valueOf(cmd.substring(inMemoryCompaction.length()));</span>
-<span class="source-line-no">3038</span><span id="line-3038">        continue;</span>
-<span class="source-line-no">3039</span><span id="line-3039">      }</span>
-<span class="source-line-no">3040</span><span id="line-3040"></span>
-<span class="source-line-no">3041</span><span id="line-3041">      final String columns = "--columns=";</span>
-<span class="source-line-no">3042</span><span id="line-3042">      if (cmd.startsWith(columns)) {</span>
-<span class="source-line-no">3043</span><span id="line-3043">        opts.columns = Integer.parseInt(cmd.substring(columns.length()));</span>
-<span class="source-line-no">3044</span><span id="line-3044">        continue;</span>
-<span class="source-line-no">3045</span><span id="line-3045">      }</span>
-<span class="source-line-no">3046</span><span id="line-3046"></span>
-<span class="source-line-no">3047</span><span id="line-3047">      final String families = "--families=";</span>
-<span class="source-line-no">3048</span><span id="line-3048">      if (cmd.startsWith(families)) {</span>
-<span class="source-line-no">3049</span><span id="line-3049">        opts.families = Integer.parseInt(cmd.substring(families.length()));</span>
-<span class="source-line-no">3050</span><span id="line-3050">        continue;</span>
-<span class="source-line-no">3051</span><span id="line-3051">      }</span>
-<span class="source-line-no">3052</span><span id="line-3052"></span>
-<span class="source-line-no">3053</span><span id="line-3053">      final String caching = "--caching=";</span>
-<span class="source-line-no">3054</span><span id="line-3054">      if (cmd.startsWith(caching)) {</span>
-<span class="source-line-no">3055</span><span id="line-3055">        opts.caching = Integer.parseInt(cmd.substring(caching.length()));</span>
-<span class="source-line-no">3056</span><span id="line-3056">        continue;</span>
-<span class="source-line-no">3057</span><span id="line-3057">      }</span>
-<span class="source-line-no">3058</span><span id="line-3058"></span>
-<span class="source-line-no">3059</span><span id="line-3059">      final String asyncPrefetch = "--asyncPrefetch";</span>
-<span class="source-line-no">3060</span><span id="line-3060">      if (cmd.startsWith(asyncPrefetch)) {</span>
-<span class="source-line-no">3061</span><span id="line-3061">        opts.asyncPrefetch = true;</span>
-<span class="source-line-no">3062</span><span id="line-3062">        continue;</span>
-<span class="source-line-no">3063</span><span id="line-3063">      }</span>
-<span class="source-line-no">3064</span><span id="line-3064"></span>
-<span class="source-line-no">3065</span><span id="line-3065">      final String cacheBlocks = "--cacheBlocks=";</span>
-<span class="source-line-no">3066</span><span id="line-3066">      if (cmd.startsWith(cacheBlocks)) {</span>
-<span class="source-line-no">3067</span><span id="line-3067">        opts.cacheBlocks = Boolean.parseBoolean(cmd.substring(cacheBlocks.length()));</span>
-<span class="source-line-no">3068</span><span id="line-3068">        continue;</span>
-<span class="source-line-no">3069</span><span id="line-3069">      }</span>
-<span class="source-line-no">3070</span><span id="line-3070"></span>
-<span class="source-line-no">3071</span><span id="line-3071">      final String scanReadType = "--scanReadType=";</span>
-<span class="source-line-no">3072</span><span id="line-3072">      if (cmd.startsWith(scanReadType)) {</span>
-<span class="source-line-no">3073</span><span id="line-3073">        opts.scanReadType =</span>
-<span class="source-line-no">3074</span><span id="line-3074">          Scan.ReadType.valueOf(cmd.substring(scanReadType.length()).toUpperCase());</span>
-<span class="source-line-no">3075</span><span id="line-3075">        continue;</span>
-<span class="source-line-no">3076</span><span id="line-3076">      }</span>
-<span class="source-line-no">3077</span><span id="line-3077"></span>
-<span class="source-line-no">3078</span><span id="line-3078">      final String bufferSize = "--bufferSize=";</span>
-<span class="source-line-no">3079</span><span id="line-3079">      if (cmd.startsWith(bufferSize)) {</span>
-<span class="source-line-no">3080</span><span id="line-3080">        opts.bufferSize = Long.parseLong(cmd.substring(bufferSize.length()));</span>
-<span class="source-line-no">3081</span><span id="line-3081">        continue;</span>
-<span class="source-line-no">3082</span><span id="line-3082">      }</span>
-<span class="source-line-no">3083</span><span id="line-3083"></span>
-<span class="source-line-no">3084</span><span id="line-3084">      final String commandPropertiesFile = "--commandPropertiesFile=";</span>
-<span class="source-line-no">3085</span><span id="line-3085">      if (cmd.startsWith(commandPropertiesFile)) {</span>
-<span class="source-line-no">3086</span><span id="line-3086">        String fileName = String.valueOf(cmd.substring(commandPropertiesFile.length()));</span>
-<span class="source-line-no">3087</span><span id="line-3087">        Properties properties = new Properties();</span>
-<span class="source-line-no">3088</span><span id="line-3088">        try {</span>
-<span class="source-line-no">3089</span><span id="line-3089">          properties</span>
-<span class="source-line-no">3090</span><span id="line-3090">            .load(PerformanceEvaluation.class.getClassLoader().getResourceAsStream(fileName));</span>
-<span class="source-line-no">3091</span><span id="line-3091">          opts.commandProperties = properties;</span>
-<span class="source-line-no">3092</span><span id="line-3092">        } catch (IOException e) {</span>
-<span class="source-line-no">3093</span><span id="line-3093">          LOG.error("Failed to load metricIds from properties file", e);</span>
-<span class="source-line-no">3094</span><span id="line-3094">        }</span>
-<span class="source-line-no">3095</span><span id="line-3095">        continue;</span>
-<span class="source-line-no">3096</span><span id="line-3096">      }</span>
-<span class="source-line-no">3097</span><span id="line-3097"></span>
-<span class="source-line-no">3098</span><span id="line-3098">      validateParsedOpts(opts);</span>
+<span class="source-line-no">2716</span><span id="line-2716">      " traceRate       Enable HTrace spans. Initiate tracing every N rows. " + "Default: 0");</span>
+<span class="source-line-no">2717</span><span id="line-2717">    System.err.println(" latency         Set to report operation latencies. Default: False");</span>
+<span class="source-line-no">2718</span><span id="line-2718">    System.err.println(" latencyThreshold  Set to report number of operations with latency "</span>
+<span class="source-line-no">2719</span><span id="line-2719">      + "over lantencyThreshold, unit in millisecond, default 0");</span>
+<span class="source-line-no">2720</span><span id="line-2720">    System.err.println(" measureAfter    Start to measure the latency once 'measureAfter'"</span>
+<span class="source-line-no">2721</span><span id="line-2721">      + " rows have been treated. Default: 0");</span>
+<span class="source-line-no">2722</span><span id="line-2722">    System.err</span>
+<span class="source-line-no">2723</span><span id="line-2723">      .println(" valueSize       Pass value size to use: Default: " + DEFAULT_OPTS.getValueSize());</span>
+<span class="source-line-no">2724</span><span id="line-2724">    System.err.println(" valueRandom     Set if we should vary value size between 0 and "</span>
+<span class="source-line-no">2725</span><span id="line-2725">      + "'valueSize'; set on read for stats on size: Default: Not set.");</span>
+<span class="source-line-no">2726</span><span id="line-2726">    System.err.println(" blockEncoding   Block encoding to use. Value should be one of "</span>
+<span class="source-line-no">2727</span><span id="line-2727">      + Arrays.toString(DataBlockEncoding.values()) + ". Default: NONE");</span>
+<span class="source-line-no">2728</span><span id="line-2728">    System.err.println();</span>
+<span class="source-line-no">2729</span><span id="line-2729">    System.err.println("Table Creation / Write Tests:");</span>
+<span class="source-line-no">2730</span><span id="line-2730">    System.err.println(" table           Alternate table name. Default: 'TestTable'");</span>
+<span class="source-line-no">2731</span><span id="line-2731">    System.err.println(</span>
+<span class="source-line-no">2732</span><span id="line-2732">      " rows            Rows each client runs. Default: " + DEFAULT_OPTS.getPerClientRunRows()</span>
+<span class="source-line-no">2733</span><span id="line-2733">        + ".  In case of randomReads and randomSeekScans this could"</span>
+<span class="source-line-no">2734</span><span id="line-2734">        + " be specified along with --size to specify the number of rows to be scanned within"</span>
+<span class="source-line-no">2735</span><span id="line-2735">        + " the total range specified by the size.");</span>
+<span class="source-line-no">2736</span><span id="line-2736">    System.err.println(</span>
+<span class="source-line-no">2737</span><span id="line-2737">      " size            Total size in GiB. Mutually exclusive with --rows for writes and scans"</span>
+<span class="source-line-no">2738</span><span id="line-2738">        + ". But for randomReads and randomSeekScans when you use size with --rows you could"</span>
+<span class="source-line-no">2739</span><span id="line-2739">        + " use size to specify the end range and --rows"</span>
+<span class="source-line-no">2740</span><span id="line-2740">        + " specifies the number of rows within that range. " + "Default: 1.0.");</span>
+<span class="source-line-no">2741</span><span id="line-2741">    System.err.println(" compress        Compression type to use (GZ, LZO, ...). Default: 'NONE'");</span>
+<span class="source-line-no">2742</span><span id="line-2742">    System.err.println(" encryption      Encryption type to use (AES, ...). Default: 'NONE'");</span>
+<span class="source-line-no">2743</span><span id="line-2743">    System.err.println(</span>
+<span class="source-line-no">2744</span><span id="line-2744">      " flushCommits    Used to determine if the test should flush the table. " + "Default: false");</span>
+<span class="source-line-no">2745</span><span id="line-2745">    System.err.println(" valueZipf       Set if we should vary value size between 0 and "</span>
+<span class="source-line-no">2746</span><span id="line-2746">      + "'valueSize' in zipf form: Default: Not set.");</span>
+<span class="source-line-no">2747</span><span id="line-2747">    System.err.println(" writeToWAL      Set writeToWAL on puts. Default: True");</span>
+<span class="source-line-no">2748</span><span id="line-2748">    System.err.println(" autoFlush       Set autoFlush on htable. Default: False");</span>
+<span class="source-line-no">2749</span><span id="line-2749">    System.err.println(" multiPut        Batch puts together into groups of N. Only supported "</span>
+<span class="source-line-no">2750</span><span id="line-2750">      + "by write. If multiPut is bigger than 0, autoFlush need to set to true. Default: 0");</span>
+<span class="source-line-no">2751</span><span id="line-2751">    System.err.println(" presplit        Create presplit table. If a table with same name exists,"</span>
+<span class="source-line-no">2752</span><span id="line-2752">      + " it'll be deleted and recreated (instead of verifying count of its existing regions). "</span>
+<span class="source-line-no">2753</span><span id="line-2753">      + "Recommended for accurate perf analysis (see guide). Default: disabled");</span>
+<span class="source-line-no">2754</span><span id="line-2754">    System.err.println(</span>
+<span class="source-line-no">2755</span><span id="line-2755">      " usetags         Writes tags along with KVs. Use with HFile V3. " + "Default: false");</span>
+<span class="source-line-no">2756</span><span id="line-2756">    System.err.println(" numoftags       Specify the no of tags that would be needed. "</span>
+<span class="source-line-no">2757</span><span id="line-2757">      + "This works only if usetags is true. Default: " + DEFAULT_OPTS.noOfTags);</span>
+<span class="source-line-no">2758</span><span id="line-2758">    System.err.println(" splitPolicy     Specify a custom RegionSplitPolicy for the table.");</span>
+<span class="source-line-no">2759</span><span id="line-2759">    System.err.println(" columns         Columns to write per row. Default: 1");</span>
+<span class="source-line-no">2760</span><span id="line-2760">    System.err</span>
+<span class="source-line-no">2761</span><span id="line-2761">      .println(" families        Specify number of column families for the table. Default: 1");</span>
+<span class="source-line-no">2762</span><span id="line-2762">    System.err.println();</span>
+<span class="source-line-no">2763</span><span id="line-2763">    System.err.println("Read Tests:");</span>
+<span class="source-line-no">2764</span><span id="line-2764">    System.err.println(" filterAll       Helps to filter out all the rows on the server side"</span>
+<span class="source-line-no">2765</span><span id="line-2765">      + " there by not returning any thing back to the client.  Helps to check the server side"</span>
+<span class="source-line-no">2766</span><span id="line-2766">      + " performance.  Uses FilterAllFilter internally. ");</span>
+<span class="source-line-no">2767</span><span id="line-2767">    System.err.println(" multiGet        Batch gets together into groups of N. Only supported "</span>
+<span class="source-line-no">2768</span><span id="line-2768">      + "by randomRead. Default: disabled");</span>
+<span class="source-line-no">2769</span><span id="line-2769">    System.err.println(" inmemory        Tries to keep the HFiles of the CF "</span>
+<span class="source-line-no">2770</span><span id="line-2770">      + "inmemory as far as possible. Not guaranteed that reads are always served "</span>
+<span class="source-line-no">2771</span><span id="line-2771">      + "from memory.  Default: false");</span>
+<span class="source-line-no">2772</span><span id="line-2772">    System.err</span>
+<span class="source-line-no">2773</span><span id="line-2773">      .println(" bloomFilter     Bloom filter type, one of " + Arrays.toString(BloomType.values()));</span>
+<span class="source-line-no">2774</span><span id="line-2774">    System.err.println(" blockSize       Blocksize to use when writing out hfiles. ");</span>
+<span class="source-line-no">2775</span><span id="line-2775">    System.err</span>
+<span class="source-line-no">2776</span><span id="line-2776">      .println(" inmemoryCompaction  Makes the column family to do inmemory flushes/compactions. "</span>
+<span class="source-line-no">2777</span><span id="line-2777">        + "Uses the CompactingMemstore");</span>
+<span class="source-line-no">2778</span><span id="line-2778">    System.err.println(" addColumns      Adds columns to scans/gets explicitly. Default: true");</span>
+<span class="source-line-no">2779</span><span id="line-2779">    System.err.println(" replicas        Enable region replica testing. Defaults: 1.");</span>
+<span class="source-line-no">2780</span><span id="line-2780">    System.err.println(</span>
+<span class="source-line-no">2781</span><span id="line-2781">      " randomSleep     Do a random sleep before each get between 0 and entered value. Defaults: 0");</span>
+<span class="source-line-no">2782</span><span id="line-2782">    System.err.println(" caching         Scan caching to use. Default: 30");</span>
+<span class="source-line-no">2783</span><span id="line-2783">    System.err.println(" asyncPrefetch   Enable asyncPrefetch for scan");</span>
+<span class="source-line-no">2784</span><span id="line-2784">    System.err.println(" cacheBlocks     Set the cacheBlocks option for scan. Default: true");</span>
+<span class="source-line-no">2785</span><span id="line-2785">    System.err.println(</span>
+<span class="source-line-no">2786</span><span id="line-2786">      " scanReadType    Set the readType option for scan, stream/pread/default. Default: default");</span>
+<span class="source-line-no">2787</span><span id="line-2787">    System.err.println(" bufferSize      Set the value of client side buffering. Default: 2MB");</span>
+<span class="source-line-no">2788</span><span id="line-2788">    System.err.println();</span>
+<span class="source-line-no">2789</span><span id="line-2789">    System.err.println(" Note: -D properties will be applied to the conf used. ");</span>
+<span class="source-line-no">2790</span><span id="line-2790">    System.err.println("  For example: ");</span>
+<span class="source-line-no">2791</span><span id="line-2791">    System.err.println("   -Dmapreduce.output.fileoutputformat.compress=true");</span>
+<span class="source-line-no">2792</span><span id="line-2792">    System.err.println("   -Dmapreduce.task.timeout=60000");</span>
+<span class="source-line-no">2793</span><span id="line-2793">    System.err.println();</span>
+<span class="source-line-no">2794</span><span id="line-2794">    System.err.println("Command:");</span>
+<span class="source-line-no">2795</span><span id="line-2795">    for (CmdDescriptor command : COMMANDS.values()) {</span>
+<span class="source-line-no">2796</span><span id="line-2796">      System.err.println(String.format(" %-20s %s", command.getName(), command.getDescription()));</span>
+<span class="source-line-no">2797</span><span id="line-2797">    }</span>
+<span class="source-line-no">2798</span><span id="line-2798">    System.err.println();</span>
+<span class="source-line-no">2799</span><span id="line-2799">    System.err.println("Class:");</span>
+<span class="source-line-no">2800</span><span id="line-2800">    System.err.println("To run any custom implementation of PerformanceEvaluation.Test, "</span>
+<span class="source-line-no">2801</span><span id="line-2801">      + "provide the classname of the implementaion class in place of "</span>
+<span class="source-line-no">2802</span><span id="line-2802">      + "command name and it will be loaded at runtime from classpath.:");</span>
+<span class="source-line-no">2803</span><span id="line-2803">    System.err.println("Please consider to contribute back "</span>
+<span class="source-line-no">2804</span><span id="line-2804">      + "this custom test impl into a builtin PE command for the benefit of the community");</span>
+<span class="source-line-no">2805</span><span id="line-2805">    System.err.println();</span>
+<span class="source-line-no">2806</span><span id="line-2806">    System.err.println("Args:");</span>
+<span class="source-line-no">2807</span><span id="line-2807">    System.err.println(" nclients        Integer. Required. Total number of clients "</span>
+<span class="source-line-no">2808</span><span id="line-2808">      + "(and HRegionServers) running. 1 &lt;= value &lt;= 500");</span>
+<span class="source-line-no">2809</span><span id="line-2809">    System.err.println("Examples:");</span>
+<span class="source-line-no">2810</span><span id="line-2810">    System.err.println(" To run a single client doing the default 1M sequentialWrites:");</span>
+<span class="source-line-no">2811</span><span id="line-2811">    System.err.println(" $ hbase " + shortName + " sequentialWrite 1");</span>
+<span class="source-line-no">2812</span><span id="line-2812">    System.err.println(" To run 10 clients doing increments over ten rows:");</span>
+<span class="source-line-no">2813</span><span id="line-2813">    System.err.println(" $ hbase " + shortName + " --rows=10 --nomapred increment 10");</span>
+<span class="source-line-no">2814</span><span id="line-2814">  }</span>
+<span class="source-line-no">2815</span><span id="line-2815"></span>
+<span class="source-line-no">2816</span><span id="line-2816">  /**</span>
+<span class="source-line-no">2817</span><span id="line-2817">   * Parse options passed in via an arguments array. Assumes that array has been split on</span>
+<span class="source-line-no">2818</span><span id="line-2818">   * white-space and placed into a {@code Queue}. Any unknown arguments will remain in the queue at</span>
+<span class="source-line-no">2819</span><span id="line-2819">   * the conclusion of this method call. It's up to the caller to deal with these unrecognized</span>
+<span class="source-line-no">2820</span><span id="line-2820">   * arguments.</span>
+<span class="source-line-no">2821</span><span id="line-2821">   */</span>
+<span class="source-line-no">2822</span><span id="line-2822">  static TestOptions parseOpts(Queue&lt;String&gt; args) {</span>
+<span class="source-line-no">2823</span><span id="line-2823">    TestOptions opts = new TestOptions();</span>
+<span class="source-line-no">2824</span><span id="line-2824"></span>
+<span class="source-line-no">2825</span><span id="line-2825">    String cmd = null;</span>
+<span class="source-line-no">2826</span><span id="line-2826">    while ((cmd = args.poll()) != null) {</span>
+<span class="source-line-no">2827</span><span id="line-2827">      if (cmd.equals("-h") || cmd.startsWith("--h")) {</span>
+<span class="source-line-no">2828</span><span id="line-2828">        // place item back onto queue so that caller knows parsing was incomplete</span>
+<span class="source-line-no">2829</span><span id="line-2829">        args.add(cmd);</span>
+<span class="source-line-no">2830</span><span id="line-2830">        break;</span>
+<span class="source-line-no">2831</span><span id="line-2831">      }</span>
+<span class="source-line-no">2832</span><span id="line-2832"></span>
+<span class="source-line-no">2833</span><span id="line-2833">      final String nmr = "--nomapred";</span>
+<span class="source-line-no">2834</span><span id="line-2834">      if (cmd.startsWith(nmr)) {</span>
+<span class="source-line-no">2835</span><span id="line-2835">        opts.nomapred = true;</span>
+<span class="source-line-no">2836</span><span id="line-2836">        continue;</span>
+<span class="source-line-no">2837</span><span id="line-2837">      }</span>
+<span class="source-line-no">2838</span><span id="line-2838"></span>
+<span class="source-line-no">2839</span><span id="line-2839">      final String rows = "--rows=";</span>
+<span class="source-line-no">2840</span><span id="line-2840">      if (cmd.startsWith(rows)) {</span>
+<span class="source-line-no">2841</span><span id="line-2841">        opts.perClientRunRows = Integer.parseInt(cmd.substring(rows.length()));</span>
+<span class="source-line-no">2842</span><span id="line-2842">        continue;</span>
+<span class="source-line-no">2843</span><span id="line-2843">      }</span>
+<span class="source-line-no">2844</span><span id="line-2844"></span>
+<span class="source-line-no">2845</span><span id="line-2845">      final String cycles = "--cycles=";</span>
+<span class="source-line-no">2846</span><span id="line-2846">      if (cmd.startsWith(cycles)) {</span>
+<span class="source-line-no">2847</span><span id="line-2847">        opts.cycles = Integer.parseInt(cmd.substring(cycles.length()));</span>
+<span class="source-line-no">2848</span><span id="line-2848">        continue;</span>
+<span class="source-line-no">2849</span><span id="line-2849">      }</span>
+<span class="source-line-no">2850</span><span id="line-2850"></span>
+<span class="source-line-no">2851</span><span id="line-2851">      final String sampleRate = "--sampleRate=";</span>
+<span class="source-line-no">2852</span><span id="line-2852">      if (cmd.startsWith(sampleRate)) {</span>
+<span class="source-line-no">2853</span><span id="line-2853">        opts.sampleRate = Float.parseFloat(cmd.substring(sampleRate.length()));</span>
+<span class="source-line-no">2854</span><span id="line-2854">        continue;</span>
+<span class="source-line-no">2855</span><span id="line-2855">      }</span>
+<span class="source-line-no">2856</span><span id="line-2856"></span>
+<span class="source-line-no">2857</span><span id="line-2857">      final String table = "--table=";</span>
+<span class="source-line-no">2858</span><span id="line-2858">      if (cmd.startsWith(table)) {</span>
+<span class="source-line-no">2859</span><span id="line-2859">        opts.tableName = cmd.substring(table.length());</span>
+<span class="source-line-no">2860</span><span id="line-2860">        continue;</span>
+<span class="source-line-no">2861</span><span id="line-2861">      }</span>
+<span class="source-line-no">2862</span><span id="line-2862"></span>
+<span class="source-line-no">2863</span><span id="line-2863">      final String startRow = "--startRow=";</span>
+<span class="source-line-no">2864</span><span id="line-2864">      if (cmd.startsWith(startRow)) {</span>
+<span class="source-line-no">2865</span><span id="line-2865">        opts.startRow = Integer.parseInt(cmd.substring(startRow.length()));</span>
+<span class="source-line-no">2866</span><span id="line-2866">        continue;</span>
+<span class="source-line-no">2867</span><span id="line-2867">      }</span>
+<span class="source-line-no">2868</span><span id="line-2868"></span>
+<span class="source-line-no">2869</span><span id="line-2869">      final String compress = "--compress=";</span>
+<span class="source-line-no">2870</span><span id="line-2870">      if (cmd.startsWith(compress)) {</span>
+<span class="source-line-no">2871</span><span id="line-2871">        opts.compression = Compression.Algorithm.valueOf(cmd.substring(compress.length()));</span>
+<span class="source-line-no">2872</span><span id="line-2872">        continue;</span>
+<span class="source-line-no">2873</span><span id="line-2873">      }</span>
+<span class="source-line-no">2874</span><span id="line-2874"></span>
+<span class="source-line-no">2875</span><span id="line-2875">      final String encryption = "--encryption=";</span>
+<span class="source-line-no">2876</span><span id="line-2876">      if (cmd.startsWith(encryption)) {</span>
+<span class="source-line-no">2877</span><span id="line-2877">        opts.encryption = cmd.substring(encryption.length());</span>
+<span class="source-line-no">2878</span><span id="line-2878">        continue;</span>
+<span class="source-line-no">2879</span><span id="line-2879">      }</span>
+<span class="source-line-no">2880</span><span id="line-2880"></span>
+<span class="source-line-no">2881</span><span id="line-2881">      final String traceRate = "--traceRate=";</span>
+<span class="source-line-no">2882</span><span id="line-2882">      if (cmd.startsWith(traceRate)) {</span>
+<span class="source-line-no">2883</span><span id="line-2883">        opts.traceRate = Double.parseDouble(cmd.substring(traceRate.length()));</span>
+<span class="source-line-no">2884</span><span id="line-2884">        continue;</span>
+<span class="source-line-no">2885</span><span id="line-2885">      }</span>
+<span class="source-line-no">2886</span><span id="line-2886"></span>
+<span class="source-line-no">2887</span><span id="line-2887">      final String blockEncoding = "--blockEncoding=";</span>
+<span class="source-line-no">2888</span><span id="line-2888">      if (cmd.startsWith(blockEncoding)) {</span>
+<span class="source-line-no">2889</span><span id="line-2889">        opts.blockEncoding = DataBlockEncoding.valueOf(cmd.substring(blockEncoding.length()));</span>
+<span class="source-line-no">2890</span><span id="line-2890">        continue;</span>
+<span class="source-line-no">2891</span><span id="line-2891">      }</span>
+<span class="source-line-no">2892</span><span id="line-2892"></span>
+<span class="source-line-no">2893</span><span id="line-2893">      final String flushCommits = "--flushCommits=";</span>
+<span class="source-line-no">2894</span><span id="line-2894">      if (cmd.startsWith(flushCommits)) {</span>
+<span class="source-line-no">2895</span><span id="line-2895">        opts.flushCommits = Boolean.parseBoolean(cmd.substring(flushCommits.length()));</span>
+<span class="source-line-no">2896</span><span id="line-2896">        continue;</span>
+<span class="source-line-no">2897</span><span id="line-2897">      }</span>
+<span class="source-line-no">2898</span><span id="line-2898"></span>
+<span class="source-line-no">2899</span><span id="line-2899">      final String writeToWAL = "--writeToWAL=";</span>
+<span class="source-line-no">2900</span><span id="line-2900">      if (cmd.startsWith(writeToWAL)) {</span>
+<span class="source-line-no">2901</span><span id="line-2901">        opts.writeToWAL = Boolean.parseBoolean(cmd.substring(writeToWAL.length()));</span>
+<span class="source-line-no">2902</span><span id="line-2902">        continue;</span>
+<span class="source-line-no">2903</span><span id="line-2903">      }</span>
+<span class="source-line-no">2904</span><span id="line-2904"></span>
+<span class="source-line-no">2905</span><span id="line-2905">      final String presplit = "--presplit=";</span>
+<span class="source-line-no">2906</span><span id="line-2906">      if (cmd.startsWith(presplit)) {</span>
+<span class="source-line-no">2907</span><span id="line-2907">        opts.presplitRegions = Integer.parseInt(cmd.substring(presplit.length()));</span>
+<span class="source-line-no">2908</span><span id="line-2908">        continue;</span>
+<span class="source-line-no">2909</span><span id="line-2909">      }</span>
+<span class="source-line-no">2910</span><span id="line-2910"></span>
+<span class="source-line-no">2911</span><span id="line-2911">      final String inMemory = "--inmemory=";</span>
+<span class="source-line-no">2912</span><span id="line-2912">      if (cmd.startsWith(inMemory)) {</span>
+<span class="source-line-no">2913</span><span id="line-2913">        opts.inMemoryCF = Boolean.parseBoolean(cmd.substring(inMemory.length()));</span>
+<span class="source-line-no">2914</span><span id="line-2914">        continue;</span>
+<span class="source-line-no">2915</span><span id="line-2915">      }</span>
+<span class="source-line-no">2916</span><span id="line-2916"></span>
+<span class="source-line-no">2917</span><span id="line-2917">      final String autoFlush = "--autoFlush=";</span>
+<span class="source-line-no">2918</span><span id="line-2918">      if (cmd.startsWith(autoFlush)) {</span>
+<span class="source-line-no">2919</span><span id="line-2919">        opts.autoFlush = Boolean.parseBoolean(cmd.substring(autoFlush.length()));</span>
+<span class="source-line-no">2920</span><span id="line-2920">        continue;</span>
+<span class="source-line-no">2921</span><span id="line-2921">      }</span>
+<span class="source-line-no">2922</span><span id="line-2922"></span>
+<span class="source-line-no">2923</span><span id="line-2923">      final String onceCon = "--oneCon=";</span>
+<span class="source-line-no">2924</span><span id="line-2924">      if (cmd.startsWith(onceCon)) {</span>
+<span class="source-line-no">2925</span><span id="line-2925">        opts.oneCon = Boolean.parseBoolean(cmd.substring(onceCon.length()));</span>
+<span class="source-line-no">2926</span><span id="line-2926">        continue;</span>
+<span class="source-line-no">2927</span><span id="line-2927">      }</span>
+<span class="source-line-no">2928</span><span id="line-2928"></span>
+<span class="source-line-no">2929</span><span id="line-2929">      final String connCount = "--connCount=";</span>
+<span class="source-line-no">2930</span><span id="line-2930">      if (cmd.startsWith(connCount)) {</span>
+<span class="source-line-no">2931</span><span id="line-2931">        opts.connCount = Integer.parseInt(cmd.substring(connCount.length()));</span>
+<span class="source-line-no">2932</span><span id="line-2932">        continue;</span>
+<span class="source-line-no">2933</span><span id="line-2933">      }</span>
+<span class="source-line-no">2934</span><span id="line-2934"></span>
+<span class="source-line-no">2935</span><span id="line-2935">      final String latencyThreshold = "--latencyThreshold=";</span>
+<span class="source-line-no">2936</span><span id="line-2936">      if (cmd.startsWith(latencyThreshold)) {</span>
+<span class="source-line-no">2937</span><span id="line-2937">        opts.latencyThreshold = Integer.parseInt(cmd.substring(latencyThreshold.length()));</span>
+<span class="source-line-no">2938</span><span id="line-2938">        continue;</span>
+<span class="source-line-no">2939</span><span id="line-2939">      }</span>
+<span class="source-line-no">2940</span><span id="line-2940"></span>
+<span class="source-line-no">2941</span><span id="line-2941">      final String latency = "--latency";</span>
+<span class="source-line-no">2942</span><span id="line-2942">      if (cmd.startsWith(latency)) {</span>
+<span class="source-line-no">2943</span><span id="line-2943">        opts.reportLatency = true;</span>
+<span class="source-line-no">2944</span><span id="line-2944">        continue;</span>
+<span class="source-line-no">2945</span><span id="line-2945">      }</span>
+<span class="source-line-no">2946</span><span id="line-2946"></span>
+<span class="source-line-no">2947</span><span id="line-2947">      final String multiGet = "--multiGet=";</span>
+<span class="source-line-no">2948</span><span id="line-2948">      if (cmd.startsWith(multiGet)) {</span>
+<span class="source-line-no">2949</span><span id="line-2949">        opts.multiGet = Integer.parseInt(cmd.substring(multiGet.length()));</span>
+<span class="source-line-no">2950</span><span id="line-2950">        continue;</span>
+<span class="source-line-no">2951</span><span id="line-2951">      }</span>
+<span class="source-line-no">2952</span><span id="line-2952"></span>
+<span class="source-line-no">2953</span><span id="line-2953">      final String multiPut = "--multiPut=";</span>
+<span class="source-line-no">2954</span><span id="line-2954">      if (cmd.startsWith(multiPut)) {</span>
+<span class="source-line-no">2955</span><span id="line-2955">        opts.multiPut = Integer.parseInt(cmd.substring(multiPut.length()));</span>
+<span class="source-line-no">2956</span><span id="line-2956">        continue;</span>
+<span class="source-line-no">2957</span><span id="line-2957">      }</span>
+<span class="source-line-no">2958</span><span id="line-2958"></span>
+<span class="source-line-no">2959</span><span id="line-2959">      final String useTags = "--usetags=";</span>
+<span class="source-line-no">2960</span><span id="line-2960">      if (cmd.startsWith(useTags)) {</span>
+<span class="source-line-no">2961</span><span id="line-2961">        opts.useTags = Boolean.parseBoolean(cmd.substring(useTags.length()));</span>
+<span class="source-line-no">2962</span><span id="line-2962">        continue;</span>
+<span class="source-line-no">2963</span><span id="line-2963">      }</span>
+<span class="source-line-no">2964</span><span id="line-2964"></span>
+<span class="source-line-no">2965</span><span id="line-2965">      final String noOfTags = "--numoftags=";</span>
+<span class="source-line-no">2966</span><span id="line-2966">      if (cmd.startsWith(noOfTags)) {</span>
+<span class="source-line-no">2967</span><span id="line-2967">        opts.noOfTags = Integer.parseInt(cmd.substring(noOfTags.length()));</span>
+<span class="source-line-no">2968</span><span id="line-2968">        continue;</span>
+<span class="source-line-no">2969</span><span id="line-2969">      }</span>
+<span class="source-line-no">2970</span><span id="line-2970"></span>
+<span class="source-line-no">2971</span><span id="line-2971">      final String replicas = "--replicas=";</span>
+<span class="source-line-no">2972</span><span id="line-2972">      if (cmd.startsWith(replicas)) {</span>
+<span class="source-line-no">2973</span><span id="line-2973">        opts.replicas = Integer.parseInt(cmd.substring(replicas.length()));</span>
+<span class="source-line-no">2974</span><span id="line-2974">        continue;</span>
+<span class="source-line-no">2975</span><span id="line-2975">      }</span>
+<span class="source-line-no">2976</span><span id="line-2976"></span>
+<span class="source-line-no">2977</span><span id="line-2977">      final String filterOutAll = "--filterAll";</span>
+<span class="source-line-no">2978</span><span id="line-2978">      if (cmd.startsWith(filterOutAll)) {</span>
+<span class="source-line-no">2979</span><span id="line-2979">        opts.filterAll = true;</span>
+<span class="source-line-no">2980</span><span id="line-2980">        continue;</span>
+<span class="source-line-no">2981</span><span id="line-2981">      }</span>
+<span class="source-line-no">2982</span><span id="line-2982"></span>
+<span class="source-line-no">2983</span><span id="line-2983">      final String size = "--size=";</span>
+<span class="source-line-no">2984</span><span id="line-2984">      if (cmd.startsWith(size)) {</span>
+<span class="source-line-no">2985</span><span id="line-2985">        opts.size = Float.parseFloat(cmd.substring(size.length()));</span>
+<span class="source-line-no">2986</span><span id="line-2986">        if (opts.size &lt;= 1.0f) throw new IllegalStateException("Size must be &gt; 1; i.e. 1GB");</span>
+<span class="source-line-no">2987</span><span id="line-2987">        continue;</span>
+<span class="source-line-no">2988</span><span id="line-2988">      }</span>
+<span class="source-line-no">2989</span><span id="line-2989"></span>
+<span class="source-line-no">2990</span><span id="line-2990">      final String splitPolicy = "--splitPolicy=";</span>
+<span class="source-line-no">2991</span><span id="line-2991">      if (cmd.startsWith(splitPolicy)) {</span>
+<span class="source-line-no">2992</span><span id="line-2992">        opts.splitPolicy = cmd.substring(splitPolicy.length());</span>
+<span class="source-line-no">2993</span><span id="line-2993">        continue;</span>
+<span class="source-line-no">2994</span><span id="line-2994">      }</span>
+<span class="source-line-no">2995</span><span id="line-2995"></span>
+<span class="source-line-no">2996</span><span id="line-2996">      final String randomSleep = "--randomSleep=";</span>
+<span class="source-line-no">2997</span><span id="line-2997">      if (cmd.startsWith(randomSleep)) {</span>
+<span class="source-line-no">2998</span><span id="line-2998">        opts.randomSleep = Integer.parseInt(cmd.substring(randomSleep.length()));</span>
+<span class="source-line-no">2999</span><span id="line-2999">        continue;</span>
+<span class="source-line-no">3000</span><span id="line-3000">      }</span>
+<span class="source-line-no">3001</span><span id="line-3001"></span>
+<span class="source-line-no">3002</span><span id="line-3002">      final String measureAfter = "--measureAfter=";</span>
+<span class="source-line-no">3003</span><span id="line-3003">      if (cmd.startsWith(measureAfter)) {</span>
+<span class="source-line-no">3004</span><span id="line-3004">        opts.measureAfter = Integer.parseInt(cmd.substring(measureAfter.length()));</span>
+<span class="source-line-no">3005</span><span id="line-3005">        continue;</span>
+<span class="source-line-no">3006</span><span id="line-3006">      }</span>
+<span class="source-line-no">3007</span><span id="line-3007"></span>
+<span class="source-line-no">3008</span><span id="line-3008">      final String bloomFilter = "--bloomFilter=";</span>
+<span class="source-line-no">3009</span><span id="line-3009">      if (cmd.startsWith(bloomFilter)) {</span>
+<span class="source-line-no">3010</span><span id="line-3010">        opts.bloomType = BloomType.valueOf(cmd.substring(bloomFilter.length()));</span>
+<span class="source-line-no">3011</span><span id="line-3011">        continue;</span>
+<span class="source-line-no">3012</span><span id="line-3012">      }</span>
+<span class="source-line-no">3013</span><span id="line-3013"></span>
+<span class="source-line-no">3014</span><span id="line-3014">      final String blockSize = "--blockSize=";</span>
+<span class="source-line-no">3015</span><span id="line-3015">      if (cmd.startsWith(blockSize)) {</span>
+<span class="source-line-no">3016</span><span id="line-3016">        opts.blockSize = Integer.parseInt(cmd.substring(blockSize.length()));</span>
+<span class="source-line-no">3017</span><span id="line-3017">        continue;</span>
+<span class="source-line-no">3018</span><span id="line-3018">      }</span>
+<span class="source-line-no">3019</span><span id="line-3019"></span>
+<span class="source-line-no">3020</span><span id="line-3020">      final String valueSize = "--valueSize=";</span>
+<span class="source-line-no">3021</span><span id="line-3021">      if (cmd.startsWith(valueSize)) {</span>
+<span class="source-line-no">3022</span><span id="line-3022">        opts.valueSize = Integer.parseInt(cmd.substring(valueSize.length()));</span>
+<span class="source-line-no">3023</span><span id="line-3023">        continue;</span>
+<span class="source-line-no">3024</span><span id="line-3024">      }</span>
+<span class="source-line-no">3025</span><span id="line-3025"></span>
+<span class="source-line-no">3026</span><span id="line-3026">      final String valueRandom = "--valueRandom";</span>
+<span class="source-line-no">3027</span><span id="line-3027">      if (cmd.startsWith(valueRandom)) {</span>
+<span class="source-line-no">3028</span><span id="line-3028">        opts.valueRandom = true;</span>
+<span class="source-line-no">3029</span><span id="line-3029">        continue;</span>
+<span class="source-line-no">3030</span><span id="line-3030">      }</span>
+<span class="source-line-no">3031</span><span id="line-3031"></span>
+<span class="source-line-no">3032</span><span id="line-3032">      final String valueZipf = "--valueZipf";</span>
+<span class="source-line-no">3033</span><span id="line-3033">      if (cmd.startsWith(valueZipf)) {</span>
+<span class="source-line-no">3034</span><span id="line-3034">        opts.valueZipf = true;</span>
+<span class="source-line-no">3035</span><span id="line-3035">        continue;</span>
+<span class="source-line-no">3036</span><span id="line-3036">      }</span>
+<span class="source-line-no">3037</span><span id="line-3037"></span>
+<span class="source-line-no">3038</span><span id="line-3038">      final String period = "--period=";</span>
+<span class="source-line-no">3039</span><span id="line-3039">      if (cmd.startsWith(period)) {</span>
+<span class="source-line-no">3040</span><span id="line-3040">        opts.period = Integer.parseInt(cmd.substring(period.length()));</span>
+<span class="source-line-no">3041</span><span id="line-3041">        continue;</span>
+<span class="source-line-no">3042</span><span id="line-3042">      }</span>
+<span class="source-line-no">3043</span><span id="line-3043"></span>
+<span class="source-line-no">3044</span><span id="line-3044">      final String addColumns = "--addColumns=";</span>
+<span class="source-line-no">3045</span><span id="line-3045">      if (cmd.startsWith(addColumns)) {</span>
+<span class="source-line-no">3046</span><span id="line-3046">        opts.addColumns = Boolean.parseBoolean(cmd.substring(addColumns.length()));</span>
+<span class="source-line-no">3047</span><span id="line-3047">        continue;</span>
+<span class="source-line-no">3048</span><span id="line-3048">      }</span>
+<span class="source-line-no">3049</span><span id="line-3049"></span>
+<span class="source-line-no">3050</span><span id="line-3050">      final String inMemoryCompaction = "--inmemoryCompaction=";</span>
+<span class="source-line-no">3051</span><span id="line-3051">      if (cmd.startsWith(inMemoryCompaction)) {</span>
+<span class="source-line-no">3052</span><span id="line-3052">        opts.inMemoryCompaction =</span>
+<span class="source-line-no">3053</span><span id="line-3053">          MemoryCompactionPolicy.valueOf(cmd.substring(inMemoryCompaction.length()));</span>
+<span class="source-line-no">3054</span><span id="line-3054">        continue;</span>
+<span class="source-line-no">3055</span><span id="line-3055">      }</span>
+<span class="source-line-no">3056</span><span id="line-3056"></span>
+<span class="source-line-no">3057</span><span id="line-3057">      final String columns = "--columns=";</span>
+<span class="source-line-no">3058</span><span id="line-3058">      if (cmd.startsWith(columns)) {</span>
+<span class="source-line-no">3059</span><span id="line-3059">        opts.columns = Integer.parseInt(cmd.substring(columns.length()));</span>
+<span class="source-line-no">3060</span><span id="line-3060">        continue;</span>
+<span class="source-line-no">3061</span><span id="line-3061">      }</span>
+<span class="source-line-no">3062</span><span id="line-3062"></span>
+<span class="source-line-no">3063</span><span id="line-3063">      final String families = "--families=";</span>
+<span class="source-line-no">3064</span><span id="line-3064">      if (cmd.startsWith(families)) {</span>
+<span class="source-line-no">3065</span><span id="line-3065">        opts.families = Integer.parseInt(cmd.substring(families.length()));</span>
+<span class="source-line-no">3066</span><span id="line-3066">        continue;</span>
+<span class="source-line-no">3067</span><span id="line-3067">      }</span>
+<span class="source-line-no">3068</span><span id="line-3068"></span>
+<span class="source-line-no">3069</span><span id="line-3069">      final String caching = "--caching=";</span>
+<span class="source-line-no">3070</span><span id="line-3070">      if (cmd.startsWith(caching)) {</span>
+<span class="source-line-no">3071</span><span id="line-3071">        opts.caching = Integer.parseInt(cmd.substring(caching.length()));</span>
+<span class="source-line-no">3072</span><span id="line-3072">        continue;</span>
+<span class="source-line-no">3073</span><span id="line-3073">      }</span>
+<span class="source-line-no">3074</span><span id="line-3074"></span>
+<span class="source-line-no">3075</span><span id="line-3075">      final String asyncPrefetch = "--asyncPrefetch";</span>
+<span class="source-line-no">3076</span><span id="line-3076">      if (cmd.startsWith(asyncPrefetch)) {</span>
+<span class="source-line-no">3077</span><span id="line-3077">        opts.asyncPrefetch = true;</span>
+<span class="source-line-no">3078</span><span id="line-3078">        continue;</span>
+<span class="source-line-no">3079</span><span id="line-3079">      }</span>
+<span class="source-line-no">3080</span><span id="line-3080"></span>
+<span class="source-line-no">3081</span><span id="line-3081">      final String cacheBlocks = "--cacheBlocks=";</span>
+<span class="source-line-no">3082</span><span id="line-3082">      if (cmd.startsWith(cacheBlocks)) {</span>
+<span class="source-line-no">3083</span><span id="line-3083">        opts.cacheBlocks = Boolean.parseBoolean(cmd.substring(cacheBlocks.length()));</span>
+<span class="source-line-no">3084</span><span id="line-3084">        continue;</span>
+<span class="source-line-no">3085</span><span id="line-3085">      }</span>
+<span class="source-line-no">3086</span><span id="line-3086"></span>
+<span class="source-line-no">3087</span><span id="line-3087">      final String scanReadType = "--scanReadType=";</span>
+<span class="source-line-no">3088</span><span id="line-3088">      if (cmd.startsWith(scanReadType)) {</span>
+<span class="source-line-no">3089</span><span id="line-3089">        opts.scanReadType =</span>
+<span class="source-line-no">3090</span><span id="line-3090">          Scan.ReadType.valueOf(cmd.substring(scanReadType.length()).toUpperCase());</span>
+<span class="source-line-no">3091</span><span id="line-3091">        continue;</span>
+<span class="source-line-no">3092</span><span id="line-3092">      }</span>
+<span class="source-line-no">3093</span><span id="line-3093"></span>
+<span class="source-line-no">3094</span><span id="line-3094">      final String bufferSize = "--bufferSize=";</span>
+<span class="source-line-no">3095</span><span id="line-3095">      if (cmd.startsWith(bufferSize)) {</span>
+<span class="source-line-no">3096</span><span id="line-3096">        opts.bufferSize = Long.parseLong(cmd.substring(bufferSize.length()));</span>
+<span class="source-line-no">3097</span><span id="line-3097">        continue;</span>
+<span class="source-line-no">3098</span><span id="line-3098">      }</span>
 <span class="source-line-no">3099</span><span id="line-3099"></span>
-<span class="source-line-no">3100</span><span id="line-3100">      if (isCommandClass(cmd)) {</span>
-<span class="source-line-no">3101</span><span id="line-3101">        opts.cmdName = cmd;</span>
-<span class="source-line-no">3102</span><span id="line-3102">        try {</span>
-<span class="source-line-no">3103</span><span id="line-3103">          opts.numClientThreads = Integer.parseInt(args.remove());</span>
-<span class="source-line-no">3104</span><span id="line-3104">        } catch (NoSuchElementException | NumberFormatException e) {</span>
-<span class="source-line-no">3105</span><span id="line-3105">          throw new IllegalArgumentException("Command " + cmd + " does not have threads number", e);</span>
-<span class="source-line-no">3106</span><span id="line-3106">        }</span>
-<span class="source-line-no">3107</span><span id="line-3107">        opts = calculateRowsAndSize(opts);</span>
-<span class="source-line-no">3108</span><span id="line-3108">        break;</span>
-<span class="source-line-no">3109</span><span id="line-3109">      } else {</span>
-<span class="source-line-no">3110</span><span id="line-3110">        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);</span>
-<span class="source-line-no">3111</span><span id="line-3111">      }</span>
-<span class="source-line-no">3112</span><span id="line-3112"></span>
-<span class="source-line-no">3113</span><span id="line-3113">      // Not matching any option or command.</span>
-<span class="source-line-no">3114</span><span id="line-3114">      System.err.println("Error: Wrong option or command: " + cmd);</span>
-<span class="source-line-no">3115</span><span id="line-3115">      args.add(cmd);</span>
-<span class="source-line-no">3116</span><span id="line-3116">      break;</span>
-<span class="source-line-no">3117</span><span id="line-3117">    }</span>
-<span class="source-line-no">3118</span><span id="line-3118">    return opts;</span>
-<span class="source-line-no">3119</span><span id="line-3119">  }</span>
-<span class="source-line-no">3120</span><span id="line-3120"></span>
-<span class="source-line-no">3121</span><span id="line-3121">  /**</span>
-<span class="source-line-no">3122</span><span id="line-3122">   * Validates opts after all the opts are parsed, so that caller need not to maintain order of opts</span>
-<span class="source-line-no">3123</span><span id="line-3123">   */</span>
-<span class="source-line-no">3124</span><span id="line-3124">  private static void validateParsedOpts(TestOptions opts) {</span>
-<span class="source-line-no">3125</span><span id="line-3125"></span>
-<span class="source-line-no">3126</span><span id="line-3126">    if (!opts.autoFlush &amp;&amp; opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">3127</span><span id="line-3127">      throw new IllegalArgumentException("autoFlush must be true when multiPut is more than 0");</span>
-<span class="source-line-no">3128</span><span id="line-3128">    }</span>
-<span class="source-line-no">3129</span><span id="line-3129"></span>
-<span class="source-line-no">3130</span><span id="line-3130">    if (opts.oneCon &amp;&amp; opts.connCount &gt; 1) {</span>
-<span class="source-line-no">3131</span><span id="line-3131">      throw new IllegalArgumentException(</span>
-<span class="source-line-no">3132</span><span id="line-3132">        "oneCon is set to true, " + "connCount should not bigger than 1");</span>
+<span class="source-line-no">3100</span><span id="line-3100">      final String commandPropertiesFile = "--commandPropertiesFile=";</span>
+<span class="source-line-no">3101</span><span id="line-3101">      if (cmd.startsWith(commandPropertiesFile)) {</span>
+<span class="source-line-no">3102</span><span id="line-3102">        String fileName = String.valueOf(cmd.substring(commandPropertiesFile.length()));</span>
+<span class="source-line-no">3103</span><span id="line-3103">        Properties properties = new Properties();</span>
+<span class="source-line-no">3104</span><span id="line-3104">        try {</span>
+<span class="source-line-no">3105</span><span id="line-3105">          properties</span>
+<span class="source-line-no">3106</span><span id="line-3106">            .load(PerformanceEvaluation.class.getClassLoader().getResourceAsStream(fileName));</span>
+<span class="source-line-no">3107</span><span id="line-3107">          opts.commandProperties = properties;</span>
+<span class="source-line-no">3108</span><span id="line-3108">        } catch (IOException e) {</span>
+<span class="source-line-no">3109</span><span id="line-3109">          LOG.error("Failed to load metricIds from properties file", e);</span>
+<span class="source-line-no">3110</span><span id="line-3110">        }</span>
+<span class="source-line-no">3111</span><span id="line-3111">        continue;</span>
+<span class="source-line-no">3112</span><span id="line-3112">      }</span>
+<span class="source-line-no">3113</span><span id="line-3113"></span>
+<span class="source-line-no">3114</span><span id="line-3114">      validateParsedOpts(opts);</span>
+<span class="source-line-no">3115</span><span id="line-3115"></span>
+<span class="source-line-no">3116</span><span id="line-3116">      if (isCommandClass(cmd)) {</span>
+<span class="source-line-no">3117</span><span id="line-3117">        opts.cmdName = cmd;</span>
+<span class="source-line-no">3118</span><span id="line-3118">        try {</span>
+<span class="source-line-no">3119</span><span id="line-3119">          opts.numClientThreads = Integer.parseInt(args.remove());</span>
+<span class="source-line-no">3120</span><span id="line-3120">        } catch (NoSuchElementException | NumberFormatException e) {</span>
+<span class="source-line-no">3121</span><span id="line-3121">          throw new IllegalArgumentException("Command " + cmd + " does not have threads number", e);</span>
+<span class="source-line-no">3122</span><span id="line-3122">        }</span>
+<span class="source-line-no">3123</span><span id="line-3123">        opts = calculateRowsAndSize(opts);</span>
+<span class="source-line-no">3124</span><span id="line-3124">        break;</span>
+<span class="source-line-no">3125</span><span id="line-3125">      } else {</span>
+<span class="source-line-no">3126</span><span id="line-3126">        printUsageAndExit("ERROR: Unrecognized option/command: " + cmd, -1);</span>
+<span class="source-line-no">3127</span><span id="line-3127">      }</span>
+<span class="source-line-no">3128</span><span id="line-3128"></span>
+<span class="source-line-no">3129</span><span id="line-3129">      // Not matching any option or command.</span>
+<span class="source-line-no">3130</span><span id="line-3130">      System.err.println("Error: Wrong option or command: " + cmd);</span>
+<span class="source-line-no">3131</span><span id="line-3131">      args.add(cmd);</span>
+<span class="source-line-no">3132</span><span id="line-3132">      break;</span>
 <span class="source-line-no">3133</span><span id="line-3133">    }</span>
-<span class="source-line-no">3134</span><span id="line-3134"></span>
-<span class="source-line-no">3135</span><span id="line-3135">    if (opts.valueZipf &amp;&amp; opts.valueRandom) {</span>
-<span class="source-line-no">3136</span><span id="line-3136">      throw new IllegalStateException("Either valueZipf or valueRandom but not both");</span>
-<span class="source-line-no">3137</span><span id="line-3137">    }</span>
-<span class="source-line-no">3138</span><span id="line-3138">  }</span>
-<span class="source-line-no">3139</span><span id="line-3139"></span>
-<span class="source-line-no">3140</span><span id="line-3140">  static TestOptions calculateRowsAndSize(final TestOptions opts) {</span>
-<span class="source-line-no">3141</span><span id="line-3141">    int rowsPerGB = getRowsPerGB(opts);</span>
-<span class="source-line-no">3142</span><span id="line-3142">    if (</span>
-<span class="source-line-no">3143</span><span id="line-3143">      (opts.getCmdName() != null</span>
-<span class="source-line-no">3144</span><span id="line-3144">        &amp;&amp; (opts.getCmdName().equals(RANDOM_READ) || opts.getCmdName().equals(RANDOM_SEEK_SCAN)))</span>
-<span class="source-line-no">3145</span><span id="line-3145">        &amp;&amp; opts.size != DEFAULT_OPTS.size &amp;&amp; opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows</span>
-<span class="source-line-no">3146</span><span id="line-3146">    ) {</span>
-<span class="source-line-no">3147</span><span id="line-3147">      opts.totalRows = (int) opts.size * rowsPerGB;</span>
-<span class="source-line-no">3148</span><span id="line-3148">    } else if (opts.size != DEFAULT_OPTS.size) {</span>
-<span class="source-line-no">3149</span><span id="line-3149">      // total size in GB specified</span>
-<span class="source-line-no">3150</span><span id="line-3150">      opts.totalRows = (int) opts.size * rowsPerGB;</span>
-<span class="source-line-no">3151</span><span id="line-3151">      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;</span>
-<span class="source-line-no">3152</span><span id="line-3152">    } else {</span>
-<span class="source-line-no">3153</span><span id="line-3153">      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;</span>
-<span class="source-line-no">3154</span><span id="line-3154">      opts.size = opts.totalRows / rowsPerGB;</span>
-<span class="source-line-no">3155</span><span id="line-3155">    }</span>
-<span class="source-line-no">3156</span><span id="line-3156">    return opts;</span>
-<span class="source-line-no">3157</span><span id="line-3157">  }</span>
-<span class="source-line-no">3158</span><span id="line-3158"></span>
-<span class="source-line-no">3159</span><span id="line-3159">  static int getRowsPerGB(final TestOptions opts) {</span>
-<span class="source-line-no">3160</span><span id="line-3160">    return ONE_GB / ((opts.valueRandom ? opts.valueSize / 2 : opts.valueSize) * opts.getFamilies()</span>
-<span class="source-line-no">3161</span><span id="line-3161">      * opts.getColumns());</span>
-<span class="source-line-no">3162</span><span id="line-3162">  }</span>
-<span class="source-line-no">3163</span><span id="line-3163"></span>
-<span class="source-line-no">3164</span><span id="line-3164">  @Override</span>
-<span class="source-line-no">3165</span><span id="line-3165">  public int run(String[] args) throws Exception {</span>
-<span class="source-line-no">3166</span><span id="line-3166">    // Process command-line args. TODO: Better cmd-line processing</span>
-<span class="source-line-no">3167</span><span id="line-3167">    // (but hopefully something not as painful as cli options).</span>
-<span class="source-line-no">3168</span><span id="line-3168">    int errCode = -1;</span>
-<span class="source-line-no">3169</span><span id="line-3169">    if (args.length &lt; 1) {</span>
-<span class="source-line-no">3170</span><span id="line-3170">      printUsage();</span>
-<span class="source-line-no">3171</span><span id="line-3171">      return errCode;</span>
+<span class="source-line-no">3134</span><span id="line-3134">    return opts;</span>
+<span class="source-line-no">3135</span><span id="line-3135">  }</span>
+<span class="source-line-no">3136</span><span id="line-3136"></span>
+<span class="source-line-no">3137</span><span id="line-3137">  /**</span>
+<span class="source-line-no">3138</span><span id="line-3138">   * Validates opts after all the opts are parsed, so that caller need not to maintain order of opts</span>
+<span class="source-line-no">3139</span><span id="line-3139">   */</span>
+<span class="source-line-no">3140</span><span id="line-3140">  private static void validateParsedOpts(TestOptions opts) {</span>
+<span class="source-line-no">3141</span><span id="line-3141"></span>
+<span class="source-line-no">3142</span><span id="line-3142">    if (!opts.autoFlush &amp;&amp; opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">3143</span><span id="line-3143">      throw new IllegalArgumentException("autoFlush must be true when multiPut is more than 0");</span>
+<span class="source-line-no">3144</span><span id="line-3144">    }</span>
+<span class="source-line-no">3145</span><span id="line-3145"></span>
+<span class="source-line-no">3146</span><span id="line-3146">    if (opts.oneCon &amp;&amp; opts.connCount &gt; 1) {</span>
+<span class="source-line-no">3147</span><span id="line-3147">      throw new IllegalArgumentException(</span>
+<span class="source-line-no">3148</span><span id="line-3148">        "oneCon is set to true, " + "connCount should not bigger than 1");</span>
+<span class="source-line-no">3149</span><span id="line-3149">    }</span>
+<span class="source-line-no">3150</span><span id="line-3150"></span>
+<span class="source-line-no">3151</span><span id="line-3151">    if (opts.valueZipf &amp;&amp; opts.valueRandom) {</span>
+<span class="source-line-no">3152</span><span id="line-3152">      throw new IllegalStateException("Either valueZipf or valueRandom but not both");</span>
+<span class="source-line-no">3153</span><span id="line-3153">    }</span>
+<span class="source-line-no">3154</span><span id="line-3154">  }</span>
+<span class="source-line-no">3155</span><span id="line-3155"></span>
+<span class="source-line-no">3156</span><span id="line-3156">  static TestOptions calculateRowsAndSize(final TestOptions opts) {</span>
+<span class="source-line-no">3157</span><span id="line-3157">    int rowsPerGB = getRowsPerGB(opts);</span>
+<span class="source-line-no">3158</span><span id="line-3158">    if (</span>
+<span class="source-line-no">3159</span><span id="line-3159">      (opts.getCmdName() != null</span>
+<span class="source-line-no">3160</span><span id="line-3160">        &amp;&amp; (opts.getCmdName().equals(RANDOM_READ) || opts.getCmdName().equals(RANDOM_SEEK_SCAN)))</span>
+<span class="source-line-no">3161</span><span id="line-3161">        &amp;&amp; opts.size != DEFAULT_OPTS.size &amp;&amp; opts.perClientRunRows != DEFAULT_OPTS.perClientRunRows</span>
+<span class="source-line-no">3162</span><span id="line-3162">    ) {</span>
+<span class="source-line-no">3163</span><span id="line-3163">      opts.totalRows = (int) (opts.size * rowsPerGB);</span>
+<span class="source-line-no">3164</span><span id="line-3164">    } else if (opts.size != DEFAULT_OPTS.size) {</span>
+<span class="source-line-no">3165</span><span id="line-3165">      // total size in GB specified</span>
+<span class="source-line-no">3166</span><span id="line-3166">      opts.totalRows = (int) (opts.size * rowsPerGB);</span>
+<span class="source-line-no">3167</span><span id="line-3167">      opts.perClientRunRows = opts.totalRows / opts.numClientThreads;</span>
+<span class="source-line-no">3168</span><span id="line-3168">    } else {</span>
+<span class="source-line-no">3169</span><span id="line-3169">      opts.totalRows = opts.perClientRunRows * opts.numClientThreads;</span>
+<span class="source-line-no">3170</span><span id="line-3170">      // Cast to float to ensure floating-point division</span>
+<span class="source-line-no">3171</span><span id="line-3171">      opts.size = (float) opts.totalRows / rowsPerGB;</span>
 <span class="source-line-no">3172</span><span id="line-3172">    }</span>
-<span class="source-line-no">3173</span><span id="line-3173"></span>
-<span class="source-line-no">3174</span><span id="line-3174">    try {</span>
-<span class="source-line-no">3175</span><span id="line-3175">      LinkedList&lt;String&gt; argv = new LinkedList&lt;&gt;();</span>
-<span class="source-line-no">3176</span><span id="line-3176">      argv.addAll(Arrays.asList(args));</span>
-<span class="source-line-no">3177</span><span id="line-3177">      TestOptions opts = parseOpts(argv);</span>
-<span class="source-line-no">3178</span><span id="line-3178"></span>
-<span class="source-line-no">3179</span><span id="line-3179">      // args remaining, print help and exit</span>
-<span class="source-line-no">3180</span><span id="line-3180">      if (!argv.isEmpty()) {</span>
-<span class="source-line-no">3181</span><span id="line-3181">        errCode = 0;</span>
-<span class="source-line-no">3182</span><span id="line-3182">        printUsage();</span>
-<span class="source-line-no">3183</span><span id="line-3183">        return errCode;</span>
-<span class="source-line-no">3184</span><span id="line-3184">      }</span>
-<span class="source-line-no">3185</span><span id="line-3185"></span>
-<span class="source-line-no">3186</span><span id="line-3186">      // must run at least 1 client</span>
-<span class="source-line-no">3187</span><span id="line-3187">      if (opts.numClientThreads &lt;= 0) {</span>
-<span class="source-line-no">3188</span><span id="line-3188">        throw new IllegalArgumentException("Number of clients must be &gt; 0");</span>
-<span class="source-line-no">3189</span><span id="line-3189">      }</span>
+<span class="source-line-no">3173</span><span id="line-3173">    return opts;</span>
+<span class="source-line-no">3174</span><span id="line-3174">  }</span>
+<span class="source-line-no">3175</span><span id="line-3175"></span>
+<span class="source-line-no">3176</span><span id="line-3176">  static int getRowsPerGB(final TestOptions opts) {</span>
+<span class="source-line-no">3177</span><span id="line-3177">    return ONE_GB / ((opts.valueRandom ? opts.valueSize / 2 : opts.valueSize) * opts.getFamilies()</span>
+<span class="source-line-no">3178</span><span id="line-3178">      * opts.getColumns());</span>
+<span class="source-line-no">3179</span><span id="line-3179">  }</span>
+<span class="source-line-no">3180</span><span id="line-3180"></span>
+<span class="source-line-no">3181</span><span id="line-3181">  @Override</span>
+<span class="source-line-no">3182</span><span id="line-3182">  public int run(String[] args) throws Exception {</span>
+<span class="source-line-no">3183</span><span id="line-3183">    // Process command-line args. TODO: Better cmd-line processing</span>
+<span class="source-line-no">3184</span><span id="line-3184">    // (but hopefully something not as painful as cli options).</span>
+<span class="source-line-no">3185</span><span id="line-3185">    int errCode = -1;</span>
+<span class="source-line-no">3186</span><span id="line-3186">    if (args.length &lt; 1) {</span>
+<span class="source-line-no">3187</span><span id="line-3187">      printUsage();</span>
+<span class="source-line-no">3188</span><span id="line-3188">      return errCode;</span>
+<span class="source-line-no">3189</span><span id="line-3189">    }</span>
 <span class="source-line-no">3190</span><span id="line-3190"></span>
-<span class="source-line-no">3191</span><span id="line-3191">      // cmdName should not be null, print help and exit</span>
-<span class="source-line-no">3192</span><span id="line-3192">      if (opts.cmdName == null) {</span>
-<span class="source-line-no">3193</span><span id="line-3193">        printUsage();</span>
-<span class="source-line-no">3194</span><span id="line-3194">        return errCode;</span>
-<span class="source-line-no">3195</span><span id="line-3195">      }</span>
-<span class="source-line-no">3196</span><span id="line-3196"></span>
-<span class="source-line-no">3197</span><span id="line-3197">      Class&lt;? extends TestBase&gt; cmdClass = determineCommandClass(opts.cmdName);</span>
-<span class="source-line-no">3198</span><span id="line-3198">      if (cmdClass != null) {</span>
-<span class="source-line-no">3199</span><span id="line-3199">        runTest(cmdClass, opts);</span>
-<span class="source-line-no">3200</span><span id="line-3200">        errCode = 0;</span>
+<span class="source-line-no">3191</span><span id="line-3191">    try {</span>
+<span class="source-line-no">3192</span><span id="line-3192">      LinkedList&lt;String&gt; argv = new LinkedList&lt;&gt;();</span>
+<span class="source-line-no">3193</span><span id="line-3193">      argv.addAll(Arrays.asList(args));</span>
+<span class="source-line-no">3194</span><span id="line-3194">      TestOptions opts = parseOpts(argv);</span>
+<span class="source-line-no">3195</span><span id="line-3195"></span>
+<span class="source-line-no">3196</span><span id="line-3196">      // args remaining, print help and exit</span>
+<span class="source-line-no">3197</span><span id="line-3197">      if (!argv.isEmpty()) {</span>
+<span class="source-line-no">3198</span><span id="line-3198">        errCode = 0;</span>
+<span class="source-line-no">3199</span><span id="line-3199">        printUsage();</span>
+<span class="source-line-no">3200</span><span id="line-3200">        return errCode;</span>
 <span class="source-line-no">3201</span><span id="line-3201">      }</span>
 <span class="source-line-no">3202</span><span id="line-3202"></span>
-<span class="source-line-no">3203</span><span id="line-3203">    } catch (Exception e) {</span>
-<span class="source-line-no">3204</span><span id="line-3204">      e.printStackTrace();</span>
-<span class="source-line-no">3205</span><span id="line-3205">    }</span>
-<span class="source-line-no">3206</span><span id="line-3206"></span>
-<span class="source-line-no">3207</span><span id="line-3207">    return errCode;</span>
-<span class="source-line-no">3208</span><span id="line-3208">  }</span>
-<span class="source-line-no">3209</span><span id="line-3209"></span>
-<span class="source-line-no">3210</span><span id="line-3210">  private static boolean isCommandClass(String cmd) {</span>
-<span class="source-line-no">3211</span><span id="line-3211">    return COMMANDS.containsKey(cmd) || isCustomTestClass(cmd);</span>
-<span class="source-line-no">3212</span><span id="line-3212">  }</span>
+<span class="source-line-no">3203</span><span id="line-3203">      // must run at least 1 client</span>
+<span class="source-line-no">3204</span><span id="line-3204">      if (opts.numClientThreads &lt;= 0) {</span>
+<span class="source-line-no">3205</span><span id="line-3205">        throw new IllegalArgumentException("Number of clients must be &gt; 0");</span>
+<span class="source-line-no">3206</span><span id="line-3206">      }</span>
+<span class="source-line-no">3207</span><span id="line-3207"></span>
+<span class="source-line-no">3208</span><span id="line-3208">      // cmdName should not be null, print help and exit</span>
+<span class="source-line-no">3209</span><span id="line-3209">      if (opts.cmdName == null) {</span>
+<span class="source-line-no">3210</span><span id="line-3210">        printUsage();</span>
+<span class="source-line-no">3211</span><span id="line-3211">        return errCode;</span>
+<span class="source-line-no">3212</span><span id="line-3212">      }</span>
 <span class="source-line-no">3213</span><span id="line-3213"></span>
-<span class="source-line-no">3214</span><span id="line-3214">  private static boolean isCustomTestClass(String cmd) {</span>
-<span class="source-line-no">3215</span><span id="line-3215">    Class&lt;? extends Test&gt; cmdClass;</span>
-<span class="source-line-no">3216</span><span id="line-3216">    try {</span>
-<span class="source-line-no">3217</span><span id="line-3217">      cmdClass =</span>
-<span class="source-line-no">3218</span><span id="line-3218">        (Class&lt;? extends Test&gt;) PerformanceEvaluation.class.getClassLoader().loadClass(cmd);</span>
-<span class="source-line-no">3219</span><span id="line-3219">      addCommandDescriptor(cmdClass, cmd, "custom command");</span>
-<span class="source-line-no">3220</span><span id="line-3220">      return true;</span>
-<span class="source-line-no">3221</span><span id="line-3221">    } catch (Throwable th) {</span>
-<span class="source-line-no">3222</span><span id="line-3222">      LOG.info("No class found for command: " + cmd, th);</span>
-<span class="source-line-no">3223</span><span id="line-3223">      return false;</span>
-<span class="source-line-no">3224</span><span id="line-3224">    }</span>
+<span class="source-line-no">3214</span><span id="line-3214">      Class&lt;? extends TestBase&gt; cmdClass = determineCommandClass(opts.cmdName);</span>
+<span class="source-line-no">3215</span><span id="line-3215">      if (cmdClass != null) {</span>
+<span class="source-line-no">3216</span><span id="line-3216">        runTest(cmdClass, opts);</span>
+<span class="source-line-no">3217</span><span id="line-3217">        errCode = 0;</span>
+<span class="source-line-no">3218</span><span id="line-3218">      }</span>
+<span class="source-line-no">3219</span><span id="line-3219"></span>
+<span class="source-line-no">3220</span><span id="line-3220">    } catch (Exception e) {</span>
+<span class="source-line-no">3221</span><span id="line-3221">      e.printStackTrace();</span>
+<span class="source-line-no">3222</span><span id="line-3222">    }</span>
+<span class="source-line-no">3223</span><span id="line-3223"></span>
+<span class="source-line-no">3224</span><span id="line-3224">    return errCode;</span>
 <span class="source-line-no">3225</span><span id="line-3225">  }</span>
 <span class="source-line-no">3226</span><span id="line-3226"></span>
-<span class="source-line-no">3227</span><span id="line-3227">  private static Class&lt;? extends TestBase&gt; determineCommandClass(String cmd) {</span>
-<span class="source-line-no">3228</span><span id="line-3228">    CmdDescriptor descriptor = COMMANDS.get(cmd);</span>
-<span class="source-line-no">3229</span><span id="line-3229">    return descriptor != null ? descriptor.getCmdClass() : null;</span>
-<span class="source-line-no">3230</span><span id="line-3230">  }</span>
-<span class="source-line-no">3231</span><span id="line-3231"></span>
-<span class="source-line-no">3232</span><span id="line-3232">  public static void main(final String[] args) throws Exception {</span>
-<span class="source-line-no">3233</span><span id="line-3233">    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);</span>
-<span class="source-line-no">3234</span><span id="line-3234">    System.exit(res);</span>
-<span class="source-line-no">3235</span><span id="line-3235">  }</span>
-<span class="source-line-no">3236</span><span id="line-3236">}</span>
+<span class="source-line-no">3227</span><span id="line-3227">  private static boolean isCommandClass(String cmd) {</span>
+<span class="source-line-no">3228</span><span id="line-3228">    return COMMANDS.containsKey(cmd) || isCustomTestClass(cmd);</span>
+<span class="source-line-no">3229</span><span id="line-3229">  }</span>
+<span class="source-line-no">3230</span><span id="line-3230"></span>
+<span class="source-line-no">3231</span><span id="line-3231">  private static boolean isCustomTestClass(String cmd) {</span>
+<span class="source-line-no">3232</span><span id="line-3232">    Class&lt;? extends Test&gt; cmdClass;</span>
+<span class="source-line-no">3233</span><span id="line-3233">    try {</span>
+<span class="source-line-no">3234</span><span id="line-3234">      cmdClass =</span>
+<span class="source-line-no">3235</span><span id="line-3235">        (Class&lt;? extends Test&gt;) PerformanceEvaluation.class.getClassLoader().loadClass(cmd);</span>
+<span class="source-line-no">3236</span><span id="line-3236">      addCommandDescriptor(cmdClass, cmd, "custom command");</span>
+<span class="source-line-no">3237</span><span id="line-3237">      return true;</span>
+<span class="source-line-no">3238</span><span id="line-3238">    } catch (Throwable th) {</span>
+<span class="source-line-no">3239</span><span id="line-3239">      LOG.info("No class found for command: " + cmd, th);</span>
+<span class="source-line-no">3240</span><span id="line-3240">      return false;</span>
+<span class="source-line-no">3241</span><span id="line-3241">    }</span>
+<span class="source-line-no">3242</span><span id="line-3242">  }</span>
+<span class="source-line-no">3243</span><span id="line-3243"></span>
+<span class="source-line-no">3244</span><span id="line-3244">  private static Class&lt;? extends TestBase&gt; determineCommandClass(String cmd) {</span>
+<span class="source-line-no">3245</span><span id="line-3245">    CmdDescriptor descriptor = COMMANDS.get(cmd);</span>
+<span class="source-line-no">3246</span><span id="line-3246">    return descriptor != null ? descriptor.getCmdClass() : null;</span>
+<span class="source-line-no">3247</span><span id="line-3247">  }</span>
+<span class="source-line-no">3248</span><span id="line-3248"></span>
+<span class="source-line-no">3249</span><span id="line-3249">  public static void main(final String[] args) throws Exception {</span>
+<span class="source-line-no">3250</span><span id="line-3250">    int res = ToolRunner.run(new PerformanceEvaluation(HBaseConfiguration.create()), args);</span>
+<span class="source-line-no">3251</span><span id="line-3251">    System.exit(res);</span>
+<span class="source-line-no">3252</span><span id="line-3252">  }</span>
+<span class="source-line-no">3253</span><span id="line-3253">}</span>
 
 
 
diff --git a/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html b/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
index 5094d67feca..c3c43e03400 100644
--- a/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/apidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -262,2991 +262,3008 @@
 <span class="source-line-no">249</span><span id="line-249">    public int compareTo(RunResult o) {</span>
 <span class="source-line-no">250</span><span id="line-250">      return Long.compare(this.duration, o.duration);</span>
 <span class="source-line-no">251</span><span id="line-251">    }</span>
-<span class="source-line-no">252</span><span id="line-252">  }</span>
-<span class="source-line-no">253</span><span id="line-253"></span>
-<span class="source-line-no">254</span><span id="line-254">  /**</span>
-<span class="source-line-no">255</span><span id="line-255">   * Constructor</span>
-<span class="source-line-no">256</span><span id="line-256">   * @param conf Configuration object</span>
-<span class="source-line-no">257</span><span id="line-257">   */</span>
-<span class="source-line-no">258</span><span id="line-258">  public PerformanceEvaluation(final Configuration conf) {</span>
-<span class="source-line-no">259</span><span id="line-259">    super(conf);</span>
-<span class="source-line-no">260</span><span id="line-260">  }</span>
-<span class="source-line-no">261</span><span id="line-261"></span>
-<span class="source-line-no">262</span><span id="line-262">  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name,</span>
-<span class="source-line-no">263</span><span id="line-263">    String description) {</span>
-<span class="source-line-no">264</span><span id="line-264">    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);</span>
-<span class="source-line-no">265</span><span id="line-265">    COMMANDS.put(name, cmdDescriptor);</span>
-<span class="source-line-no">266</span><span id="line-266">  }</span>
-<span class="source-line-no">267</span><span id="line-267"></span>
-<span class="source-line-no">268</span><span id="line-268">  /**</span>
-<span class="source-line-no">269</span><span id="line-269">   * Implementations can have their status set.</span>
-<span class="source-line-no">270</span><span id="line-270">   */</span>
-<span class="source-line-no">271</span><span id="line-271">  interface Status {</span>
-<span class="source-line-no">272</span><span id="line-272">    /**</span>
-<span class="source-line-no">273</span><span id="line-273">     * Sets status</span>
-<span class="source-line-no">274</span><span id="line-274">     * @param msg status message</span>
-<span class="source-line-no">275</span><span id="line-275">     */</span>
-<span class="source-line-no">276</span><span id="line-276">    void setStatus(final String msg) throws IOException;</span>
-<span class="source-line-no">277</span><span id="line-277">  }</span>
-<span class="source-line-no">278</span><span id="line-278"></span>
-<span class="source-line-no">279</span><span id="line-279">  /**</span>
-<span class="source-line-no">280</span><span id="line-280">   * MapReduce job that runs a performance evaluation client in each map task.</span>
-<span class="source-line-no">281</span><span id="line-281">   */</span>
-<span class="source-line-no">282</span><span id="line-282">  public static class EvaluationMapTask</span>
-<span class="source-line-no">283</span><span id="line-283">    extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {</span>
-<span class="source-line-no">284</span><span id="line-284"></span>
-<span class="source-line-no">285</span><span id="line-285">    /** configuration parameter name that contains the command */</span>
-<span class="source-line-no">286</span><span id="line-286">    public final static String CMD_KEY = "EvaluationMapTask.command";</span>
-<span class="source-line-no">287</span><span id="line-287">    /** configuration parameter name that contains the PE impl */</span>
-<span class="source-line-no">288</span><span id="line-288">    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";</span>
-<span class="source-line-no">289</span><span id="line-289"></span>
-<span class="source-line-no">290</span><span id="line-290">    private Class&lt;? extends Test&gt; cmd;</span>
-<span class="source-line-no">291</span><span id="line-291"></span>
-<span class="source-line-no">292</span><span id="line-292">    @Override</span>
-<span class="source-line-no">293</span><span id="line-293">    protected void setup(Context context) throws IOException, InterruptedException {</span>
-<span class="source-line-no">294</span><span id="line-294">      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);</span>
-<span class="source-line-no">295</span><span id="line-295"></span>
-<span class="source-line-no">296</span><span id="line-296">      // this is required so that extensions of PE are instantiated within the</span>
-<span class="source-line-no">297</span><span id="line-297">      // map reduce task...</span>
-<span class="source-line-no">298</span><span id="line-298">      Class&lt;? extends PerformanceEvaluation&gt; peClass =</span>
-<span class="source-line-no">299</span><span id="line-299">        forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);</span>
-<span class="source-line-no">300</span><span id="line-300">      try {</span>
-<span class="source-line-no">301</span><span id="line-301">        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());</span>
-<span class="source-line-no">302</span><span id="line-302">      } catch (Exception e) {</span>
-<span class="source-line-no">303</span><span id="line-303">        throw new IllegalStateException("Could not instantiate PE instance", e);</span>
-<span class="source-line-no">304</span><span id="line-304">      }</span>
-<span class="source-line-no">305</span><span id="line-305">    }</span>
-<span class="source-line-no">306</span><span id="line-306"></span>
-<span class="source-line-no">307</span><span id="line-307">    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {</span>
-<span class="source-line-no">308</span><span id="line-308">      try {</span>
-<span class="source-line-no">309</span><span id="line-309">        return Class.forName(className).asSubclass(type);</span>
-<span class="source-line-no">310</span><span id="line-310">      } catch (ClassNotFoundException e) {</span>
-<span class="source-line-no">311</span><span id="line-311">        throw new IllegalStateException("Could not find class for name: " + className, e);</span>
-<span class="source-line-no">312</span><span id="line-312">      }</span>
-<span class="source-line-no">313</span><span id="line-313">    }</span>
-<span class="source-line-no">314</span><span id="line-314"></span>
-<span class="source-line-no">315</span><span id="line-315">    @Override</span>
-<span class="source-line-no">316</span><span id="line-316">    protected void map(LongWritable key, Text value, final Context context)</span>
-<span class="source-line-no">317</span><span id="line-317">      throws IOException, InterruptedException {</span>
-<span class="source-line-no">318</span><span id="line-318"></span>
-<span class="source-line-no">319</span><span id="line-319">      Status status = new Status() {</span>
-<span class="source-line-no">320</span><span id="line-320">        @Override</span>
-<span class="source-line-no">321</span><span id="line-321">        public void setStatus(String msg) {</span>
-<span class="source-line-no">322</span><span id="line-322">          context.setStatus(msg);</span>
-<span class="source-line-no">323</span><span id="line-323">        }</span>
-<span class="source-line-no">324</span><span id="line-324">      };</span>
-<span class="source-line-no">325</span><span id="line-325"></span>
-<span class="source-line-no">326</span><span id="line-326">      TestOptions opts = GSON.fromJson(value.toString(), TestOptions.class);</span>
-<span class="source-line-no">327</span><span id="line-327">      Configuration conf = HBaseConfiguration.create(context.getConfiguration());</span>
-<span class="source-line-no">328</span><span id="line-328">      final Connection con = ConnectionFactory.createConnection(conf);</span>
-<span class="source-line-no">329</span><span id="line-329">      AsyncConnection asyncCon = null;</span>
-<span class="source-line-no">330</span><span id="line-330">      try {</span>
-<span class="source-line-no">331</span><span id="line-331">        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();</span>
-<span class="source-line-no">332</span><span id="line-332">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">333</span><span id="line-333">        throw new IOException(e);</span>
-<span class="source-line-no">334</span><span id="line-334">      }</span>
-<span class="source-line-no">335</span><span id="line-335"></span>
-<span class="source-line-no">336</span><span id="line-336">      // Evaluation task</span>
-<span class="source-line-no">337</span><span id="line-337">      RunResult result =</span>
-<span class="source-line-no">338</span><span id="line-338">        PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);</span>
-<span class="source-line-no">339</span><span id="line-339">      // Collect how much time the thing took. Report as map output and</span>
-<span class="source-line-no">340</span><span id="line-340">      // to the ELAPSED_TIME counter.</span>
-<span class="source-line-no">341</span><span id="line-341">      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);</span>
-<span class="source-line-no">342</span><span id="line-342">      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);</span>
-<span class="source-line-no">343</span><span id="line-343">      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));</span>
-<span class="source-line-no">344</span><span id="line-344">      context.progress();</span>
-<span class="source-line-no">345</span><span id="line-345">    }</span>
-<span class="source-line-no">346</span><span id="line-346">  }</span>
-<span class="source-line-no">347</span><span id="line-347"></span>
-<span class="source-line-no">348</span><span id="line-348">  /*</span>
-<span class="source-line-no">349</span><span id="line-349">   * If table does not already exist, create. Also create a table when {@code opts.presplitRegions}</span>
-<span class="source-line-no">350</span><span id="line-350">   * is specified or when the existing table's region replica count doesn't match {@code</span>
-<span class="source-line-no">351</span><span id="line-351">   * opts.replicas}.</span>
-<span class="source-line-no">352</span><span id="line-352">   */</span>
-<span class="source-line-no">353</span><span id="line-353">  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {</span>
-<span class="source-line-no">354</span><span id="line-354">    TableName tableName = TableName.valueOf(opts.tableName);</span>
-<span class="source-line-no">355</span><span id="line-355">    boolean needsDelete = false, exists = admin.tableExists(tableName);</span>
-<span class="source-line-no">356</span><span id="line-356">    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")</span>
-<span class="source-line-no">357</span><span id="line-357">      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");</span>
-<span class="source-line-no">358</span><span id="line-358">    boolean isDeleteCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("delete");</span>
-<span class="source-line-no">359</span><span id="line-359">    if (!exists &amp;&amp; (isReadCmd || isDeleteCmd)) {</span>
-<span class="source-line-no">360</span><span id="line-360">      throw new IllegalStateException(</span>
-<span class="source-line-no">361</span><span id="line-361">        "Must specify an existing table for read commands. Run a write command first.");</span>
-<span class="source-line-no">362</span><span id="line-362">    }</span>
-<span class="source-line-no">363</span><span id="line-363">    TableDescriptor desc = exists ? admin.getDescriptor(TableName.valueOf(opts.tableName)) : null;</span>
-<span class="source-line-no">364</span><span id="line-364">    byte[][] splits = getSplits(opts);</span>
-<span class="source-line-no">365</span><span id="line-365"></span>
-<span class="source-line-no">366</span><span id="line-366">    // recreate the table when user has requested presplit or when existing</span>
-<span class="source-line-no">367</span><span id="line-367">    // {RegionSplitPolicy,replica count} does not match requested, or when the</span>
-<span class="source-line-no">368</span><span id="line-368">    // number of column families does not match requested.</span>
-<span class="source-line-no">369</span><span id="line-369">    if (</span>
-<span class="source-line-no">370</span><span id="line-370">      (exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions</span>
-<span class="source-line-no">371</span><span id="line-371">        &amp;&amp; opts.presplitRegions != admin.getRegions(tableName).size())</span>
-<span class="source-line-no">372</span><span id="line-372">        || (!isReadCmd &amp;&amp; desc != null</span>
-<span class="source-line-no">373</span><span id="line-373">          &amp;&amp; !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))</span>
-<span class="source-line-no">374</span><span id="line-374">        || (!(isReadCmd || isDeleteCmd) &amp;&amp; desc != null</span>
-<span class="source-line-no">375</span><span id="line-375">          &amp;&amp; desc.getRegionReplication() != opts.replicas)</span>
-<span class="source-line-no">376</span><span id="line-376">        || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)</span>
-<span class="source-line-no">377</span><span id="line-377">    ) {</span>
-<span class="source-line-no">378</span><span id="line-378">      needsDelete = true;</span>
-<span class="source-line-no">379</span><span id="line-379">      // wait, why did it delete my table?!?</span>
-<span class="source-line-no">380</span><span id="line-380">      LOG.debug(MoreObjects.toStringHelper("needsDelete").add("needsDelete", needsDelete)</span>
-<span class="source-line-no">381</span><span id="line-381">        .add("isReadCmd", isReadCmd).add("exists", exists).add("desc", desc)</span>
-<span class="source-line-no">382</span><span id="line-382">        .add("presplit", opts.presplitRegions).add("splitPolicy", opts.splitPolicy)</span>
-<span class="source-line-no">383</span><span id="line-383">        .add("replicas", opts.replicas).add("families", opts.families).toString());</span>
-<span class="source-line-no">384</span><span id="line-384">    }</span>
-<span class="source-line-no">385</span><span id="line-385"></span>
-<span class="source-line-no">386</span><span id="line-386">    // remove an existing table</span>
-<span class="source-line-no">387</span><span id="line-387">    if (needsDelete) {</span>
-<span class="source-line-no">388</span><span id="line-388">      if (admin.isTableEnabled(tableName)) {</span>
-<span class="source-line-no">389</span><span id="line-389">        admin.disableTable(tableName);</span>
-<span class="source-line-no">390</span><span id="line-390">      }</span>
-<span class="source-line-no">391</span><span id="line-391">      admin.deleteTable(tableName);</span>
-<span class="source-line-no">392</span><span id="line-392">    }</span>
-<span class="source-line-no">393</span><span id="line-393"></span>
-<span class="source-line-no">394</span><span id="line-394">    // table creation is necessary</span>
-<span class="source-line-no">395</span><span id="line-395">    if (!exists || needsDelete) {</span>
-<span class="source-line-no">396</span><span id="line-396">      desc = getTableDescriptor(opts);</span>
-<span class="source-line-no">397</span><span id="line-397">      if (splits != null) {</span>
-<span class="source-line-no">398</span><span id="line-398">        if (LOG.isDebugEnabled()) {</span>
-<span class="source-line-no">399</span><span id="line-399">          for (int i = 0; i &lt; splits.length; i++) {</span>
-<span class="source-line-no">400</span><span id="line-400">            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));</span>
-<span class="source-line-no">401</span><span id="line-401">          }</span>
-<span class="source-line-no">402</span><span id="line-402">        }</span>
-<span class="source-line-no">403</span><span id="line-403">      }</span>
-<span class="source-line-no">404</span><span id="line-404">      if (splits != null) {</span>
-<span class="source-line-no">405</span><span id="line-405">        admin.createTable(desc, splits);</span>
-<span class="source-line-no">406</span><span id="line-406">      } else {</span>
-<span class="source-line-no">407</span><span id="line-407">        admin.createTable(desc);</span>
-<span class="source-line-no">408</span><span id="line-408">      }</span>
-<span class="source-line-no">409</span><span id="line-409">      LOG.info("Table " + desc + " created");</span>
-<span class="source-line-no">410</span><span id="line-410">    }</span>
-<span class="source-line-no">411</span><span id="line-411">    return admin.tableExists(tableName);</span>
-<span class="source-line-no">412</span><span id="line-412">  }</span>
-<span class="source-line-no">413</span><span id="line-413"></span>
-<span class="source-line-no">414</span><span id="line-414">  /**</span>
-<span class="source-line-no">415</span><span id="line-415">   * Create an HTableDescriptor from provided TestOptions.</span>
-<span class="source-line-no">416</span><span id="line-416">   */</span>
-<span class="source-line-no">417</span><span id="line-417">  protected static TableDescriptor getTableDescriptor(TestOptions opts) {</span>
-<span class="source-line-no">418</span><span id="line-418">    TableDescriptorBuilder builder =</span>
-<span class="source-line-no">419</span><span id="line-419">      TableDescriptorBuilder.newBuilder(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">420</span><span id="line-420"></span>
-<span class="source-line-no">421</span><span id="line-421">    for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">422</span><span id="line-422">      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">423</span><span id="line-423">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
-<span class="source-line-no">424</span><span id="line-424">        ColumnFamilyDescriptorBuilder.newBuilder(familyName);</span>
-<span class="source-line-no">425</span><span id="line-425">      cfBuilder.setDataBlockEncoding(opts.blockEncoding);</span>
-<span class="source-line-no">426</span><span id="line-426">      cfBuilder.setCompressionType(opts.compression);</span>
-<span class="source-line-no">427</span><span id="line-427">      cfBuilder.setEncryptionType(opts.encryption);</span>
-<span class="source-line-no">428</span><span id="line-428">      cfBuilder.setBloomFilterType(opts.bloomType);</span>
-<span class="source-line-no">429</span><span id="line-429">      cfBuilder.setBlocksize(opts.blockSize);</span>
-<span class="source-line-no">430</span><span id="line-430">      if (opts.inMemoryCF) {</span>
-<span class="source-line-no">431</span><span id="line-431">        cfBuilder.setInMemory(true);</span>
-<span class="source-line-no">432</span><span id="line-432">      }</span>
-<span class="source-line-no">433</span><span id="line-433">      cfBuilder.setInMemoryCompaction(opts.inMemoryCompaction);</span>
-<span class="source-line-no">434</span><span id="line-434">      builder.setColumnFamily(cfBuilder.build());</span>
-<span class="source-line-no">435</span><span id="line-435">    }</span>
-<span class="source-line-no">436</span><span id="line-436">    if (opts.replicas != DEFAULT_OPTS.replicas) {</span>
-<span class="source-line-no">437</span><span id="line-437">      builder.setRegionReplication(opts.replicas);</span>
-<span class="source-line-no">438</span><span id="line-438">    }</span>
-<span class="source-line-no">439</span><span id="line-439">    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {</span>
-<span class="source-line-no">440</span><span id="line-440">      builder.setRegionSplitPolicyClassName(opts.splitPolicy);</span>
-<span class="source-line-no">441</span><span id="line-441">    }</span>
-<span class="source-line-no">442</span><span id="line-442">    return builder.build();</span>
-<span class="source-line-no">443</span><span id="line-443">  }</span>
-<span class="source-line-no">444</span><span id="line-444"></span>
-<span class="source-line-no">445</span><span id="line-445">  /**</span>
-<span class="source-line-no">446</span><span id="line-446">   * generates splits based on total number of rows and specified split regions</span>
-<span class="source-line-no">447</span><span id="line-447">   */</span>
-<span class="source-line-no">448</span><span id="line-448">  protected static byte[][] getSplits(TestOptions opts) {</span>
-<span class="source-line-no">449</span><span id="line-449">    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions) return null;</span>
-<span class="source-line-no">450</span><span id="line-450"></span>
-<span class="source-line-no">451</span><span id="line-451">    int numSplitPoints = opts.presplitRegions - 1;</span>
-<span class="source-line-no">452</span><span id="line-452">    byte[][] splits = new byte[numSplitPoints][];</span>
-<span class="source-line-no">453</span><span id="line-453">    int jump = opts.totalRows / opts.presplitRegions;</span>
-<span class="source-line-no">454</span><span id="line-454">    for (int i = 0; i &lt; numSplitPoints; i++) {</span>
-<span class="source-line-no">455</span><span id="line-455">      int rowkey = jump * (1 + i);</span>
-<span class="source-line-no">456</span><span id="line-456">      splits[i] = format(rowkey);</span>
+<span class="source-line-no">252</span><span id="line-252"></span>
+<span class="source-line-no">253</span><span id="line-253">    @Override</span>
+<span class="source-line-no">254</span><span id="line-254">    public boolean equals(Object obj) {</span>
+<span class="source-line-no">255</span><span id="line-255">      if (this == obj) {</span>
+<span class="source-line-no">256</span><span id="line-256">        return true;</span>
+<span class="source-line-no">257</span><span id="line-257">      }</span>
+<span class="source-line-no">258</span><span id="line-258">      if (obj == null || getClass() != obj.getClass()) {</span>
+<span class="source-line-no">259</span><span id="line-259">        return false;</span>
+<span class="source-line-no">260</span><span id="line-260">      }</span>
+<span class="source-line-no">261</span><span id="line-261">      return this.compareTo((RunResult) obj) == 0;</span>
+<span class="source-line-no">262</span><span id="line-262">    }</span>
+<span class="source-line-no">263</span><span id="line-263"></span>
+<span class="source-line-no">264</span><span id="line-264">    @Override</span>
+<span class="source-line-no">265</span><span id="line-265">    public int hashCode() {</span>
+<span class="source-line-no">266</span><span id="line-266">      return Long.hashCode(duration);</span>
+<span class="source-line-no">267</span><span id="line-267">    }</span>
+<span class="source-line-no">268</span><span id="line-268">  }</span>
+<span class="source-line-no">269</span><span id="line-269"></span>
+<span class="source-line-no">270</span><span id="line-270">  /**</span>
+<span class="source-line-no">271</span><span id="line-271">   * Constructor</span>
+<span class="source-line-no">272</span><span id="line-272">   * @param conf Configuration object</span>
+<span class="source-line-no">273</span><span id="line-273">   */</span>
+<span class="source-line-no">274</span><span id="line-274">  public PerformanceEvaluation(final Configuration conf) {</span>
+<span class="source-line-no">275</span><span id="line-275">    super(conf);</span>
+<span class="source-line-no">276</span><span id="line-276">  }</span>
+<span class="source-line-no">277</span><span id="line-277"></span>
+<span class="source-line-no">278</span><span id="line-278">  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name,</span>
+<span class="source-line-no">279</span><span id="line-279">    String description) {</span>
+<span class="source-line-no">280</span><span id="line-280">    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);</span>
+<span class="source-line-no">281</span><span id="line-281">    COMMANDS.put(name, cmdDescriptor);</span>
+<span class="source-line-no">282</span><span id="line-282">  }</span>
+<span class="source-line-no">283</span><span id="line-283"></span>
+<span class="source-line-no">284</span><span id="line-284">  /**</span>
+<span class="source-line-no">285</span><span id="line-285">   * Implementations can have their status set.</span>
+<span class="source-line-no">286</span><span id="line-286">   */</span>
+<span class="source-line-no">287</span><span id="line-287">  interface Status {</span>
+<span class="source-line-no">288</span><span id="line-288">    /**</span>
+<span class="source-line-no">289</span><span id="line-289">     * Sets status</span>
+<span class="source-line-no">290</span><span id="line-290">     * @param msg status message</span>
+<span class="source-line-no">291</span><span id="line-291">     */</span>
+<span class="source-line-no">292</span><span id="line-292">    void setStatus(final String msg) throws IOException;</span>
+<span class="source-line-no">293</span><span id="line-293">  }</span>
+<span class="source-line-no">294</span><span id="line-294"></span>
+<span class="source-line-no">295</span><span id="line-295">  /**</span>
+<span class="source-line-no">296</span><span id="line-296">   * MapReduce job that runs a performance evaluation client in each map task.</span>
+<span class="source-line-no">297</span><span id="line-297">   */</span>
+<span class="source-line-no">298</span><span id="line-298">  public static class EvaluationMapTask</span>
+<span class="source-line-no">299</span><span id="line-299">    extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {</span>
+<span class="source-line-no">300</span><span id="line-300"></span>
+<span class="source-line-no">301</span><span id="line-301">    /** configuration parameter name that contains the command */</span>
+<span class="source-line-no">302</span><span id="line-302">    public final static String CMD_KEY = "EvaluationMapTask.command";</span>
+<span class="source-line-no">303</span><span id="line-303">    /** configuration parameter name that contains the PE impl */</span>
+<span class="source-line-no">304</span><span id="line-304">    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";</span>
+<span class="source-line-no">305</span><span id="line-305"></span>
+<span class="source-line-no">306</span><span id="line-306">    private Class&lt;? extends Test&gt; cmd;</span>
+<span class="source-line-no">307</span><span id="line-307"></span>
+<span class="source-line-no">308</span><span id="line-308">    @Override</span>
+<span class="source-line-no">309</span><span id="line-309">    protected void setup(Context context) throws IOException, InterruptedException {</span>
+<span class="source-line-no">310</span><span id="line-310">      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);</span>
+<span class="source-line-no">311</span><span id="line-311"></span>
+<span class="source-line-no">312</span><span id="line-312">      // this is required so that extensions of PE are instantiated within the</span>
+<span class="source-line-no">313</span><span id="line-313">      // map reduce task...</span>
+<span class="source-line-no">314</span><span id="line-314">      Class&lt;? extends PerformanceEvaluation&gt; peClass =</span>
+<span class="source-line-no">315</span><span id="line-315">        forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);</span>
+<span class="source-line-no">316</span><span id="line-316">      try {</span>
+<span class="source-line-no">317</span><span id="line-317">        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());</span>
+<span class="source-line-no">318</span><span id="line-318">      } catch (Exception e) {</span>
+<span class="source-line-no">319</span><span id="line-319">        throw new IllegalStateException("Could not instantiate PE instance", e);</span>
+<span class="source-line-no">320</span><span id="line-320">      }</span>
+<span class="source-line-no">321</span><span id="line-321">    }</span>
+<span class="source-line-no">322</span><span id="line-322"></span>
+<span class="source-line-no">323</span><span id="line-323">    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {</span>
+<span class="source-line-no">324</span><span id="line-324">      try {</span>
+<span class="source-line-no">325</span><span id="line-325">        return Class.forName(className).asSubclass(type);</span>
+<span class="source-line-no">326</span><span id="line-326">      } catch (ClassNotFoundException e) {</span>
+<span class="source-line-no">327</span><span id="line-327">        throw new IllegalStateException("Could not find class for name: " + className, e);</span>
+<span class="source-line-no">328</span><span id="line-328">      }</span>
+<span class="source-line-no">329</span><span id="line-329">    }</span>
+<span class="source-line-no">330</span><span id="line-330"></span>
+<span class="source-line-no">331</span><span id="line-331">    @Override</span>
+<span class="source-line-no">332</span><span id="line-332">    protected void map(LongWritable key, Text value, final Context context)</span>
+<span class="source-line-no">333</span><span id="line-333">      throws IOException, InterruptedException {</span>
+<span class="source-line-no">334</span><span id="line-334"></span>
+<span class="source-line-no">335</span><span id="line-335">      Status status = new Status() {</span>
+<span class="source-line-no">336</span><span id="line-336">        @Override</span>
+<span class="source-line-no">337</span><span id="line-337">        public void setStatus(String msg) {</span>
+<span class="source-line-no">338</span><span id="line-338">          context.setStatus(msg);</span>
+<span class="source-line-no">339</span><span id="line-339">        }</span>
+<span class="source-line-no">340</span><span id="line-340">      };</span>
+<span class="source-line-no">341</span><span id="line-341"></span>
+<span class="source-line-no">342</span><span id="line-342">      TestOptions opts = GSON.fromJson(value.toString(), TestOptions.class);</span>
+<span class="source-line-no">343</span><span id="line-343">      Configuration conf = HBaseConfiguration.create(context.getConfiguration());</span>
+<span class="source-line-no">344</span><span id="line-344">      final Connection con = ConnectionFactory.createConnection(conf);</span>
+<span class="source-line-no">345</span><span id="line-345">      AsyncConnection asyncCon = null;</span>
+<span class="source-line-no">346</span><span id="line-346">      try {</span>
+<span class="source-line-no">347</span><span id="line-347">        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();</span>
+<span class="source-line-no">348</span><span id="line-348">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">349</span><span id="line-349">        throw new IOException(e);</span>
+<span class="source-line-no">350</span><span id="line-350">      }</span>
+<span class="source-line-no">351</span><span id="line-351"></span>
+<span class="source-line-no">352</span><span id="line-352">      // Evaluation task</span>
+<span class="source-line-no">353</span><span id="line-353">      RunResult result =</span>
+<span class="source-line-no">354</span><span id="line-354">        PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);</span>
+<span class="source-line-no">355</span><span id="line-355">      // Collect how much time the thing took. Report as map output and</span>
+<span class="source-line-no">356</span><span id="line-356">      // to the ELAPSED_TIME counter.</span>
+<span class="source-line-no">357</span><span id="line-357">      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);</span>
+<span class="source-line-no">358</span><span id="line-358">      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);</span>
+<span class="source-line-no">359</span><span id="line-359">      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));</span>
+<span class="source-line-no">360</span><span id="line-360">      context.progress();</span>
+<span class="source-line-no">361</span><span id="line-361">    }</span>
+<span class="source-line-no">362</span><span id="line-362">  }</span>
+<span class="source-line-no">363</span><span id="line-363"></span>
+<span class="source-line-no">364</span><span id="line-364">  /*</span>
+<span class="source-line-no">365</span><span id="line-365">   * If table does not already exist, create. Also create a table when {@code opts.presplitRegions}</span>
+<span class="source-line-no">366</span><span id="line-366">   * is specified or when the existing table's region replica count doesn't match {@code</span>
+<span class="source-line-no">367</span><span id="line-367">   * opts.replicas}.</span>
+<span class="source-line-no">368</span><span id="line-368">   */</span>
+<span class="source-line-no">369</span><span id="line-369">  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {</span>
+<span class="source-line-no">370</span><span id="line-370">    TableName tableName = TableName.valueOf(opts.tableName);</span>
+<span class="source-line-no">371</span><span id="line-371">    boolean needsDelete = false, exists = admin.tableExists(tableName);</span>
+<span class="source-line-no">372</span><span id="line-372">    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")</span>
+<span class="source-line-no">373</span><span id="line-373">      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");</span>
+<span class="source-line-no">374</span><span id="line-374">    boolean isDeleteCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("delete");</span>
+<span class="source-line-no">375</span><span id="line-375">    if (!exists &amp;&amp; (isReadCmd || isDeleteCmd)) {</span>
+<span class="source-line-no">376</span><span id="line-376">      throw new IllegalStateException(</span>
+<span class="source-line-no">377</span><span id="line-377">        "Must specify an existing table for read commands. Run a write command first.");</span>
+<span class="source-line-no">378</span><span id="line-378">    }</span>
+<span class="source-line-no">379</span><span id="line-379">    TableDescriptor desc = exists ? admin.getDescriptor(TableName.valueOf(opts.tableName)) : null;</span>
+<span class="source-line-no">380</span><span id="line-380">    byte[][] splits = getSplits(opts);</span>
+<span class="source-line-no">381</span><span id="line-381"></span>
+<span class="source-line-no">382</span><span id="line-382">    // recreate the table when user has requested presplit or when existing</span>
+<span class="source-line-no">383</span><span id="line-383">    // {RegionSplitPolicy,replica count} does not match requested, or when the</span>
+<span class="source-line-no">384</span><span id="line-384">    // number of column families does not match requested.</span>
+<span class="source-line-no">385</span><span id="line-385">    if (</span>
+<span class="source-line-no">386</span><span id="line-386">      (exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions</span>
+<span class="source-line-no">387</span><span id="line-387">        &amp;&amp; opts.presplitRegions != admin.getRegions(tableName).size())</span>
+<span class="source-line-no">388</span><span id="line-388">        || (!isReadCmd &amp;&amp; desc != null</span>
+<span class="source-line-no">389</span><span id="line-389">          &amp;&amp; !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))</span>
+<span class="source-line-no">390</span><span id="line-390">        || (!(isReadCmd || isDeleteCmd) &amp;&amp; desc != null</span>
+<span class="source-line-no">391</span><span id="line-391">          &amp;&amp; desc.getRegionReplication() != opts.replicas)</span>
+<span class="source-line-no">392</span><span id="line-392">        || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)</span>
+<span class="source-line-no">393</span><span id="line-393">    ) {</span>
+<span class="source-line-no">394</span><span id="line-394">      needsDelete = true;</span>
+<span class="source-line-no">395</span><span id="line-395">      // wait, why did it delete my table?!?</span>
+<span class="source-line-no">396</span><span id="line-396">      LOG.debug(MoreObjects.toStringHelper("needsDelete").add("needsDelete", needsDelete)</span>
+<span class="source-line-no">397</span><span id="line-397">        .add("isReadCmd", isReadCmd).add("exists", exists).add("desc", desc)</span>
+<span class="source-line-no">398</span><span id="line-398">        .add("presplit", opts.presplitRegions).add("splitPolicy", opts.splitPolicy)</span>
+<span class="source-line-no">399</span><span id="line-399">        .add("replicas", opts.replicas).add("families", opts.families).toString());</span>
+<span class="source-line-no">400</span><span id="line-400">    }</span>
+<span class="source-line-no">401</span><span id="line-401"></span>
+<span class="source-line-no">402</span><span id="line-402">    // remove an existing table</span>
+<span class="source-line-no">403</span><span id="line-403">    if (needsDelete) {</span>
+<span class="source-line-no">404</span><span id="line-404">      if (admin.isTableEnabled(tableName)) {</span>
+<span class="source-line-no">405</span><span id="line-405">        admin.disableTable(tableName);</span>
+<span class="source-line-no">406</span><span id="line-406">      }</span>
+<span class="source-line-no">407</span><span id="line-407">      admin.deleteTable(tableName);</span>
+<span class="source-line-no">408</span><span id="line-408">    }</span>
+<span class="source-line-no">409</span><span id="line-409"></span>
+<span class="source-line-no">410</span><span id="line-410">    // table creation is necessary</span>
+<span class="source-line-no">411</span><span id="line-411">    if (!exists || needsDelete) {</span>
+<span class="source-line-no">412</span><span id="line-412">      desc = getTableDescriptor(opts);</span>
+<span class="source-line-no">413</span><span id="line-413">      if (splits != null) {</span>
+<span class="source-line-no">414</span><span id="line-414">        if (LOG.isDebugEnabled()) {</span>
+<span class="source-line-no">415</span><span id="line-415">          for (int i = 0; i &lt; splits.length; i++) {</span>
+<span class="source-line-no">416</span><span id="line-416">            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));</span>
+<span class="source-line-no">417</span><span id="line-417">          }</span>
+<span class="source-line-no">418</span><span id="line-418">        }</span>
+<span class="source-line-no">419</span><span id="line-419">      }</span>
+<span class="source-line-no">420</span><span id="line-420">      if (splits != null) {</span>
+<span class="source-line-no">421</span><span id="line-421">        admin.createTable(desc, splits);</span>
+<span class="source-line-no">422</span><span id="line-422">      } else {</span>
+<span class="source-line-no">423</span><span id="line-423">        admin.createTable(desc);</span>
+<span class="source-line-no">424</span><span id="line-424">      }</span>
+<span class="source-line-no">425</span><span id="line-425">      LOG.info("Table " + desc + " created");</span>
+<span class="source-line-no">426</span><span id="line-426">    }</span>
+<span class="source-line-no">427</span><span id="line-427">    return admin.tableExists(tableName);</span>
+<span class="source-line-no">428</span><span id="line-428">  }</span>
+<span class="source-line-no">429</span><span id="line-429"></span>
+<span class="source-line-no">430</span><span id="line-430">  /**</span>
+<span class="source-line-no">431</span><span id="line-431">   * Create an HTableDescriptor from provided TestOptions.</span>
+<span class="source-line-no">432</span><span id="line-432">   */</span>
+<span class="source-line-no">433</span><span id="line-433">  protected static TableDescriptor getTableDescriptor(TestOptions opts) {</span>
+<span class="source-line-no">434</span><span id="line-434">    TableDescriptorBuilder builder =</span>
+<span class="source-line-no">435</span><span id="line-435">      TableDescriptorBuilder.newBuilder(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">436</span><span id="line-436"></span>
+<span class="source-line-no">437</span><span id="line-437">    for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">438</span><span id="line-438">      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">439</span><span id="line-439">      ColumnFamilyDescriptorBuilder cfBuilder =</span>
+<span class="source-line-no">440</span><span id="line-440">        ColumnFamilyDescriptorBuilder.newBuilder(familyName);</span>
+<span class="source-line-no">441</span><span id="line-441">      cfBuilder.setDataBlockEncoding(opts.blockEncoding);</span>
+<span class="source-line-no">442</span><span id="line-442">      cfBuilder.setCompressionType(opts.compression);</span>
+<span class="source-line-no">443</span><span id="line-443">      cfBuilder.setEncryptionType(opts.encryption);</span>
+<span class="source-line-no">444</span><span id="line-444">      cfBuilder.setBloomFilterType(opts.bloomType);</span>
+<span class="source-line-no">445</span><span id="line-445">      cfBuilder.setBlocksize(opts.blockSize);</span>
+<span class="source-line-no">446</span><span id="line-446">      if (opts.inMemoryCF) {</span>
+<span class="source-line-no">447</span><span id="line-447">        cfBuilder.setInMemory(true);</span>
+<span class="source-line-no">448</span><span id="line-448">      }</span>
+<span class="source-line-no">449</span><span id="line-449">      cfBuilder.setInMemoryCompaction(opts.inMemoryCompaction);</span>
+<span class="source-line-no">450</span><span id="line-450">      builder.setColumnFamily(cfBuilder.build());</span>
+<span class="source-line-no">451</span><span id="line-451">    }</span>
+<span class="source-line-no">452</span><span id="line-452">    if (opts.replicas != DEFAULT_OPTS.replicas) {</span>
+<span class="source-line-no">453</span><span id="line-453">      builder.setRegionReplication(opts.replicas);</span>
+<span class="source-line-no">454</span><span id="line-454">    }</span>
+<span class="source-line-no">455</span><span id="line-455">    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {</span>
+<span class="source-line-no">456</span><span id="line-456">      builder.setRegionSplitPolicyClassName(opts.splitPolicy);</span>
 <span class="source-line-no">457</span><span id="line-457">    }</span>
-<span class="source-line-no">458</span><span id="line-458">    return splits;</span>
+<span class="source-line-no">458</span><span id="line-458">    return builder.build();</span>
 <span class="source-line-no">459</span><span id="line-459">  }</span>
 <span class="source-line-no">460</span><span id="line-460"></span>
-<span class="source-line-no">461</span><span id="line-461">  static void setupConnectionCount(final TestOptions opts) {</span>
-<span class="source-line-no">462</span><span id="line-462">    if (opts.oneCon) {</span>
-<span class="source-line-no">463</span><span id="line-463">      opts.connCount = 1;</span>
-<span class="source-line-no">464</span><span id="line-464">    } else {</span>
-<span class="source-line-no">465</span><span id="line-465">      if (opts.connCount == -1) {</span>
-<span class="source-line-no">466</span><span id="line-466">        // set to thread number if connCount is not set</span>
-<span class="source-line-no">467</span><span id="line-467">        opts.connCount = opts.numClientThreads;</span>
-<span class="source-line-no">468</span><span id="line-468">      }</span>
-<span class="source-line-no">469</span><span id="line-469">    }</span>
-<span class="source-line-no">470</span><span id="line-470">  }</span>
-<span class="source-line-no">471</span><span id="line-471"></span>
-<span class="source-line-no">472</span><span id="line-472">  /*</span>
-<span class="source-line-no">473</span><span id="line-473">   * Run all clients in this vm each to its own thread.</span>
-<span class="source-line-no">474</span><span id="line-474">   */</span>
-<span class="source-line-no">475</span><span id="line-475">  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)</span>
-<span class="source-line-no">476</span><span id="line-476">    throws IOException, InterruptedException, ExecutionException {</span>
-<span class="source-line-no">477</span><span id="line-477">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
-<span class="source-line-no">478</span><span id="line-478">    assert cmd != null;</span>
-<span class="source-line-no">479</span><span id="line-479">    @SuppressWarnings("unchecked")</span>
-<span class="source-line-no">480</span><span id="line-480">    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];</span>
-<span class="source-line-no">481</span><span id="line-481">    RunResult[] results = new RunResult[opts.numClientThreads];</span>
-<span class="source-line-no">482</span><span id="line-482">    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,</span>
-<span class="source-line-no">483</span><span id="line-483">      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());</span>
-<span class="source-line-no">484</span><span id="line-484">    setupConnectionCount(opts);</span>
-<span class="source-line-no">485</span><span id="line-485">    final Connection[] cons = new Connection[opts.connCount];</span>
-<span class="source-line-no">486</span><span id="line-486">    final AsyncConnection[] asyncCons = new AsyncConnection[opts.connCount];</span>
-<span class="source-line-no">487</span><span id="line-487">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
-<span class="source-line-no">488</span><span id="line-488">      cons[i] = ConnectionFactory.createConnection(conf);</span>
-<span class="source-line-no">489</span><span id="line-489">      asyncCons[i] = ConnectionFactory.createAsyncConnection(conf).get();</span>
-<span class="source-line-no">490</span><span id="line-490">    }</span>
-<span class="source-line-no">491</span><span id="line-491">    LOG</span>
-<span class="source-line-no">492</span><span id="line-492">      .info("Created " + opts.connCount + " connections for " + opts.numClientThreads + " threads");</span>
-<span class="source-line-no">493</span><span id="line-493">    for (int i = 0; i &lt; threads.length; i++) {</span>
-<span class="source-line-no">494</span><span id="line-494">      final int index = i;</span>
-<span class="source-line-no">495</span><span id="line-495">      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {</span>
-<span class="source-line-no">496</span><span id="line-496">        @Override</span>
-<span class="source-line-no">497</span><span id="line-497">        public RunResult call() throws Exception {</span>
-<span class="source-line-no">498</span><span id="line-498">          TestOptions threadOpts = new TestOptions(opts);</span>
-<span class="source-line-no">499</span><span id="line-499">          final Connection con = cons[index % cons.length];</span>
-<span class="source-line-no">500</span><span id="line-500">          final AsyncConnection asyncCon = asyncCons[index % asyncCons.length];</span>
-<span class="source-line-no">501</span><span id="line-501">          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;</span>
-<span class="source-line-no">502</span><span id="line-502">          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {</span>
-<span class="source-line-no">503</span><span id="line-503">            @Override</span>
-<span class="source-line-no">504</span><span id="line-504">            public void setStatus(final String msg) throws IOException {</span>
-<span class="source-line-no">505</span><span id="line-505">              LOG.info(msg);</span>
-<span class="source-line-no">506</span><span id="line-506">            }</span>
-<span class="source-line-no">507</span><span id="line-507">          });</span>
-<span class="source-line-no">508</span><span id="line-508">          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration</span>
-<span class="source-line-no">509</span><span id="line-509">            + "ms over " + threadOpts.perClientRunRows + " rows");</span>
-<span class="source-line-no">510</span><span id="line-510">          if (opts.latencyThreshold &gt; 0) {</span>
-<span class="source-line-no">511</span><span id="line-511">            LOG.info("Number of replies over latency threshold " + opts.latencyThreshold</span>
-<span class="source-line-no">512</span><span id="line-512">              + "(ms) is " + run.numbOfReplyOverThreshold);</span>
-<span class="source-line-no">513</span><span id="line-513">          }</span>
-<span class="source-line-no">514</span><span id="line-514">          return run;</span>
-<span class="source-line-no">515</span><span id="line-515">        }</span>
-<span class="source-line-no">516</span><span id="line-516">      });</span>
-<span class="source-line-no">517</span><span id="line-517">    }</span>
-<span class="source-line-no">518</span><span id="line-518">    pool.shutdown();</span>
-<span class="source-line-no">519</span><span id="line-519"></span>
-<span class="source-line-no">520</span><span id="line-520">    for (int i = 0; i &lt; threads.length; i++) {</span>
-<span class="source-line-no">521</span><span id="line-521">      try {</span>
-<span class="source-line-no">522</span><span id="line-522">        results[i] = threads[i].get();</span>
-<span class="source-line-no">523</span><span id="line-523">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">524</span><span id="line-524">        throw new IOException(e.getCause());</span>
-<span class="source-line-no">525</span><span id="line-525">      }</span>
-<span class="source-line-no">526</span><span id="line-526">    }</span>
-<span class="source-line-no">527</span><span id="line-527">    final String test = cmd.getSimpleName();</span>
-<span class="source-line-no">528</span><span id="line-528">    LOG.info("[" + test + "] Summary of timings (ms): " + Arrays.toString(results));</span>
-<span class="source-line-no">529</span><span id="line-529">    Arrays.sort(results);</span>
-<span class="source-line-no">530</span><span id="line-530">    long total = 0;</span>
-<span class="source-line-no">531</span><span id="line-531">    float avgLatency = 0;</span>
-<span class="source-line-no">532</span><span id="line-532">    float avgTPS = 0;</span>
-<span class="source-line-no">533</span><span id="line-533">    long replicaWins = 0;</span>
-<span class="source-line-no">534</span><span id="line-534">    for (RunResult result : results) {</span>
-<span class="source-line-no">535</span><span id="line-535">      total += result.duration;</span>
-<span class="source-line-no">536</span><span id="line-536">      avgLatency += result.hist.getSnapshot().getMean();</span>
-<span class="source-line-no">537</span><span id="line-537">      avgTPS += opts.perClientRunRows * 1.0f / result.duration;</span>
-<span class="source-line-no">538</span><span id="line-538">      replicaWins += result.numOfReplyFromReplica;</span>
-<span class="source-line-no">539</span><span id="line-539">    }</span>
-<span class="source-line-no">540</span><span id="line-540">    avgTPS *= 1000; // ms to second</span>
-<span class="source-line-no">541</span><span id="line-541">    avgLatency = avgLatency / results.length;</span>
-<span class="source-line-no">542</span><span id="line-542">    LOG.info("[" + test + " duration ]" + "\tMin: " + results[0] + "ms" + "\tMax: "</span>
-<span class="source-line-no">543</span><span id="line-543">      + results[results.length - 1] + "ms" + "\tAvg: " + (total / results.length) + "ms");</span>
-<span class="source-line-no">544</span><span id="line-544">    LOG.info("[ Avg latency (us)]\t" + Math.round(avgLatency));</span>
-<span class="source-line-no">545</span><span id="line-545">    LOG.info("[ Avg TPS/QPS]\t" + Math.round(avgTPS) + "\t row per second");</span>
-<span class="source-line-no">546</span><span id="line-546">    if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">547</span><span id="line-547">      LOG.info("[results from replica regions] " + replicaWins);</span>
-<span class="source-line-no">548</span><span id="line-548">    }</span>
-<span class="source-line-no">549</span><span id="line-549"></span>
-<span class="source-line-no">550</span><span id="line-550">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
-<span class="source-line-no">551</span><span id="line-551">      cons[i].close();</span>
-<span class="source-line-no">552</span><span id="line-552">      asyncCons[i].close();</span>
-<span class="source-line-no">553</span><span id="line-553">    }</span>
-<span class="source-line-no">554</span><span id="line-554"></span>
-<span class="source-line-no">555</span><span id="line-555">    return results;</span>
-<span class="source-line-no">556</span><span id="line-556">  }</span>
-<span class="source-line-no">557</span><span id="line-557"></span>
-<span class="source-line-no">558</span><span id="line-558">  /*</span>
-<span class="source-line-no">559</span><span id="line-559">   * Run a mapreduce job. Run as many maps as asked-for clients. Before we start up the job, write</span>
-<span class="source-line-no">560</span><span id="line-560">   * out an input file with instruction per client regards which row they are to start on.</span>
-<span class="source-line-no">561</span><span id="line-561">   * @param cmd Command to run.</span>
-<span class="source-line-no">562</span><span id="line-562">   */</span>
-<span class="source-line-no">563</span><span id="line-563">  static Job doMapReduce(TestOptions opts, final Configuration conf)</span>
-<span class="source-line-no">564</span><span id="line-564">    throws IOException, InterruptedException, ClassNotFoundException {</span>
-<span class="source-line-no">565</span><span id="line-565">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
-<span class="source-line-no">566</span><span id="line-566">    assert cmd != null;</span>
-<span class="source-line-no">567</span><span id="line-567">    Path inputDir = writeInputFile(conf, opts);</span>
-<span class="source-line-no">568</span><span id="line-568">    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());</span>
-<span class="source-line-no">569</span><span id="line-569">    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());</span>
-<span class="source-line-no">570</span><span id="line-570">    Job job = Job.getInstance(conf);</span>
-<span class="source-line-no">571</span><span id="line-571">    job.setJarByClass(PerformanceEvaluation.class);</span>
-<span class="source-line-no">572</span><span id="line-572">    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);</span>
+<span class="source-line-no">461</span><span id="line-461">  /**</span>
+<span class="source-line-no">462</span><span id="line-462">   * generates splits based on total number of rows and specified split regions</span>
+<span class="source-line-no">463</span><span id="line-463">   */</span>
+<span class="source-line-no">464</span><span id="line-464">  protected static byte[][] getSplits(TestOptions opts) {</span>
+<span class="source-line-no">465</span><span id="line-465">    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions) return null;</span>
+<span class="source-line-no">466</span><span id="line-466"></span>
+<span class="source-line-no">467</span><span id="line-467">    int numSplitPoints = opts.presplitRegions - 1;</span>
+<span class="source-line-no">468</span><span id="line-468">    byte[][] splits = new byte[numSplitPoints][];</span>
+<span class="source-line-no">469</span><span id="line-469">    int jump = opts.totalRows / opts.presplitRegions;</span>
+<span class="source-line-no">470</span><span id="line-470">    for (int i = 0; i &lt; numSplitPoints; i++) {</span>
+<span class="source-line-no">471</span><span id="line-471">      int rowkey = jump * (1 + i);</span>
+<span class="source-line-no">472</span><span id="line-472">      splits[i] = format(rowkey);</span>
+<span class="source-line-no">473</span><span id="line-473">    }</span>
+<span class="source-line-no">474</span><span id="line-474">    return splits;</span>
+<span class="source-line-no">475</span><span id="line-475">  }</span>
+<span class="source-line-no">476</span><span id="line-476"></span>
+<span class="source-line-no">477</span><span id="line-477">  static void setupConnectionCount(final TestOptions opts) {</span>
+<span class="source-line-no">478</span><span id="line-478">    if (opts.oneCon) {</span>
+<span class="source-line-no">479</span><span id="line-479">      opts.connCount = 1;</span>
+<span class="source-line-no">480</span><span id="line-480">    } else {</span>
+<span class="source-line-no">481</span><span id="line-481">      if (opts.connCount == -1) {</span>
+<span class="source-line-no">482</span><span id="line-482">        // set to thread number if connCount is not set</span>
+<span class="source-line-no">483</span><span id="line-483">        opts.connCount = opts.numClientThreads;</span>
+<span class="source-line-no">484</span><span id="line-484">      }</span>
+<span class="source-line-no">485</span><span id="line-485">    }</span>
+<span class="source-line-no">486</span><span id="line-486">  }</span>
+<span class="source-line-no">487</span><span id="line-487"></span>
+<span class="source-line-no">488</span><span id="line-488">  /*</span>
+<span class="source-line-no">489</span><span id="line-489">   * Run all clients in this vm each to its own thread.</span>
+<span class="source-line-no">490</span><span id="line-490">   */</span>
+<span class="source-line-no">491</span><span id="line-491">  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)</span>
+<span class="source-line-no">492</span><span id="line-492">    throws IOException, InterruptedException, ExecutionException {</span>
+<span class="source-line-no">493</span><span id="line-493">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
+<span class="source-line-no">494</span><span id="line-494">    assert cmd != null;</span>
+<span class="source-line-no">495</span><span id="line-495">    @SuppressWarnings("unchecked")</span>
+<span class="source-line-no">496</span><span id="line-496">    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];</span>
+<span class="source-line-no">497</span><span id="line-497">    RunResult[] results = new RunResult[opts.numClientThreads];</span>
+<span class="source-line-no">498</span><span id="line-498">    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,</span>
+<span class="source-line-no">499</span><span id="line-499">      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());</span>
+<span class="source-line-no">500</span><span id="line-500">    setupConnectionCount(opts);</span>
+<span class="source-line-no">501</span><span id="line-501">    final Connection[] cons = new Connection[opts.connCount];</span>
+<span class="source-line-no">502</span><span id="line-502">    final AsyncConnection[] asyncCons = new AsyncConnection[opts.connCount];</span>
+<span class="source-line-no">503</span><span id="line-503">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
+<span class="source-line-no">504</span><span id="line-504">      cons[i] = ConnectionFactory.createConnection(conf);</span>
+<span class="source-line-no">505</span><span id="line-505">      asyncCons[i] = ConnectionFactory.createAsyncConnection(conf).get();</span>
+<span class="source-line-no">506</span><span id="line-506">    }</span>
+<span class="source-line-no">507</span><span id="line-507">    LOG</span>
+<span class="source-line-no">508</span><span id="line-508">      .info("Created " + opts.connCount + " connections for " + opts.numClientThreads + " threads");</span>
+<span class="source-line-no">509</span><span id="line-509">    for (int i = 0; i &lt; threads.length; i++) {</span>
+<span class="source-line-no">510</span><span id="line-510">      final int index = i;</span>
+<span class="source-line-no">511</span><span id="line-511">      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {</span>
+<span class="source-line-no">512</span><span id="line-512">        @Override</span>
+<span class="source-line-no">513</span><span id="line-513">        public RunResult call() throws Exception {</span>
+<span class="source-line-no">514</span><span id="line-514">          TestOptions threadOpts = new TestOptions(opts);</span>
+<span class="source-line-no">515</span><span id="line-515">          final Connection con = cons[index % cons.length];</span>
+<span class="source-line-no">516</span><span id="line-516">          final AsyncConnection asyncCon = asyncCons[index % asyncCons.length];</span>
+<span class="source-line-no">517</span><span id="line-517">          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;</span>
+<span class="source-line-no">518</span><span id="line-518">          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {</span>
+<span class="source-line-no">519</span><span id="line-519">            @Override</span>
+<span class="source-line-no">520</span><span id="line-520">            public void setStatus(final String msg) throws IOException {</span>
+<span class="source-line-no">521</span><span id="line-521">              LOG.info(msg);</span>
+<span class="source-line-no">522</span><span id="line-522">            }</span>
+<span class="source-line-no">523</span><span id="line-523">          });</span>
+<span class="source-line-no">524</span><span id="line-524">          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration</span>
+<span class="source-line-no">525</span><span id="line-525">            + "ms over " + threadOpts.perClientRunRows + " rows");</span>
+<span class="source-line-no">526</span><span id="line-526">          if (opts.latencyThreshold &gt; 0) {</span>
+<span class="source-line-no">527</span><span id="line-527">            LOG.info("Number of replies over latency threshold " + opts.latencyThreshold</span>
+<span class="source-line-no">528</span><span id="line-528">              + "(ms) is " + run.numbOfReplyOverThreshold);</span>
+<span class="source-line-no">529</span><span id="line-529">          }</span>
+<span class="source-line-no">530</span><span id="line-530">          return run;</span>
+<span class="source-line-no">531</span><span id="line-531">        }</span>
+<span class="source-line-no">532</span><span id="line-532">      });</span>
+<span class="source-line-no">533</span><span id="line-533">    }</span>
+<span class="source-line-no">534</span><span id="line-534">    pool.shutdown();</span>
+<span class="source-line-no">535</span><span id="line-535"></span>
+<span class="source-line-no">536</span><span id="line-536">    for (int i = 0; i &lt; threads.length; i++) {</span>
+<span class="source-line-no">537</span><span id="line-537">      try {</span>
+<span class="source-line-no">538</span><span id="line-538">        results[i] = threads[i].get();</span>
+<span class="source-line-no">539</span><span id="line-539">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">540</span><span id="line-540">        throw new IOException(e.getCause());</span>
+<span class="source-line-no">541</span><span id="line-541">      }</span>
+<span class="source-line-no">542</span><span id="line-542">    }</span>
+<span class="source-line-no">543</span><span id="line-543">    final String test = cmd.getSimpleName();</span>
+<span class="source-line-no">544</span><span id="line-544">    LOG.info("[" + test + "] Summary of timings (ms): " + Arrays.toString(results));</span>
+<span class="source-line-no">545</span><span id="line-545">    Arrays.sort(results);</span>
+<span class="source-line-no">546</span><span id="line-546">    long total = 0;</span>
+<span class="source-line-no">547</span><span id="line-547">    float avgLatency = 0;</span>
+<span class="source-line-no">548</span><span id="line-548">    float avgTPS = 0;</span>
+<span class="source-line-no">549</span><span id="line-549">    long replicaWins = 0;</span>
+<span class="source-line-no">550</span><span id="line-550">    for (RunResult result : results) {</span>
+<span class="source-line-no">551</span><span id="line-551">      total += result.duration;</span>
+<span class="source-line-no">552</span><span id="line-552">      avgLatency += result.hist.getSnapshot().getMean();</span>
+<span class="source-line-no">553</span><span id="line-553">      avgTPS += opts.perClientRunRows * 1.0f / result.duration;</span>
+<span class="source-line-no">554</span><span id="line-554">      replicaWins += result.numOfReplyFromReplica;</span>
+<span class="source-line-no">555</span><span id="line-555">    }</span>
+<span class="source-line-no">556</span><span id="line-556">    avgTPS *= 1000; // ms to second</span>
+<span class="source-line-no">557</span><span id="line-557">    avgLatency = avgLatency / results.length;</span>
+<span class="source-line-no">558</span><span id="line-558">    LOG.info("[" + test + " duration ]" + "\tMin: " + results[0] + "ms" + "\tMax: "</span>
+<span class="source-line-no">559</span><span id="line-559">      + results[results.length - 1] + "ms" + "\tAvg: " + (total / results.length) + "ms");</span>
+<span class="source-line-no">560</span><span id="line-560">    LOG.info("[ Avg latency (us)]\t" + Math.round(avgLatency));</span>
+<span class="source-line-no">561</span><span id="line-561">    LOG.info("[ Avg TPS/QPS]\t" + Math.round(avgTPS) + "\t row per second");</span>
+<span class="source-line-no">562</span><span id="line-562">    if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">563</span><span id="line-563">      LOG.info("[results from replica regions] " + replicaWins);</span>
+<span class="source-line-no">564</span><span id="line-564">    }</span>
+<span class="source-line-no">565</span><span id="line-565"></span>
+<span class="source-line-no">566</span><span id="line-566">    for (int i = 0; i &lt; opts.connCount; i++) {</span>
+<span class="source-line-no">567</span><span id="line-567">      cons[i].close();</span>
+<span class="source-line-no">568</span><span id="line-568">      asyncCons[i].close();</span>
+<span class="source-line-no">569</span><span id="line-569">    }</span>
+<span class="source-line-no">570</span><span id="line-570"></span>
+<span class="source-line-no">571</span><span id="line-571">    return results;</span>
+<span class="source-line-no">572</span><span id="line-572">  }</span>
 <span class="source-line-no">573</span><span id="line-573"></span>
-<span class="source-line-no">574</span><span id="line-574">    job.setInputFormatClass(NLineInputFormat.class);</span>
-<span class="source-line-no">575</span><span id="line-575">    NLineInputFormat.setInputPaths(job, inputDir);</span>
-<span class="source-line-no">576</span><span id="line-576">    // this is default, but be explicit about it just in case.</span>
-<span class="source-line-no">577</span><span id="line-577">    NLineInputFormat.setNumLinesPerSplit(job, 1);</span>
-<span class="source-line-no">578</span><span id="line-578"></span>
-<span class="source-line-no">579</span><span id="line-579">    job.setOutputKeyClass(LongWritable.class);</span>
-<span class="source-line-no">580</span><span id="line-580">    job.setOutputValueClass(LongWritable.class);</span>
-<span class="source-line-no">581</span><span id="line-581"></span>
-<span class="source-line-no">582</span><span id="line-582">    job.setMapperClass(EvaluationMapTask.class);</span>
-<span class="source-line-no">583</span><span id="line-583">    job.setReducerClass(LongSumReducer.class);</span>
-<span class="source-line-no">584</span><span id="line-584"></span>
-<span class="source-line-no">585</span><span id="line-585">    job.setNumReduceTasks(1);</span>
-<span class="source-line-no">586</span><span id="line-586"></span>
-<span class="source-line-no">587</span><span id="line-587">    job.setOutputFormatClass(TextOutputFormat.class);</span>
-<span class="source-line-no">588</span><span id="line-588">    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));</span>
+<span class="source-line-no">574</span><span id="line-574">  /*</span>
+<span class="source-line-no">575</span><span id="line-575">   * Run a mapreduce job. Run as many maps as asked-for clients. Before we start up the job, write</span>
+<span class="source-line-no">576</span><span id="line-576">   * out an input file with instruction per client regards which row they are to start on.</span>
+<span class="source-line-no">577</span><span id="line-577">   * @param cmd Command to run.</span>
+<span class="source-line-no">578</span><span id="line-578">   */</span>
+<span class="source-line-no">579</span><span id="line-579">  static Job doMapReduce(TestOptions opts, final Configuration conf)</span>
+<span class="source-line-no">580</span><span id="line-580">    throws IOException, InterruptedException, ClassNotFoundException {</span>
+<span class="source-line-no">581</span><span id="line-581">    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);</span>
+<span class="source-line-no">582</span><span id="line-582">    assert cmd != null;</span>
+<span class="source-line-no">583</span><span id="line-583">    Path inputDir = writeInputFile(conf, opts);</span>
+<span class="source-line-no">584</span><span id="line-584">    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());</span>
+<span class="source-line-no">585</span><span id="line-585">    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());</span>
+<span class="source-line-no">586</span><span id="line-586">    Job job = Job.getInstance(conf);</span>
+<span class="source-line-no">587</span><span id="line-587">    job.setJarByClass(PerformanceEvaluation.class);</span>
+<span class="source-line-no">588</span><span id="line-588">    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);</span>
 <span class="source-line-no">589</span><span id="line-589"></span>
-<span class="source-line-no">590</span><span id="line-590">    TableMapReduceUtil.addDependencyJars(job);</span>
-<span class="source-line-no">591</span><span id="line-591">    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(), Histogram.class, // yammer</span>
-<span class="source-line-no">592</span><span id="line-592">                                                                                            // metrics</span>
-<span class="source-line-no">593</span><span id="line-593">      Gson.class, // gson</span>
-<span class="source-line-no">594</span><span id="line-594">      FilterAllFilter.class // hbase-server tests jar</span>
-<span class="source-line-no">595</span><span id="line-595">    );</span>
-<span class="source-line-no">596</span><span id="line-596"></span>
-<span class="source-line-no">597</span><span id="line-597">    TableMapReduceUtil.initCredentials(job);</span>
-<span class="source-line-no">598</span><span id="line-598"></span>
-<span class="source-line-no">599</span><span id="line-599">    job.waitForCompletion(true);</span>
-<span class="source-line-no">600</span><span id="line-600">    return job;</span>
-<span class="source-line-no">601</span><span id="line-601">  }</span>
+<span class="source-line-no">590</span><span id="line-590">    job.setInputFormatClass(NLineInputFormat.class);</span>
+<span class="source-line-no">591</span><span id="line-591">    NLineInputFormat.setInputPaths(job, inputDir);</span>
+<span class="source-line-no">592</span><span id="line-592">    // this is default, but be explicit about it just in case.</span>
+<span class="source-line-no">593</span><span id="line-593">    NLineInputFormat.setNumLinesPerSplit(job, 1);</span>
+<span class="source-line-no">594</span><span id="line-594"></span>
+<span class="source-line-no">595</span><span id="line-595">    job.setOutputKeyClass(LongWritable.class);</span>
+<span class="source-line-no">596</span><span id="line-596">    job.setOutputValueClass(LongWritable.class);</span>
+<span class="source-line-no">597</span><span id="line-597"></span>
+<span class="source-line-no">598</span><span id="line-598">    job.setMapperClass(EvaluationMapTask.class);</span>
+<span class="source-line-no">599</span><span id="line-599">    job.setReducerClass(LongSumReducer.class);</span>
+<span class="source-line-no">600</span><span id="line-600"></span>
+<span class="source-line-no">601</span><span id="line-601">    job.setNumReduceTasks(1);</span>
 <span class="source-line-no">602</span><span id="line-602"></span>
-<span class="source-line-no">603</span><span id="line-603">  /**</span>
-<span class="source-line-no">604</span><span id="line-604">   * Each client has one mapper to do the work, and client do the resulting count in a map task.</span>
-<span class="source-line-no">605</span><span id="line-605">   */</span>
-<span class="source-line-no">606</span><span id="line-606"></span>
-<span class="source-line-no">607</span><span id="line-607">  static String JOB_INPUT_FILENAME = "input.txt";</span>
-<span class="source-line-no">608</span><span id="line-608"></span>
-<span class="source-line-no">609</span><span id="line-609">  /*</span>
-<span class="source-line-no">610</span><span id="line-610">   * Write input file of offsets-per-client for the mapreduce job.</span>
-<span class="source-line-no">611</span><span id="line-611">   * @param c Configuration</span>
-<span class="source-line-no">612</span><span id="line-612">   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME</span>
-<span class="source-line-no">613</span><span id="line-613">   */</span>
-<span class="source-line-no">614</span><span id="line-614">  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {</span>
-<span class="source-line-no">615</span><span id="line-615">    return writeInputFile(c, opts, new Path("."));</span>
-<span class="source-line-no">616</span><span id="line-616">  }</span>
-<span class="source-line-no">617</span><span id="line-617"></span>
-<span class="source-line-no">618</span><span id="line-618">  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)</span>
-<span class="source-line-no">619</span><span id="line-619">    throws IOException {</span>
-<span class="source-line-no">620</span><span id="line-620">    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");</span>
-<span class="source-line-no">621</span><span id="line-621">    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));</span>
-<span class="source-line-no">622</span><span id="line-622">    Path inputDir = new Path(jobdir, "inputs");</span>
-<span class="source-line-no">623</span><span id="line-623"></span>
-<span class="source-line-no">624</span><span id="line-624">    FileSystem fs = FileSystem.get(c);</span>
-<span class="source-line-no">625</span><span id="line-625">    fs.mkdirs(inputDir);</span>
-<span class="source-line-no">626</span><span id="line-626"></span>
-<span class="source-line-no">627</span><span id="line-627">    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);</span>
-<span class="source-line-no">628</span><span id="line-628">    PrintStream out = new PrintStream(fs.create(inputFile));</span>
-<span class="source-line-no">629</span><span id="line-629">    // Make input random.</span>
-<span class="source-line-no">630</span><span id="line-630">    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();</span>
-<span class="source-line-no">631</span><span id="line-631">    Hash h = MurmurHash.getInstance();</span>
-<span class="source-line-no">632</span><span id="line-632">    int perClientRows = (opts.totalRows / opts.numClientThreads);</span>
-<span class="source-line-no">633</span><span id="line-633">    try {</span>
-<span class="source-line-no">634</span><span id="line-634">      for (int j = 0; j &lt; opts.numClientThreads; j++) {</span>
-<span class="source-line-no">635</span><span id="line-635">        TestOptions next = new TestOptions(opts);</span>
-<span class="source-line-no">636</span><span id="line-636">        next.startRow = j * perClientRows;</span>
-<span class="source-line-no">637</span><span id="line-637">        next.perClientRunRows = perClientRows;</span>
-<span class="source-line-no">638</span><span id="line-638">        String s = GSON.toJson(next);</span>
-<span class="source-line-no">639</span><span id="line-639">        LOG.info("Client=" + j + ", input=" + s);</span>
-<span class="source-line-no">640</span><span id="line-640">        byte[] b = Bytes.toBytes(s);</span>
-<span class="source-line-no">641</span><span id="line-641">        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);</span>
-<span class="source-line-no">642</span><span id="line-642">        m.put(hash, s);</span>
-<span class="source-line-no">643</span><span id="line-643">      }</span>
-<span class="source-line-no">644</span><span id="line-644">      for (Map.Entry&lt;Integer, String&gt; e : m.entrySet()) {</span>
-<span class="source-line-no">645</span><span id="line-645">        out.println(e.getValue());</span>
-<span class="source-line-no">646</span><span id="line-646">      }</span>
-<span class="source-line-no">647</span><span id="line-647">    } finally {</span>
-<span class="source-line-no">648</span><span id="line-648">      out.close();</span>
-<span class="source-line-no">649</span><span id="line-649">    }</span>
-<span class="source-line-no">650</span><span id="line-650">    return inputDir;</span>
-<span class="source-line-no">651</span><span id="line-651">  }</span>
-<span class="source-line-no">652</span><span id="line-652"></span>
-<span class="source-line-no">653</span><span id="line-653">  /**</span>
-<span class="source-line-no">654</span><span id="line-654">   * Describes a command.</span>
-<span class="source-line-no">655</span><span id="line-655">   */</span>
-<span class="source-line-no">656</span><span id="line-656">  static class CmdDescriptor {</span>
-<span class="source-line-no">657</span><span id="line-657">    private Class&lt;? extends TestBase&gt; cmdClass;</span>
-<span class="source-line-no">658</span><span id="line-658">    private String name;</span>
-<span class="source-line-no">659</span><span id="line-659">    private String description;</span>
-<span class="source-line-no">660</span><span id="line-660"></span>
-<span class="source-line-no">661</span><span id="line-661">    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {</span>
-<span class="source-line-no">662</span><span id="line-662">      this.cmdClass = cmdClass;</span>
-<span class="source-line-no">663</span><span id="line-663">      this.name = name;</span>
-<span class="source-line-no">664</span><span id="line-664">      this.description = description;</span>
+<span class="source-line-no">603</span><span id="line-603">    job.setOutputFormatClass(TextOutputFormat.class);</span>
+<span class="source-line-no">604</span><span id="line-604">    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));</span>
+<span class="source-line-no">605</span><span id="line-605"></span>
+<span class="source-line-no">606</span><span id="line-606">    TableMapReduceUtil.addDependencyJars(job);</span>
+<span class="source-line-no">607</span><span id="line-607">    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(), Histogram.class, // yammer</span>
+<span class="source-line-no">608</span><span id="line-608">                                                                                            // metrics</span>
+<span class="source-line-no">609</span><span id="line-609">      Gson.class, // gson</span>
+<span class="source-line-no">610</span><span id="line-610">      FilterAllFilter.class // hbase-server tests jar</span>
+<span class="source-line-no">611</span><span id="line-611">    );</span>
+<span class="source-line-no">612</span><span id="line-612"></span>
+<span class="source-line-no">613</span><span id="line-613">    TableMapReduceUtil.initCredentials(job);</span>
+<span class="source-line-no">614</span><span id="line-614"></span>
+<span class="source-line-no">615</span><span id="line-615">    job.waitForCompletion(true);</span>
+<span class="source-line-no">616</span><span id="line-616">    return job;</span>
+<span class="source-line-no">617</span><span id="line-617">  }</span>
+<span class="source-line-no">618</span><span id="line-618"></span>
+<span class="source-line-no">619</span><span id="line-619">  /**</span>
+<span class="source-line-no">620</span><span id="line-620">   * Each client has one mapper to do the work, and client do the resulting count in a map task.</span>
+<span class="source-line-no">621</span><span id="line-621">   */</span>
+<span class="source-line-no">622</span><span id="line-622"></span>
+<span class="source-line-no">623</span><span id="line-623">  static String JOB_INPUT_FILENAME = "input.txt";</span>
+<span class="source-line-no">624</span><span id="line-624"></span>
+<span class="source-line-no">625</span><span id="line-625">  /*</span>
+<span class="source-line-no">626</span><span id="line-626">   * Write input file of offsets-per-client for the mapreduce job.</span>
+<span class="source-line-no">627</span><span id="line-627">   * @param c Configuration</span>
+<span class="source-line-no">628</span><span id="line-628">   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME</span>
+<span class="source-line-no">629</span><span id="line-629">   */</span>
+<span class="source-line-no">630</span><span id="line-630">  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {</span>
+<span class="source-line-no">631</span><span id="line-631">    return writeInputFile(c, opts, new Path("."));</span>
+<span class="source-line-no">632</span><span id="line-632">  }</span>
+<span class="source-line-no">633</span><span id="line-633"></span>
+<span class="source-line-no">634</span><span id="line-634">  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)</span>
+<span class="source-line-no">635</span><span id="line-635">    throws IOException {</span>
+<span class="source-line-no">636</span><span id="line-636">    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");</span>
+<span class="source-line-no">637</span><span id="line-637">    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));</span>
+<span class="source-line-no">638</span><span id="line-638">    Path inputDir = new Path(jobdir, "inputs");</span>
+<span class="source-line-no">639</span><span id="line-639"></span>
+<span class="source-line-no">640</span><span id="line-640">    FileSystem fs = FileSystem.get(c);</span>
+<span class="source-line-no">641</span><span id="line-641">    fs.mkdirs(inputDir);</span>
+<span class="source-line-no">642</span><span id="line-642"></span>
+<span class="source-line-no">643</span><span id="line-643">    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);</span>
+<span class="source-line-no">644</span><span id="line-644">    PrintStream out = new PrintStream(fs.create(inputFile));</span>
+<span class="source-line-no">645</span><span id="line-645">    // Make input random.</span>
+<span class="source-line-no">646</span><span id="line-646">    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();</span>
+<span class="source-line-no">647</span><span id="line-647">    Hash h = MurmurHash.getInstance();</span>
+<span class="source-line-no">648</span><span id="line-648">    int perClientRows = (opts.totalRows / opts.numClientThreads);</span>
+<span class="source-line-no">649</span><span id="line-649">    try {</span>
+<span class="source-line-no">650</span><span id="line-650">      for (int j = 0; j &lt; opts.numClientThreads; j++) {</span>
+<span class="source-line-no">651</span><span id="line-651">        TestOptions next = new TestOptions(opts);</span>
+<span class="source-line-no">652</span><span id="line-652">        next.startRow = j * perClientRows;</span>
+<span class="source-line-no">653</span><span id="line-653">        next.perClientRunRows = perClientRows;</span>
+<span class="source-line-no">654</span><span id="line-654">        String s = GSON.toJson(next);</span>
+<span class="source-line-no">655</span><span id="line-655">        LOG.info("Client=" + j + ", input=" + s);</span>
+<span class="source-line-no">656</span><span id="line-656">        byte[] b = Bytes.toBytes(s);</span>
+<span class="source-line-no">657</span><span id="line-657">        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);</span>
+<span class="source-line-no">658</span><span id="line-658">        m.put(hash, s);</span>
+<span class="source-line-no">659</span><span id="line-659">      }</span>
+<span class="source-line-no">660</span><span id="line-660">      for (Map.Entry&lt;Integer, String&gt; e : m.entrySet()) {</span>
+<span class="source-line-no">661</span><span id="line-661">        out.println(e.getValue());</span>
+<span class="source-line-no">662</span><span id="line-662">      }</span>
+<span class="source-line-no">663</span><span id="line-663">    } finally {</span>
+<span class="source-line-no">664</span><span id="line-664">      out.close();</span>
 <span class="source-line-no">665</span><span id="line-665">    }</span>
-<span class="source-line-no">666</span><span id="line-666"></span>
-<span class="source-line-no">667</span><span id="line-667">    public Class&lt;? extends TestBase&gt; getCmdClass() {</span>
-<span class="source-line-no">668</span><span id="line-668">      return cmdClass;</span>
-<span class="source-line-no">669</span><span id="line-669">    }</span>
-<span class="source-line-no">670</span><span id="line-670"></span>
-<span class="source-line-no">671</span><span id="line-671">    public String getName() {</span>
-<span class="source-line-no">672</span><span id="line-672">      return name;</span>
-<span class="source-line-no">673</span><span id="line-673">    }</span>
-<span class="source-line-no">674</span><span id="line-674"></span>
-<span class="source-line-no">675</span><span id="line-675">    public String getDescription() {</span>
-<span class="source-line-no">676</span><span id="line-676">      return description;</span>
-<span class="source-line-no">677</span><span id="line-677">    }</span>
-<span class="source-line-no">678</span><span id="line-678">  }</span>
-<span class="source-line-no">679</span><span id="line-679"></span>
-<span class="source-line-no">680</span><span id="line-680">  /**</span>
-<span class="source-line-no">681</span><span id="line-681">   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}. This makes</span>
-<span class="source-line-no">682</span><span id="line-682">   * tracking all these arguments a little easier. NOTE: ADDING AN OPTION, you need to add a data</span>
-<span class="source-line-no">683</span><span id="line-683">   * member, a getter/setter (to make JSON serialization of this TestOptions class behave), and you</span>
-<span class="source-line-no">684</span><span id="line-684">   * need to add to the clone constructor below copying your new option from the 'that' to the</span>
-<span class="source-line-no">685</span><span id="line-685">   * 'this'. Look for 'clone' below.</span>
-<span class="source-line-no">686</span><span id="line-686">   */</span>
-<span class="source-line-no">687</span><span id="line-687">  static class TestOptions {</span>
-<span class="source-line-no">688</span><span id="line-688">    String cmdName = null;</span>
-<span class="source-line-no">689</span><span id="line-689">    boolean nomapred = false;</span>
-<span class="source-line-no">690</span><span id="line-690">    boolean filterAll = false;</span>
-<span class="source-line-no">691</span><span id="line-691">    int startRow = 0;</span>
-<span class="source-line-no">692</span><span id="line-692">    float size = 1.0f;</span>
-<span class="source-line-no">693</span><span id="line-693">    int perClientRunRows = DEFAULT_ROWS_PER_GB;</span>
-<span class="source-line-no">694</span><span id="line-694">    int numClientThreads = 1;</span>
-<span class="source-line-no">695</span><span id="line-695">    int totalRows = DEFAULT_ROWS_PER_GB;</span>
-<span class="source-line-no">696</span><span id="line-696">    int measureAfter = 0;</span>
-<span class="source-line-no">697</span><span id="line-697">    float sampleRate = 1.0f;</span>
-<span class="source-line-no">698</span><span id="line-698">    /**</span>
-<span class="source-line-no">699</span><span id="line-699">     * @deprecated Useless after switching to OpenTelemetry</span>
-<span class="source-line-no">700</span><span id="line-700">     */</span>
-<span class="source-line-no">701</span><span id="line-701">    @Deprecated</span>
-<span class="source-line-no">702</span><span id="line-702">    double traceRate = 0.0;</span>
-<span class="source-line-no">703</span><span id="line-703">    String tableName = TABLE_NAME;</span>
-<span class="source-line-no">704</span><span id="line-704">    boolean flushCommits = true;</span>
-<span class="source-line-no">705</span><span id="line-705">    boolean writeToWAL = true;</span>
-<span class="source-line-no">706</span><span id="line-706">    boolean autoFlush = false;</span>
-<span class="source-line-no">707</span><span id="line-707">    boolean oneCon = false;</span>
-<span class="source-line-no">708</span><span id="line-708">    int connCount = -1; // wil decide the actual num later</span>
-<span class="source-line-no">709</span><span id="line-709">    boolean useTags = false;</span>
-<span class="source-line-no">710</span><span id="line-710">    int noOfTags = 1;</span>
-<span class="source-line-no">711</span><span id="line-711">    boolean reportLatency = false;</span>
-<span class="source-line-no">712</span><span id="line-712">    int multiGet = 0;</span>
-<span class="source-line-no">713</span><span id="line-713">    int multiPut = 0;</span>
-<span class="source-line-no">714</span><span id="line-714">    int randomSleep = 0;</span>
-<span class="source-line-no">715</span><span id="line-715">    boolean inMemoryCF = false;</span>
-<span class="source-line-no">716</span><span id="line-716">    int presplitRegions = 0;</span>
-<span class="source-line-no">717</span><span id="line-717">    int replicas = TableDescriptorBuilder.DEFAULT_REGION_REPLICATION;</span>
-<span class="source-line-no">718</span><span id="line-718">    String splitPolicy = null;</span>
-<span class="source-line-no">719</span><span id="line-719">    Compression.Algorithm compression = Compression.Algorithm.NONE;</span>
-<span class="source-line-no">720</span><span id="line-720">    String encryption = null;</span>
-<span class="source-line-no">721</span><span id="line-721">    BloomType bloomType = BloomType.ROW;</span>
-<span class="source-line-no">722</span><span id="line-722">    int blockSize = HConstants.DEFAULT_BLOCKSIZE;</span>
-<span class="source-line-no">723</span><span id="line-723">    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;</span>
-<span class="source-line-no">724</span><span id="line-724">    boolean valueRandom = false;</span>
-<span class="source-line-no">725</span><span id="line-725">    boolean valueZipf = false;</span>
-<span class="source-line-no">726</span><span id="line-726">    int valueSize = DEFAULT_VALUE_LENGTH;</span>
-<span class="source-line-no">727</span><span id="line-727">    int period = (this.perClientRunRows / 10) == 0 ? perClientRunRows : perClientRunRows / 10;</span>
-<span class="source-line-no">728</span><span id="line-728">    int cycles = 1;</span>
-<span class="source-line-no">729</span><span id="line-729">    int columns = 1;</span>
-<span class="source-line-no">730</span><span id="line-730">    int families = 1;</span>
-<span class="source-line-no">731</span><span id="line-731">    int caching = 30;</span>
-<span class="source-line-no">732</span><span id="line-732">    int latencyThreshold = 0; // in millsecond</span>
-<span class="source-line-no">733</span><span id="line-733">    boolean addColumns = true;</span>
-<span class="source-line-no">734</span><span id="line-734">    MemoryCompactionPolicy inMemoryCompaction =</span>
-<span class="source-line-no">735</span><span id="line-735">      MemoryCompactionPolicy.valueOf(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);</span>
-<span class="source-line-no">736</span><span id="line-736">    boolean asyncPrefetch = false;</span>
-<span class="source-line-no">737</span><span id="line-737">    boolean cacheBlocks = true;</span>
-<span class="source-line-no">738</span><span id="line-738">    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;</span>
-<span class="source-line-no">739</span><span id="line-739">    long bufferSize = 2l * 1024l * 1024l;</span>
-<span class="source-line-no">740</span><span id="line-740">    Properties commandProperties;</span>
-<span class="source-line-no">741</span><span id="line-741"></span>
-<span class="source-line-no">742</span><span id="line-742">    public TestOptions() {</span>
-<span class="source-line-no">743</span><span id="line-743">    }</span>
-<span class="source-line-no">744</span><span id="line-744"></span>
-<span class="source-line-no">745</span><span id="line-745">    /**</span>
-<span class="source-line-no">746</span><span id="line-746">     * Clone constructor.</span>
-<span class="source-line-no">747</span><span id="line-747">     * @param that Object to copy from.</span>
-<span class="source-line-no">748</span><span id="line-748">     */</span>
-<span class="source-line-no">749</span><span id="line-749">    public TestOptions(TestOptions that) {</span>
-<span class="source-line-no">750</span><span id="line-750">      this.cmdName = that.cmdName;</span>
-<span class="source-line-no">751</span><span id="line-751">      this.cycles = that.cycles;</span>
-<span class="source-line-no">752</span><span id="line-752">      this.nomapred = that.nomapred;</span>
-<span class="source-line-no">753</span><span id="line-753">      this.startRow = that.startRow;</span>
-<span class="source-line-no">754</span><span id="line-754">      this.size = that.size;</span>
-<span class="source-line-no">755</span><span id="line-755">      this.perClientRunRows = that.perClientRunRows;</span>
-<span class="source-line-no">756</span><span id="line-756">      this.numClientThreads = that.numClientThreads;</span>
-<span class="source-line-no">757</span><span id="line-757">      this.totalRows = that.totalRows;</span>
-<span class="source-line-no">758</span><span id="line-758">      this.sampleRate = that.sampleRate;</span>
-<span class="source-line-no">759</span><span id="line-759">      this.traceRate = that.traceRate;</span>
-<span class="source-line-no">760</span><span id="line-760">      this.tableName = that.tableName;</span>
-<span class="source-line-no">761</span><span id="line-761">      this.flushCommits = that.flushCommits;</span>
-<span class="source-line-no">762</span><span id="line-762">      this.writeToWAL = that.writeToWAL;</span>
-<span class="source-line-no">763</span><span id="line-763">      this.autoFlush = that.autoFlush;</span>
-<span class="source-line-no">764</span><span id="line-764">      this.oneCon = that.oneCon;</span>
-<span class="source-line-no">765</span><span id="line-765">      this.connCount = that.connCount;</span>
-<span class="source-line-no">766</span><span id="line-766">      this.useTags = that.useTags;</span>
-<span class="source-line-no">767</span><span id="line-767">      this.noOfTags = that.noOfTags;</span>
-<span class="source-line-no">768</span><span id="line-768">      this.reportLatency = that.reportLatency;</span>
-<span class="source-line-no">769</span><span id="line-769">      this.latencyThreshold = that.latencyThreshold;</span>
-<span class="source-line-no">770</span><span id="line-770">      this.multiGet = that.multiGet;</span>
-<span class="source-line-no">771</span><span id="line-771">      this.multiPut = that.multiPut;</span>
-<span class="source-line-no">772</span><span id="line-772">      this.inMemoryCF = that.inMemoryCF;</span>
-<span class="source-line-no">773</span><span id="line-773">      this.presplitRegions = that.presplitRegions;</span>
-<span class="source-line-no">774</span><span id="line-774">      this.replicas = that.replicas;</span>
-<span class="source-line-no">775</span><span id="line-775">      this.splitPolicy = that.splitPolicy;</span>
-<span class="source-line-no">776</span><span id="line-776">      this.compression = that.compression;</span>
-<span class="source-line-no">777</span><span id="line-777">      this.encryption = that.encryption;</span>
-<span class="source-line-no">778</span><span id="line-778">      this.blockEncoding = that.blockEncoding;</span>
-<span class="source-line-no">779</span><span id="line-779">      this.filterAll = that.filterAll;</span>
-<span class="source-line-no">780</span><span id="line-780">      this.bloomType = that.bloomType;</span>
-<span class="source-line-no">781</span><span id="line-781">      this.blockSize = that.blockSize;</span>
-<span class="source-line-no">782</span><span id="line-782">      this.valueRandom = that.valueRandom;</span>
-<span class="source-line-no">783</span><span id="line-783">      this.valueZipf = that.valueZipf;</span>
-<span class="source-line-no">784</span><span id="line-784">      this.valueSize = that.valueSize;</span>
-<span class="source-line-no">785</span><span id="line-785">      this.period = that.period;</span>
-<span class="source-line-no">786</span><span id="line-786">      this.randomSleep = that.randomSleep;</span>
-<span class="source-line-no">787</span><span id="line-787">      this.measureAfter = that.measureAfter;</span>
-<span class="source-line-no">788</span><span id="line-788">      this.addColumns = that.addColumns;</span>
-<span class="source-line-no">789</span><span id="line-789">      this.columns = that.columns;</span>
-<span class="source-line-no">790</span><span id="line-790">      this.families = that.families;</span>
-<span class="source-line-no">791</span><span id="line-791">      this.caching = that.caching;</span>
-<span class="source-line-no">792</span><span id="line-792">      this.inMemoryCompaction = that.inMemoryCompaction;</span>
-<span class="source-line-no">793</span><span id="line-793">      this.asyncPrefetch = that.asyncPrefetch;</span>
-<span class="source-line-no">794</span><span id="line-794">      this.cacheBlocks = that.cacheBlocks;</span>
-<span class="source-line-no">795</span><span id="line-795">      this.scanReadType = that.scanReadType;</span>
-<span class="source-line-no">796</span><span id="line-796">      this.bufferSize = that.bufferSize;</span>
-<span class="source-line-no">797</span><span id="line-797">      this.commandProperties = that.commandProperties;</span>
-<span class="source-line-no">798</span><span id="line-798">    }</span>
-<span class="source-line-no">799</span><span id="line-799"></span>
-<span class="source-line-no">800</span><span id="line-800">    public Properties getCommandProperties() {</span>
-<span class="source-line-no">801</span><span id="line-801">      return commandProperties;</span>
-<span class="source-line-no">802</span><span id="line-802">    }</span>
-<span class="source-line-no">803</span><span id="line-803"></span>
-<span class="source-line-no">804</span><span id="line-804">    public int getCaching() {</span>
-<span class="source-line-no">805</span><span id="line-805">      return this.caching;</span>
-<span class="source-line-no">806</span><span id="line-806">    }</span>
-<span class="source-line-no">807</span><span id="line-807"></span>
-<span class="source-line-no">808</span><span id="line-808">    public void setCaching(final int caching) {</span>
-<span class="source-line-no">809</span><span id="line-809">      this.caching = caching;</span>
-<span class="source-line-no">810</span><span id="line-810">    }</span>
-<span class="source-line-no">811</span><span id="line-811"></span>
-<span class="source-line-no">812</span><span id="line-812">    public int getColumns() {</span>
-<span class="source-line-no">813</span><span id="line-813">      return this.columns;</span>
+<span class="source-line-no">666</span><span id="line-666">    return inputDir;</span>
+<span class="source-line-no">667</span><span id="line-667">  }</span>
+<span class="source-line-no">668</span><span id="line-668"></span>
+<span class="source-line-no">669</span><span id="line-669">  /**</span>
+<span class="source-line-no">670</span><span id="line-670">   * Describes a command.</span>
+<span class="source-line-no">671</span><span id="line-671">   */</span>
+<span class="source-line-no">672</span><span id="line-672">  static class CmdDescriptor {</span>
+<span class="source-line-no">673</span><span id="line-673">    private Class&lt;? extends TestBase&gt; cmdClass;</span>
+<span class="source-line-no">674</span><span id="line-674">    private String name;</span>
+<span class="source-line-no">675</span><span id="line-675">    private String description;</span>
+<span class="source-line-no">676</span><span id="line-676"></span>
+<span class="source-line-no">677</span><span id="line-677">    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {</span>
+<span class="source-line-no">678</span><span id="line-678">      this.cmdClass = cmdClass;</span>
+<span class="source-line-no">679</span><span id="line-679">      this.name = name;</span>
+<span class="source-line-no">680</span><span id="line-680">      this.description = description;</span>
+<span class="source-line-no">681</span><span id="line-681">    }</span>
+<span class="source-line-no">682</span><span id="line-682"></span>
+<span class="source-line-no">683</span><span id="line-683">    public Class&lt;? extends TestBase&gt; getCmdClass() {</span>
+<span class="source-line-no">684</span><span id="line-684">      return cmdClass;</span>
+<span class="source-line-no">685</span><span id="line-685">    }</span>
+<span class="source-line-no">686</span><span id="line-686"></span>
+<span class="source-line-no">687</span><span id="line-687">    public String getName() {</span>
+<span class="source-line-no">688</span><span id="line-688">      return name;</span>
+<span class="source-line-no">689</span><span id="line-689">    }</span>
+<span class="source-line-no">690</span><span id="line-690"></span>
+<span class="source-line-no">691</span><span id="line-691">    public String getDescription() {</span>
+<span class="source-line-no">692</span><span id="line-692">      return description;</span>
+<span class="source-line-no">693</span><span id="line-693">    }</span>
+<span class="source-line-no">694</span><span id="line-694">  }</span>
+<span class="source-line-no">695</span><span id="line-695"></span>
+<span class="source-line-no">696</span><span id="line-696">  /**</span>
+<span class="source-line-no">697</span><span id="line-697">   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}. This makes</span>
+<span class="source-line-no">698</span><span id="line-698">   * tracking all these arguments a little easier. NOTE: ADDING AN OPTION, you need to add a data</span>
+<span class="source-line-no">699</span><span id="line-699">   * member, a getter/setter (to make JSON serialization of this TestOptions class behave), and you</span>
+<span class="source-line-no">700</span><span id="line-700">   * need to add to the clone constructor below copying your new option from the 'that' to the</span>
+<span class="source-line-no">701</span><span id="line-701">   * 'this'. Look for 'clone' below.</span>
+<span class="source-line-no">702</span><span id="line-702">   */</span>
+<span class="source-line-no">703</span><span id="line-703">  static class TestOptions {</span>
+<span class="source-line-no">704</span><span id="line-704">    String cmdName = null;</span>
+<span class="source-line-no">705</span><span id="line-705">    boolean nomapred = false;</span>
+<span class="source-line-no">706</span><span id="line-706">    boolean filterAll = false;</span>
+<span class="source-line-no">707</span><span id="line-707">    int startRow = 0;</span>
+<span class="source-line-no">708</span><span id="line-708">    float size = 1.0f;</span>
+<span class="source-line-no">709</span><span id="line-709">    int perClientRunRows = DEFAULT_ROWS_PER_GB;</span>
+<span class="source-line-no">710</span><span id="line-710">    int numClientThreads = 1;</span>
+<span class="source-line-no">711</span><span id="line-711">    int totalRows = DEFAULT_ROWS_PER_GB;</span>
+<span class="source-line-no">712</span><span id="line-712">    int measureAfter = 0;</span>
+<span class="source-line-no">713</span><span id="line-713">    float sampleRate = 1.0f;</span>
+<span class="source-line-no">714</span><span id="line-714">    /**</span>
+<span class="source-line-no">715</span><span id="line-715">     * @deprecated Useless after switching to OpenTelemetry</span>
+<span class="source-line-no">716</span><span id="line-716">     */</span>
+<span class="source-line-no">717</span><span id="line-717">    @Deprecated</span>
+<span class="source-line-no">718</span><span id="line-718">    double traceRate = 0.0;</span>
+<span class="source-line-no">719</span><span id="line-719">    String tableName = TABLE_NAME;</span>
+<span class="source-line-no">720</span><span id="line-720">    boolean flushCommits = true;</span>
+<span class="source-line-no">721</span><span id="line-721">    boolean writeToWAL = true;</span>
+<span class="source-line-no">722</span><span id="line-722">    boolean autoFlush = false;</span>
+<span class="source-line-no">723</span><span id="line-723">    boolean oneCon = false;</span>
+<span class="source-line-no">724</span><span id="line-724">    int connCount = -1; // wil decide the actual num later</span>
+<span class="source-line-no">725</span><span id="line-725">    boolean useTags = false;</span>
+<span class="source-line-no">726</span><span id="line-726">    int noOfTags = 1;</span>
+<span class="source-line-no">727</span><span id="line-727">    boolean reportLatency = false;</span>
+<span class="source-line-no">728</span><span id="line-728">    int multiGet = 0;</span>
+<span class="source-line-no">729</span><span id="line-729">    int multiPut = 0;</span>
+<span class="source-line-no">730</span><span id="line-730">    int randomSleep = 0;</span>
+<span class="source-line-no">731</span><span id="line-731">    boolean inMemoryCF = false;</span>
+<span class="source-line-no">732</span><span id="line-732">    int presplitRegions = 0;</span>
+<span class="source-line-no">733</span><span id="line-733">    int replicas = TableDescriptorBuilder.DEFAULT_REGION_REPLICATION;</span>
+<span class="source-line-no">734</span><span id="line-734">    String splitPolicy = null;</span>
+<span class="source-line-no">735</span><span id="line-735">    Compression.Algorithm compression = Compression.Algorithm.NONE;</span>
+<span class="source-line-no">736</span><span id="line-736">    String encryption = null;</span>
+<span class="source-line-no">737</span><span id="line-737">    BloomType bloomType = BloomType.ROW;</span>
+<span class="source-line-no">738</span><span id="line-738">    int blockSize = HConstants.DEFAULT_BLOCKSIZE;</span>
+<span class="source-line-no">739</span><span id="line-739">    DataBlockEncoding blockEncoding = DataBlockEncoding.NONE;</span>
+<span class="source-line-no">740</span><span id="line-740">    boolean valueRandom = false;</span>
+<span class="source-line-no">741</span><span id="line-741">    boolean valueZipf = false;</span>
+<span class="source-line-no">742</span><span id="line-742">    int valueSize = DEFAULT_VALUE_LENGTH;</span>
+<span class="source-line-no">743</span><span id="line-743">    int period = (this.perClientRunRows / 10) == 0 ? perClientRunRows : perClientRunRows / 10;</span>
+<span class="source-line-no">744</span><span id="line-744">    int cycles = 1;</span>
+<span class="source-line-no">745</span><span id="line-745">    int columns = 1;</span>
+<span class="source-line-no">746</span><span id="line-746">    int families = 1;</span>
+<span class="source-line-no">747</span><span id="line-747">    int caching = 30;</span>
+<span class="source-line-no">748</span><span id="line-748">    int latencyThreshold = 0; // in millsecond</span>
+<span class="source-line-no">749</span><span id="line-749">    boolean addColumns = true;</span>
+<span class="source-line-no">750</span><span id="line-750">    MemoryCompactionPolicy inMemoryCompaction =</span>
+<span class="source-line-no">751</span><span id="line-751">      MemoryCompactionPolicy.valueOf(CompactingMemStore.COMPACTING_MEMSTORE_TYPE_DEFAULT);</span>
+<span class="source-line-no">752</span><span id="line-752">    boolean asyncPrefetch = false;</span>
+<span class="source-line-no">753</span><span id="line-753">    boolean cacheBlocks = true;</span>
+<span class="source-line-no">754</span><span id="line-754">    Scan.ReadType scanReadType = Scan.ReadType.DEFAULT;</span>
+<span class="source-line-no">755</span><span id="line-755">    long bufferSize = 2l * 1024l * 1024l;</span>
+<span class="source-line-no">756</span><span id="line-756">    Properties commandProperties;</span>
+<span class="source-line-no">757</span><span id="line-757"></span>
+<span class="source-line-no">758</span><span id="line-758">    public TestOptions() {</span>
+<span class="source-line-no">759</span><span id="line-759">    }</span>
+<span class="source-line-no">760</span><span id="line-760"></span>
+<span class="source-line-no">761</span><span id="line-761">    /**</span>
+<span class="source-line-no">762</span><span id="line-762">     * Clone constructor.</span>
+<span class="source-line-no">763</span><span id="line-763">     * @param that Object to copy from.</span>
+<span class="source-line-no">764</span><span id="line-764">     */</span>
+<span class="source-line-no">765</span><span id="line-765">    public TestOptions(TestOptions that) {</span>
+<span class="source-line-no">766</span><span id="line-766">      this.cmdName = that.cmdName;</span>
+<span class="source-line-no">767</span><span id="line-767">      this.cycles = that.cycles;</span>
+<span class="source-line-no">768</span><span id="line-768">      this.nomapred = that.nomapred;</span>
+<span class="source-line-no">769</span><span id="line-769">      this.startRow = that.startRow;</span>
+<span class="source-line-no">770</span><span id="line-770">      this.size = that.size;</span>
+<span class="source-line-no">771</span><span id="line-771">      this.perClientRunRows = that.perClientRunRows;</span>
+<span class="source-line-no">772</span><span id="line-772">      this.numClientThreads = that.numClientThreads;</span>
+<span class="source-line-no">773</span><span id="line-773">      this.totalRows = that.totalRows;</span>
+<span class="source-line-no">774</span><span id="line-774">      this.sampleRate = that.sampleRate;</span>
+<span class="source-line-no">775</span><span id="line-775">      this.traceRate = that.traceRate;</span>
+<span class="source-line-no">776</span><span id="line-776">      this.tableName = that.tableName;</span>
+<span class="source-line-no">777</span><span id="line-777">      this.flushCommits = that.flushCommits;</span>
+<span class="source-line-no">778</span><span id="line-778">      this.writeToWAL = that.writeToWAL;</span>
+<span class="source-line-no">779</span><span id="line-779">      this.autoFlush = that.autoFlush;</span>
+<span class="source-line-no">780</span><span id="line-780">      this.oneCon = that.oneCon;</span>
+<span class="source-line-no">781</span><span id="line-781">      this.connCount = that.connCount;</span>
+<span class="source-line-no">782</span><span id="line-782">      this.useTags = that.useTags;</span>
+<span class="source-line-no">783</span><span id="line-783">      this.noOfTags = that.noOfTags;</span>
+<span class="source-line-no">784</span><span id="line-784">      this.reportLatency = that.reportLatency;</span>
+<span class="source-line-no">785</span><span id="line-785">      this.latencyThreshold = that.latencyThreshold;</span>
+<span class="source-line-no">786</span><span id="line-786">      this.multiGet = that.multiGet;</span>
+<span class="source-line-no">787</span><span id="line-787">      this.multiPut = that.multiPut;</span>
+<span class="source-line-no">788</span><span id="line-788">      this.inMemoryCF = that.inMemoryCF;</span>
+<span class="source-line-no">789</span><span id="line-789">      this.presplitRegions = that.presplitRegions;</span>
+<span class="source-line-no">790</span><span id="line-790">      this.replicas = that.replicas;</span>
+<span class="source-line-no">791</span><span id="line-791">      this.splitPolicy = that.splitPolicy;</span>
+<span class="source-line-no">792</span><span id="line-792">      this.compression = that.compression;</span>
+<span class="source-line-no">793</span><span id="line-793">      this.encryption = that.encryption;</span>
+<span class="source-line-no">794</span><span id="line-794">      this.blockEncoding = that.blockEncoding;</span>
+<span class="source-line-no">795</span><span id="line-795">      this.filterAll = that.filterAll;</span>
+<span class="source-line-no">796</span><span id="line-796">      this.bloomType = that.bloomType;</span>
+<span class="source-line-no">797</span><span id="line-797">      this.blockSize = that.blockSize;</span>
+<span class="source-line-no">798</span><span id="line-798">      this.valueRandom = that.valueRandom;</span>
+<span class="source-line-no">799</span><span id="line-799">      this.valueZipf = that.valueZipf;</span>
+<span class="source-line-no">800</span><span id="line-800">      this.valueSize = that.valueSize;</span>
+<span class="source-line-no">801</span><span id="line-801">      this.period = that.period;</span>
+<span class="source-line-no">802</span><span id="line-802">      this.randomSleep = that.randomSleep;</span>
+<span class="source-line-no">803</span><span id="line-803">      this.measureAfter = that.measureAfter;</span>
+<span class="source-line-no">804</span><span id="line-804">      this.addColumns = that.addColumns;</span>
+<span class="source-line-no">805</span><span id="line-805">      this.columns = that.columns;</span>
+<span class="source-line-no">806</span><span id="line-806">      this.families = that.families;</span>
+<span class="source-line-no">807</span><span id="line-807">      this.caching = that.caching;</span>
+<span class="source-line-no">808</span><span id="line-808">      this.inMemoryCompaction = that.inMemoryCompaction;</span>
+<span class="source-line-no">809</span><span id="line-809">      this.asyncPrefetch = that.asyncPrefetch;</span>
+<span class="source-line-no">810</span><span id="line-810">      this.cacheBlocks = that.cacheBlocks;</span>
+<span class="source-line-no">811</span><span id="line-811">      this.scanReadType = that.scanReadType;</span>
+<span class="source-line-no">812</span><span id="line-812">      this.bufferSize = that.bufferSize;</span>
+<span class="source-line-no">813</span><span id="line-813">      this.commandProperties = that.commandProperties;</span>
 <span class="source-line-no">814</span><span id="line-814">    }</span>
 <span class="source-line-no">815</span><span id="line-815"></span>
-<span class="source-line-no">816</span><span id="line-816">    public void setColumns(final int columns) {</span>
-<span class="source-line-no">817</span><span id="line-817">      this.columns = columns;</span>
+<span class="source-line-no">816</span><span id="line-816">    public Properties getCommandProperties() {</span>
+<span class="source-line-no">817</span><span id="line-817">      return commandProperties;</span>
 <span class="source-line-no">818</span><span id="line-818">    }</span>
 <span class="source-line-no">819</span><span id="line-819"></span>
-<span class="source-line-no">820</span><span id="line-820">    public int getFamilies() {</span>
-<span class="source-line-no">821</span><span id="line-821">      return this.families;</span>
+<span class="source-line-no">820</span><span id="line-820">    public int getCaching() {</span>
+<span class="source-line-no">821</span><span id="line-821">      return this.caching;</span>
 <span class="source-line-no">822</span><span id="line-822">    }</span>
 <span class="source-line-no">823</span><span id="line-823"></span>
-<span class="source-line-no">824</span><span id="line-824">    public void setFamilies(final int families) {</span>
-<span class="source-line-no">825</span><span id="line-825">      this.families = families;</span>
+<span class="source-line-no">824</span><span id="line-824">    public void setCaching(final int caching) {</span>
+<span class="source-line-no">825</span><span id="line-825">      this.caching = caching;</span>
 <span class="source-line-no">826</span><span id="line-826">    }</span>
 <span class="source-line-no">827</span><span id="line-827"></span>
-<span class="source-line-no">828</span><span id="line-828">    public int getCycles() {</span>
-<span class="source-line-no">829</span><span id="line-829">      return this.cycles;</span>
+<span class="source-line-no">828</span><span id="line-828">    public int getColumns() {</span>
+<span class="source-line-no">829</span><span id="line-829">      return this.columns;</span>
 <span class="source-line-no">830</span><span id="line-830">    }</span>
 <span class="source-line-no">831</span><span id="line-831"></span>
-<span class="source-line-no">832</span><span id="line-832">    public void setCycles(final int cycles) {</span>
-<span class="source-line-no">833</span><span id="line-833">      this.cycles = cycles;</span>
+<span class="source-line-no">832</span><span id="line-832">    public void setColumns(final int columns) {</span>
+<span class="source-line-no">833</span><span id="line-833">      this.columns = columns;</span>
 <span class="source-line-no">834</span><span id="line-834">    }</span>
 <span class="source-line-no">835</span><span id="line-835"></span>
-<span class="source-line-no">836</span><span id="line-836">    public boolean isValueZipf() {</span>
-<span class="source-line-no">837</span><span id="line-837">      return valueZipf;</span>
+<span class="source-line-no">836</span><span id="line-836">    public int getFamilies() {</span>
+<span class="source-line-no">837</span><span id="line-837">      return this.families;</span>
 <span class="source-line-no">838</span><span id="line-838">    }</span>
 <span class="source-line-no">839</span><span id="line-839"></span>
-<span class="source-line-no">840</span><span id="line-840">    public void setValueZipf(boolean valueZipf) {</span>
-<span class="source-line-no">841</span><span id="line-841">      this.valueZipf = valueZipf;</span>
+<span class="source-line-no">840</span><span id="line-840">    public void setFamilies(final int families) {</span>
+<span class="source-line-no">841</span><span id="line-841">      this.families = families;</span>
 <span class="source-line-no">842</span><span id="line-842">    }</span>
 <span class="source-line-no">843</span><span id="line-843"></span>
-<span class="source-line-no">844</span><span id="line-844">    public String getCmdName() {</span>
-<span class="source-line-no">845</span><span id="line-845">      return cmdName;</span>
+<span class="source-line-no">844</span><span id="line-844">    public int getCycles() {</span>
+<span class="source-line-no">845</span><span id="line-845">      return this.cycles;</span>
 <span class="source-line-no">846</span><span id="line-846">    }</span>
 <span class="source-line-no">847</span><span id="line-847"></span>
-<span class="source-line-no">848</span><span id="line-848">    public void setCmdName(String cmdName) {</span>
-<span class="source-line-no">849</span><span id="line-849">      this.cmdName = cmdName;</span>
+<span class="source-line-no">848</span><span id="line-848">    public void setCycles(final int cycles) {</span>
+<span class="source-line-no">849</span><span id="line-849">      this.cycles = cycles;</span>
 <span class="source-line-no">850</span><span id="line-850">    }</span>
 <span class="source-line-no">851</span><span id="line-851"></span>
-<span class="source-line-no">852</span><span id="line-852">    public int getRandomSleep() {</span>
-<span class="source-line-no">853</span><span id="line-853">      return randomSleep;</span>
+<span class="source-line-no">852</span><span id="line-852">    public boolean isValueZipf() {</span>
+<span class="source-line-no">853</span><span id="line-853">      return valueZipf;</span>
 <span class="source-line-no">854</span><span id="line-854">    }</span>
 <span class="source-line-no">855</span><span id="line-855"></span>
-<span class="source-line-no">856</span><span id="line-856">    public void setRandomSleep(int randomSleep) {</span>
-<span class="source-line-no">857</span><span id="line-857">      this.randomSleep = randomSleep;</span>
+<span class="source-line-no">856</span><span id="line-856">    public void setValueZipf(boolean valueZipf) {</span>
+<span class="source-line-no">857</span><span id="line-857">      this.valueZipf = valueZipf;</span>
 <span class="source-line-no">858</span><span id="line-858">    }</span>
 <span class="source-line-no">859</span><span id="line-859"></span>
-<span class="source-line-no">860</span><span id="line-860">    public int getReplicas() {</span>
-<span class="source-line-no">861</span><span id="line-861">      return replicas;</span>
+<span class="source-line-no">860</span><span id="line-860">    public String getCmdName() {</span>
+<span class="source-line-no">861</span><span id="line-861">      return cmdName;</span>
 <span class="source-line-no">862</span><span id="line-862">    }</span>
 <span class="source-line-no">863</span><span id="line-863"></span>
-<span class="source-line-no">864</span><span id="line-864">    public void setReplicas(int replicas) {</span>
-<span class="source-line-no">865</span><span id="line-865">      this.replicas = replicas;</span>
+<span class="source-line-no">864</span><span id="line-864">    public void setCmdName(String cmdName) {</span>
+<span class="source-line-no">865</span><span id="line-865">      this.cmdName = cmdName;</span>
 <span class="source-line-no">866</span><span id="line-866">    }</span>
 <span class="source-line-no">867</span><span id="line-867"></span>
-<span class="source-line-no">868</span><span id="line-868">    public String getSplitPolicy() {</span>
-<span class="source-line-no">869</span><span id="line-869">      return splitPolicy;</span>
+<span class="source-line-no">868</span><span id="line-868">    public int getRandomSleep() {</span>
+<span class="source-line-no">869</span><span id="line-869">      return randomSleep;</span>
 <span class="source-line-no">870</span><span id="line-870">    }</span>
 <span class="source-line-no">871</span><span id="line-871"></span>
-<span class="source-line-no">872</span><span id="line-872">    public void setSplitPolicy(String splitPolicy) {</span>
-<span class="source-line-no">873</span><span id="line-873">      this.splitPolicy = splitPolicy;</span>
+<span class="source-line-no">872</span><span id="line-872">    public void setRandomSleep(int randomSleep) {</span>
+<span class="source-line-no">873</span><span id="line-873">      this.randomSleep = randomSleep;</span>
 <span class="source-line-no">874</span><span id="line-874">    }</span>
 <span class="source-line-no">875</span><span id="line-875"></span>
-<span class="source-line-no">876</span><span id="line-876">    public void setNomapred(boolean nomapred) {</span>
-<span class="source-line-no">877</span><span id="line-877">      this.nomapred = nomapred;</span>
+<span class="source-line-no">876</span><span id="line-876">    public int getReplicas() {</span>
+<span class="source-line-no">877</span><span id="line-877">      return replicas;</span>
 <span class="source-line-no">878</span><span id="line-878">    }</span>
 <span class="source-line-no">879</span><span id="line-879"></span>
-<span class="source-line-no">880</span><span id="line-880">    public void setFilterAll(boolean filterAll) {</span>
-<span class="source-line-no">881</span><span id="line-881">      this.filterAll = filterAll;</span>
+<span class="source-line-no">880</span><span id="line-880">    public void setReplicas(int replicas) {</span>
+<span class="source-line-no">881</span><span id="line-881">      this.replicas = replicas;</span>
 <span class="source-line-no">882</span><span id="line-882">    }</span>
 <span class="source-line-no">883</span><span id="line-883"></span>
-<span class="source-line-no">884</span><span id="line-884">    public void setStartRow(int startRow) {</span>
-<span class="source-line-no">885</span><span id="line-885">      this.startRow = startRow;</span>
+<span class="source-line-no">884</span><span id="line-884">    public String getSplitPolicy() {</span>
+<span class="source-line-no">885</span><span id="line-885">      return splitPolicy;</span>
 <span class="source-line-no">886</span><span id="line-886">    }</span>
 <span class="source-line-no">887</span><span id="line-887"></span>
-<span class="source-line-no">888</span><span id="line-888">    public void setSize(float size) {</span>
-<span class="source-line-no">889</span><span id="line-889">      this.size = size;</span>
+<span class="source-line-no">888</span><span id="line-888">    public void setSplitPolicy(String splitPolicy) {</span>
+<span class="source-line-no">889</span><span id="line-889">      this.splitPolicy = splitPolicy;</span>
 <span class="source-line-no">890</span><span id="line-890">    }</span>
 <span class="source-line-no">891</span><span id="line-891"></span>
-<span class="source-line-no">892</span><span id="line-892">    public void setPerClientRunRows(int perClientRunRows) {</span>
-<span class="source-line-no">893</span><span id="line-893">      this.perClientRunRows = perClientRunRows;</span>
+<span class="source-line-no">892</span><span id="line-892">    public void setNomapred(boolean nomapred) {</span>
+<span class="source-line-no">893</span><span id="line-893">      this.nomapred = nomapred;</span>
 <span class="source-line-no">894</span><span id="line-894">    }</span>
 <span class="source-line-no">895</span><span id="line-895"></span>
-<span class="source-line-no">896</span><span id="line-896">    public void setNumClientThreads(int numClientThreads) {</span>
-<span class="source-line-no">897</span><span id="line-897">      this.numClientThreads = numClientThreads;</span>
+<span class="source-line-no">896</span><span id="line-896">    public void setFilterAll(boolean filterAll) {</span>
+<span class="source-line-no">897</span><span id="line-897">      this.filterAll = filterAll;</span>
 <span class="source-line-no">898</span><span id="line-898">    }</span>
 <span class="source-line-no">899</span><span id="line-899"></span>
-<span class="source-line-no">900</span><span id="line-900">    public void setTotalRows(int totalRows) {</span>
-<span class="source-line-no">901</span><span id="line-901">      this.totalRows = totalRows;</span>
+<span class="source-line-no">900</span><span id="line-900">    public void setStartRow(int startRow) {</span>
+<span class="source-line-no">901</span><span id="line-901">      this.startRow = startRow;</span>
 <span class="source-line-no">902</span><span id="line-902">    }</span>
 <span class="source-line-no">903</span><span id="line-903"></span>
-<span class="source-line-no">904</span><span id="line-904">    public void setSampleRate(float sampleRate) {</span>
-<span class="source-line-no">905</span><span id="line-905">      this.sampleRate = sampleRate;</span>
+<span class="source-line-no">904</span><span id="line-904">    public void setSize(float size) {</span>
+<span class="source-line-no">905</span><span id="line-905">      this.size = size;</span>
 <span class="source-line-no">906</span><span id="line-906">    }</span>
 <span class="source-line-no">907</span><span id="line-907"></span>
-<span class="source-line-no">908</span><span id="line-908">    public void setTraceRate(double traceRate) {</span>
-<span class="source-line-no">909</span><span id="line-909">      this.traceRate = traceRate;</span>
+<span class="source-line-no">908</span><span id="line-908">    public void setPerClientRunRows(int perClientRunRows) {</span>
+<span class="source-line-no">909</span><span id="line-909">      this.perClientRunRows = perClientRunRows;</span>
 <span class="source-line-no">910</span><span id="line-910">    }</span>
 <span class="source-line-no">911</span><span id="line-911"></span>
-<span class="source-line-no">912</span><span id="line-912">    public void setTableName(String tableName) {</span>
-<span class="source-line-no">913</span><span id="line-913">      this.tableName = tableName;</span>
+<span class="source-line-no">912</span><span id="line-912">    public void setNumClientThreads(int numClientThreads) {</span>
+<span class="source-line-no">913</span><span id="line-913">      this.numClientThreads = numClientThreads;</span>
 <span class="source-line-no">914</span><span id="line-914">    }</span>
 <span class="source-line-no">915</span><span id="line-915"></span>
-<span class="source-line-no">916</span><span id="line-916">    public void setFlushCommits(boolean flushCommits) {</span>
-<span class="source-line-no">917</span><span id="line-917">      this.flushCommits = flushCommits;</span>
+<span class="source-line-no">916</span><span id="line-916">    public void setTotalRows(int totalRows) {</span>
+<span class="source-line-no">917</span><span id="line-917">      this.totalRows = totalRows;</span>
 <span class="source-line-no">918</span><span id="line-918">    }</span>
 <span class="source-line-no">919</span><span id="line-919"></span>
-<span class="source-line-no">920</span><span id="line-920">    public void setWriteToWAL(boolean writeToWAL) {</span>
-<span class="source-line-no">921</span><span id="line-921">      this.writeToWAL = writeToWAL;</span>
+<span class="source-line-no">920</span><span id="line-920">    public void setSampleRate(float sampleRate) {</span>
+<span class="source-line-no">921</span><span id="line-921">      this.sampleRate = sampleRate;</span>
 <span class="source-line-no">922</span><span id="line-922">    }</span>
 <span class="source-line-no">923</span><span id="line-923"></span>
-<span class="source-line-no">924</span><span id="line-924">    public void setAutoFlush(boolean autoFlush) {</span>
-<span class="source-line-no">925</span><span id="line-925">      this.autoFlush = autoFlush;</span>
+<span class="source-line-no">924</span><span id="line-924">    public void setTraceRate(double traceRate) {</span>
+<span class="source-line-no">925</span><span id="line-925">      this.traceRate = traceRate;</span>
 <span class="source-line-no">926</span><span id="line-926">    }</span>
 <span class="source-line-no">927</span><span id="line-927"></span>
-<span class="source-line-no">928</span><span id="line-928">    public void setOneCon(boolean oneCon) {</span>
-<span class="source-line-no">929</span><span id="line-929">      this.oneCon = oneCon;</span>
+<span class="source-line-no">928</span><span id="line-928">    public void setTableName(String tableName) {</span>
+<span class="source-line-no">929</span><span id="line-929">      this.tableName = tableName;</span>
 <span class="source-line-no">930</span><span id="line-930">    }</span>
 <span class="source-line-no">931</span><span id="line-931"></span>
-<span class="source-line-no">932</span><span id="line-932">    public int getConnCount() {</span>
-<span class="source-line-no">933</span><span id="line-933">      return connCount;</span>
+<span class="source-line-no">932</span><span id="line-932">    public void setFlushCommits(boolean flushCommits) {</span>
+<span class="source-line-no">933</span><span id="line-933">      this.flushCommits = flushCommits;</span>
 <span class="source-line-no">934</span><span id="line-934">    }</span>
 <span class="source-line-no">935</span><span id="line-935"></span>
-<span class="source-line-no">936</span><span id="line-936">    public void setConnCount(int connCount) {</span>
-<span class="source-line-no">937</span><span id="line-937">      this.connCount = connCount;</span>
+<span class="source-line-no">936</span><span id="line-936">    public void setWriteToWAL(boolean writeToWAL) {</span>
+<span class="source-line-no">937</span><span id="line-937">      this.writeToWAL = writeToWAL;</span>
 <span class="source-line-no">938</span><span id="line-938">    }</span>
 <span class="source-line-no">939</span><span id="line-939"></span>
-<span class="source-line-no">940</span><span id="line-940">    public void setUseTags(boolean useTags) {</span>
-<span class="source-line-no">941</span><span id="line-941">      this.useTags = useTags;</span>
+<span class="source-line-no">940</span><span id="line-940">    public void setAutoFlush(boolean autoFlush) {</span>
+<span class="source-line-no">941</span><span id="line-941">      this.autoFlush = autoFlush;</span>
 <span class="source-line-no">942</span><span id="line-942">    }</span>
 <span class="source-line-no">943</span><span id="line-943"></span>
-<span class="source-line-no">944</span><span id="line-944">    public void setNoOfTags(int noOfTags) {</span>
-<span class="source-line-no">945</span><span id="line-945">      this.noOfTags = noOfTags;</span>
+<span class="source-line-no">944</span><span id="line-944">    public void setOneCon(boolean oneCon) {</span>
+<span class="source-line-no">945</span><span id="line-945">      this.oneCon = oneCon;</span>
 <span class="source-line-no">946</span><span id="line-946">    }</span>
 <span class="source-line-no">947</span><span id="line-947"></span>
-<span class="source-line-no">948</span><span id="line-948">    public void setReportLatency(boolean reportLatency) {</span>
-<span class="source-line-no">949</span><span id="line-949">      this.reportLatency = reportLatency;</span>
+<span class="source-line-no">948</span><span id="line-948">    public int getConnCount() {</span>
+<span class="source-line-no">949</span><span id="line-949">      return connCount;</span>
 <span class="source-line-no">950</span><span id="line-950">    }</span>
 <span class="source-line-no">951</span><span id="line-951"></span>
-<span class="source-line-no">952</span><span id="line-952">    public void setMultiGet(int multiGet) {</span>
-<span class="source-line-no">953</span><span id="line-953">      this.multiGet = multiGet;</span>
+<span class="source-line-no">952</span><span id="line-952">    public void setConnCount(int connCount) {</span>
+<span class="source-line-no">953</span><span id="line-953">      this.connCount = connCount;</span>
 <span class="source-line-no">954</span><span id="line-954">    }</span>
 <span class="source-line-no">955</span><span id="line-955"></span>
-<span class="source-line-no">956</span><span id="line-956">    public void setMultiPut(int multiPut) {</span>
-<span class="source-line-no">957</span><span id="line-957">      this.multiPut = multiPut;</span>
+<span class="source-line-no">956</span><span id="line-956">    public void setUseTags(boolean useTags) {</span>
+<span class="source-line-no">957</span><span id="line-957">      this.useTags = useTags;</span>
 <span class="source-line-no">958</span><span id="line-958">    }</span>
 <span class="source-line-no">959</span><span id="line-959"></span>
-<span class="source-line-no">960</span><span id="line-960">    public void setInMemoryCF(boolean inMemoryCF) {</span>
-<span class="source-line-no">961</span><span id="line-961">      this.inMemoryCF = inMemoryCF;</span>
+<span class="source-line-no">960</span><span id="line-960">    public void setNoOfTags(int noOfTags) {</span>
+<span class="source-line-no">961</span><span id="line-961">      this.noOfTags = noOfTags;</span>
 <span class="source-line-no">962</span><span id="line-962">    }</span>
 <span class="source-line-no">963</span><span id="line-963"></span>
-<span class="source-line-no">964</span><span id="line-964">    public void setPresplitRegions(int presplitRegions) {</span>
-<span class="source-line-no">965</span><span id="line-965">      this.presplitRegions = presplitRegions;</span>
+<span class="source-line-no">964</span><span id="line-964">    public void setReportLatency(boolean reportLatency) {</span>
+<span class="source-line-no">965</span><span id="line-965">      this.reportLatency = reportLatency;</span>
 <span class="source-line-no">966</span><span id="line-966">    }</span>
 <span class="source-line-no">967</span><span id="line-967"></span>
-<span class="source-line-no">968</span><span id="line-968">    public void setCompression(Compression.Algorithm compression) {</span>
-<span class="source-line-no">969</span><span id="line-969">      this.compression = compression;</span>
+<span class="source-line-no">968</span><span id="line-968">    public void setMultiGet(int multiGet) {</span>
+<span class="source-line-no">969</span><span id="line-969">      this.multiGet = multiGet;</span>
 <span class="source-line-no">970</span><span id="line-970">    }</span>
 <span class="source-line-no">971</span><span id="line-971"></span>
-<span class="source-line-no">972</span><span id="line-972">    public void setEncryption(String encryption) {</span>
-<span class="source-line-no">973</span><span id="line-973">      this.encryption = encryption;</span>
+<span class="source-line-no">972</span><span id="line-972">    public void setMultiPut(int multiPut) {</span>
+<span class="source-line-no">973</span><span id="line-973">      this.multiPut = multiPut;</span>
 <span class="source-line-no">974</span><span id="line-974">    }</span>
 <span class="source-line-no">975</span><span id="line-975"></span>
-<span class="source-line-no">976</span><span id="line-976">    public void setBloomType(BloomType bloomType) {</span>
-<span class="source-line-no">977</span><span id="line-977">      this.bloomType = bloomType;</span>
+<span class="source-line-no">976</span><span id="line-976">    public void setInMemoryCF(boolean inMemoryCF) {</span>
+<span class="source-line-no">977</span><span id="line-977">      this.inMemoryCF = inMemoryCF;</span>
 <span class="source-line-no">978</span><span id="line-978">    }</span>
 <span class="source-line-no">979</span><span id="line-979"></span>
-<span class="source-line-no">980</span><span id="line-980">    public void setBlockSize(int blockSize) {</span>
-<span class="source-line-no">981</span><span id="line-981">      this.blockSize = blockSize;</span>
+<span class="source-line-no">980</span><span id="line-980">    public void setPresplitRegions(int presplitRegions) {</span>
+<span class="source-line-no">981</span><span id="line-981">      this.presplitRegions = presplitRegions;</span>
 <span class="source-line-no">982</span><span id="line-982">    }</span>
 <span class="source-line-no">983</span><span id="line-983"></span>
-<span class="source-line-no">984</span><span id="line-984">    public void setBlockEncoding(DataBlockEncoding blockEncoding) {</span>
-<span class="source-line-no">985</span><span id="line-985">      this.blockEncoding = blockEncoding;</span>
+<span class="source-line-no">984</span><span id="line-984">    public void setCompression(Compression.Algorithm compression) {</span>
+<span class="source-line-no">985</span><span id="line-985">      this.compression = compression;</span>
 <span class="source-line-no">986</span><span id="line-986">    }</span>
 <span class="source-line-no">987</span><span id="line-987"></span>
-<span class="source-line-no">988</span><span id="line-988">    public void setValueRandom(boolean valueRandom) {</span>
-<span class="source-line-no">989</span><span id="line-989">      this.valueRandom = valueRandom;</span>
+<span class="source-line-no">988</span><span id="line-988">    public void setEncryption(String encryption) {</span>
+<span class="source-line-no">989</span><span id="line-989">      this.encryption = encryption;</span>
 <span class="source-line-no">990</span><span id="line-990">    }</span>
 <span class="source-line-no">991</span><span id="line-991"></span>
-<span class="source-line-no">992</span><span id="line-992">    public void setValueSize(int valueSize) {</span>
-<span class="source-line-no">993</span><span id="line-993">      this.valueSize = valueSize;</span>
+<span class="source-line-no">992</span><span id="line-992">    public void setBloomType(BloomType bloomType) {</span>
+<span class="source-line-no">993</span><span id="line-993">      this.bloomType = bloomType;</span>
 <span class="source-line-no">994</span><span id="line-994">    }</span>
 <span class="source-line-no">995</span><span id="line-995"></span>
-<span class="source-line-no">996</span><span id="line-996">    public void setBufferSize(long bufferSize) {</span>
-<span class="source-line-no">997</span><span id="line-997">      this.bufferSize = bufferSize;</span>
+<span class="source-line-no">996</span><span id="line-996">    public void setBlockSize(int blockSize) {</span>
+<span class="source-line-no">997</span><span id="line-997">      this.blockSize = blockSize;</span>
 <span class="source-line-no">998</span><span id="line-998">    }</span>
 <span class="source-line-no">999</span><span id="line-999"></span>
-<span class="source-line-no">1000</span><span id="line-1000">    public void setPeriod(int period) {</span>
-<span class="source-line-no">1001</span><span id="line-1001">      this.period = period;</span>
+<span class="source-line-no">1000</span><span id="line-1000">    public void setBlockEncoding(DataBlockEncoding blockEncoding) {</span>
+<span class="source-line-no">1001</span><span id="line-1001">      this.blockEncoding = blockEncoding;</span>
 <span class="source-line-no">1002</span><span id="line-1002">    }</span>
 <span class="source-line-no">1003</span><span id="line-1003"></span>
-<span class="source-line-no">1004</span><span id="line-1004">    public boolean isNomapred() {</span>
-<span class="source-line-no">1005</span><span id="line-1005">      return nomapred;</span>
+<span class="source-line-no">1004</span><span id="line-1004">    public void setValueRandom(boolean valueRandom) {</span>
+<span class="source-line-no">1005</span><span id="line-1005">      this.valueRandom = valueRandom;</span>
 <span class="source-line-no">1006</span><span id="line-1006">    }</span>
 <span class="source-line-no">1007</span><span id="line-1007"></span>
-<span class="source-line-no">1008</span><span id="line-1008">    public boolean isFilterAll() {</span>
-<span class="source-line-no">1009</span><span id="line-1009">      return filterAll;</span>
+<span class="source-line-no">1008</span><span id="line-1008">    public void setValueSize(int valueSize) {</span>
+<span class="source-line-no">1009</span><span id="line-1009">      this.valueSize = valueSize;</span>
 <span class="source-line-no">1010</span><span id="line-1010">    }</span>
 <span class="source-line-no">1011</span><span id="line-1011"></span>
-<span class="source-line-no">1012</span><span id="line-1012">    public int getStartRow() {</span>
-<span class="source-line-no">1013</span><span id="line-1013">      return startRow;</span>
+<span class="source-line-no">1012</span><span id="line-1012">    public void setBufferSize(long bufferSize) {</span>
+<span class="source-line-no">1013</span><span id="line-1013">      this.bufferSize = bufferSize;</span>
 <span class="source-line-no">1014</span><span id="line-1014">    }</span>
 <span class="source-line-no">1015</span><span id="line-1015"></span>
-<span class="source-line-no">1016</span><span id="line-1016">    public float getSize() {</span>
-<span class="source-line-no">1017</span><span id="line-1017">      return size;</span>
+<span class="source-line-no">1016</span><span id="line-1016">    public void setPeriod(int period) {</span>
+<span class="source-line-no">1017</span><span id="line-1017">      this.period = period;</span>
 <span class="source-line-no">1018</span><span id="line-1018">    }</span>
 <span class="source-line-no">1019</span><span id="line-1019"></span>
-<span class="source-line-no">1020</span><span id="line-1020">    public int getPerClientRunRows() {</span>
-<span class="source-line-no">1021</span><span id="line-1021">      return perClientRunRows;</span>
+<span class="source-line-no">1020</span><span id="line-1020">    public boolean isNomapred() {</span>
+<span class="source-line-no">1021</span><span id="line-1021">      return nomapred;</span>
 <span class="source-line-no">1022</span><span id="line-1022">    }</span>
 <span class="source-line-no">1023</span><span id="line-1023"></span>
-<span class="source-line-no">1024</span><span id="line-1024">    public int getNumClientThreads() {</span>
-<span class="source-line-no">1025</span><span id="line-1025">      return numClientThreads;</span>
+<span class="source-line-no">1024</span><span id="line-1024">    public boolean isFilterAll() {</span>
+<span class="source-line-no">1025</span><span id="line-1025">      return filterAll;</span>
 <span class="source-line-no">1026</span><span id="line-1026">    }</span>
 <span class="source-line-no">1027</span><span id="line-1027"></span>
-<span class="source-line-no">1028</span><span id="line-1028">    public int getTotalRows() {</span>
-<span class="source-line-no">1029</span><span id="line-1029">      return totalRows;</span>
+<span class="source-line-no">1028</span><span id="line-1028">    public int getStartRow() {</span>
+<span class="source-line-no">1029</span><span id="line-1029">      return startRow;</span>
 <span class="source-line-no">1030</span><span id="line-1030">    }</span>
 <span class="source-line-no">1031</span><span id="line-1031"></span>
-<span class="source-line-no">1032</span><span id="line-1032">    public float getSampleRate() {</span>
-<span class="source-line-no">1033</span><span id="line-1033">      return sampleRate;</span>
+<span class="source-line-no">1032</span><span id="line-1032">    public float getSize() {</span>
+<span class="source-line-no">1033</span><span id="line-1033">      return size;</span>
 <span class="source-line-no">1034</span><span id="line-1034">    }</span>
 <span class="source-line-no">1035</span><span id="line-1035"></span>
-<span class="source-line-no">1036</span><span id="line-1036">    public double getTraceRate() {</span>
-<span class="source-line-no">1037</span><span id="line-1037">      return traceRate;</span>
+<span class="source-line-no">1036</span><span id="line-1036">    public int getPerClientRunRows() {</span>
+<span class="source-line-no">1037</span><span id="line-1037">      return perClientRunRows;</span>
 <span class="source-line-no">1038</span><span id="line-1038">    }</span>
 <span class="source-line-no">1039</span><span id="line-1039"></span>
-<span class="source-line-no">1040</span><span id="line-1040">    public String getTableName() {</span>
-<span class="source-line-no">1041</span><span id="line-1041">      return tableName;</span>
+<span class="source-line-no">1040</span><span id="line-1040">    public int getNumClientThreads() {</span>
+<span class="source-line-no">1041</span><span id="line-1041">      return numClientThreads;</span>
 <span class="source-line-no">1042</span><span id="line-1042">    }</span>
 <span class="source-line-no">1043</span><span id="line-1043"></span>
-<span class="source-line-no">1044</span><span id="line-1044">    public boolean isFlushCommits() {</span>
-<span class="source-line-no">1045</span><span id="line-1045">      return flushCommits;</span>
+<span class="source-line-no">1044</span><span id="line-1044">    public int getTotalRows() {</span>
+<span class="source-line-no">1045</span><span id="line-1045">      return totalRows;</span>
 <span class="source-line-no">1046</span><span id="line-1046">    }</span>
 <span class="source-line-no">1047</span><span id="line-1047"></span>
-<span class="source-line-no">1048</span><span id="line-1048">    public boolean isWriteToWAL() {</span>
-<span class="source-line-no">1049</span><span id="line-1049">      return writeToWAL;</span>
+<span class="source-line-no">1048</span><span id="line-1048">    public float getSampleRate() {</span>
+<span class="source-line-no">1049</span><span id="line-1049">      return sampleRate;</span>
 <span class="source-line-no">1050</span><span id="line-1050">    }</span>
 <span class="source-line-no">1051</span><span id="line-1051"></span>
-<span class="source-line-no">1052</span><span id="line-1052">    public boolean isAutoFlush() {</span>
-<span class="source-line-no">1053</span><span id="line-1053">      return autoFlush;</span>
+<span class="source-line-no">1052</span><span id="line-1052">    public double getTraceRate() {</span>
+<span class="source-line-no">1053</span><span id="line-1053">      return traceRate;</span>
 <span class="source-line-no">1054</span><span id="line-1054">    }</span>
 <span class="source-line-no">1055</span><span id="line-1055"></span>
-<span class="source-line-no">1056</span><span id="line-1056">    public boolean isUseTags() {</span>
-<span class="source-line-no">1057</span><span id="line-1057">      return useTags;</span>
+<span class="source-line-no">1056</span><span id="line-1056">    public String getTableName() {</span>
+<span class="source-line-no">1057</span><span id="line-1057">      return tableName;</span>
 <span class="source-line-no">1058</span><span id="line-1058">    }</span>
 <span class="source-line-no">1059</span><span id="line-1059"></span>
-<span class="source-line-no">1060</span><span id="line-1060">    public int getNoOfTags() {</span>
-<span class="source-line-no">1061</span><span id="line-1061">      return noOfTags;</span>
+<span class="source-line-no">1060</span><span id="line-1060">    public boolean isFlushCommits() {</span>
+<span class="source-line-no">1061</span><span id="line-1061">      return flushCommits;</span>
 <span class="source-line-no">1062</span><span id="line-1062">    }</span>
 <span class="source-line-no">1063</span><span id="line-1063"></span>
-<span class="source-line-no">1064</span><span id="line-1064">    public boolean isReportLatency() {</span>
-<span class="source-line-no">1065</span><span id="line-1065">      return reportLatency;</span>
+<span class="source-line-no">1064</span><span id="line-1064">    public boolean isWriteToWAL() {</span>
+<span class="source-line-no">1065</span><span id="line-1065">      return writeToWAL;</span>
 <span class="source-line-no">1066</span><span id="line-1066">    }</span>
 <span class="source-line-no">1067</span><span id="line-1067"></span>
-<span class="source-line-no">1068</span><span id="line-1068">    public int getMultiGet() {</span>
-<span class="source-line-no">1069</span><span id="line-1069">      return multiGet;</span>
+<span class="source-line-no">1068</span><span id="line-1068">    public boolean isAutoFlush() {</span>
+<span class="source-line-no">1069</span><span id="line-1069">      return autoFlush;</span>
 <span class="source-line-no">1070</span><span id="line-1070">    }</span>
 <span class="source-line-no">1071</span><span id="line-1071"></span>
-<span class="source-line-no">1072</span><span id="line-1072">    public int getMultiPut() {</span>
-<span class="source-line-no">1073</span><span id="line-1073">      return multiPut;</span>
+<span class="source-line-no">1072</span><span id="line-1072">    public boolean isUseTags() {</span>
+<span class="source-line-no">1073</span><span id="line-1073">      return useTags;</span>
 <span class="source-line-no">1074</span><span id="line-1074">    }</span>
 <span class="source-line-no">1075</span><span id="line-1075"></span>
-<span class="source-line-no">1076</span><span id="line-1076">    public boolean isInMemoryCF() {</span>
-<span class="source-line-no">1077</span><span id="line-1077">      return inMemoryCF;</span>
+<span class="source-line-no">1076</span><span id="line-1076">    public int getNoOfTags() {</span>
+<span class="source-line-no">1077</span><span id="line-1077">      return noOfTags;</span>
 <span class="source-line-no">1078</span><span id="line-1078">    }</span>
 <span class="source-line-no">1079</span><span id="line-1079"></span>
-<span class="source-line-no">1080</span><span id="line-1080">    public int getPresplitRegions() {</span>
-<span class="source-line-no">1081</span><span id="line-1081">      return presplitRegions;</span>
+<span class="source-line-no">1080</span><span id="line-1080">    public boolean isReportLatency() {</span>
+<span class="source-line-no">1081</span><span id="line-1081">      return reportLatency;</span>
 <span class="source-line-no">1082</span><span id="line-1082">    }</span>
 <span class="source-line-no">1083</span><span id="line-1083"></span>
-<span class="source-line-no">1084</span><span id="line-1084">    public Compression.Algorithm getCompression() {</span>
-<span class="source-line-no">1085</span><span id="line-1085">      return compression;</span>
+<span class="source-line-no">1084</span><span id="line-1084">    public int getMultiGet() {</span>
+<span class="source-line-no">1085</span><span id="line-1085">      return multiGet;</span>
 <span class="source-line-no">1086</span><span id="line-1086">    }</span>
 <span class="source-line-no">1087</span><span id="line-1087"></span>
-<span class="source-line-no">1088</span><span id="line-1088">    public String getEncryption() {</span>
-<span class="source-line-no">1089</span><span id="line-1089">      return encryption;</span>
+<span class="source-line-no">1088</span><span id="line-1088">    public int getMultiPut() {</span>
+<span class="source-line-no">1089</span><span id="line-1089">      return multiPut;</span>
 <span class="source-line-no">1090</span><span id="line-1090">    }</span>
 <span class="source-line-no">1091</span><span id="line-1091"></span>
-<span class="source-line-no">1092</span><span id="line-1092">    public DataBlockEncoding getBlockEncoding() {</span>
-<span class="source-line-no">1093</span><span id="line-1093">      return blockEncoding;</span>
+<span class="source-line-no">1092</span><span id="line-1092">    public boolean isInMemoryCF() {</span>
+<span class="source-line-no">1093</span><span id="line-1093">      return inMemoryCF;</span>
 <span class="source-line-no">1094</span><span id="line-1094">    }</span>
 <span class="source-line-no">1095</span><span id="line-1095"></span>
-<span class="source-line-no">1096</span><span id="line-1096">    public boolean isValueRandom() {</span>
-<span class="source-line-no">1097</span><span id="line-1097">      return valueRandom;</span>
+<span class="source-line-no">1096</span><span id="line-1096">    public int getPresplitRegions() {</span>
+<span class="source-line-no">1097</span><span id="line-1097">      return presplitRegions;</span>
 <span class="source-line-no">1098</span><span id="line-1098">    }</span>
 <span class="source-line-no">1099</span><span id="line-1099"></span>
-<span class="source-line-no">1100</span><span id="line-1100">    public int getValueSize() {</span>
-<span class="source-line-no">1101</span><span id="line-1101">      return valueSize;</span>
+<span class="source-line-no">1100</span><span id="line-1100">    public Compression.Algorithm getCompression() {</span>
+<span class="source-line-no">1101</span><span id="line-1101">      return compression;</span>
 <span class="source-line-no">1102</span><span id="line-1102">    }</span>
 <span class="source-line-no">1103</span><span id="line-1103"></span>
-<span class="source-line-no">1104</span><span id="line-1104">    public int getPeriod() {</span>
-<span class="source-line-no">1105</span><span id="line-1105">      return period;</span>
+<span class="source-line-no">1104</span><span id="line-1104">    public String getEncryption() {</span>
+<span class="source-line-no">1105</span><span id="line-1105">      return encryption;</span>
 <span class="source-line-no">1106</span><span id="line-1106">    }</span>
 <span class="source-line-no">1107</span><span id="line-1107"></span>
-<span class="source-line-no">1108</span><span id="line-1108">    public BloomType getBloomType() {</span>
-<span class="source-line-no">1109</span><span id="line-1109">      return bloomType;</span>
+<span class="source-line-no">1108</span><span id="line-1108">    public DataBlockEncoding getBlockEncoding() {</span>
+<span class="source-line-no">1109</span><span id="line-1109">      return blockEncoding;</span>
 <span class="source-line-no">1110</span><span id="line-1110">    }</span>
 <span class="source-line-no">1111</span><span id="line-1111"></span>
-<span class="source-line-no">1112</span><span id="line-1112">    public int getBlockSize() {</span>
-<span class="source-line-no">1113</span><span id="line-1113">      return blockSize;</span>
+<span class="source-line-no">1112</span><span id="line-1112">    public boolean isValueRandom() {</span>
+<span class="source-line-no">1113</span><span id="line-1113">      return valueRandom;</span>
 <span class="source-line-no">1114</span><span id="line-1114">    }</span>
 <span class="source-line-no">1115</span><span id="line-1115"></span>
-<span class="source-line-no">1116</span><span id="line-1116">    public boolean isOneCon() {</span>
-<span class="source-line-no">1117</span><span id="line-1117">      return oneCon;</span>
+<span class="source-line-no">1116</span><span id="line-1116">    public int getValueSize() {</span>
+<span class="source-line-no">1117</span><span id="line-1117">      return valueSize;</span>
 <span class="source-line-no">1118</span><span id="line-1118">    }</span>
 <span class="source-line-no">1119</span><span id="line-1119"></span>
-<span class="source-line-no">1120</span><span id="line-1120">    public int getMeasureAfter() {</span>
-<span class="source-line-no">1121</span><span id="line-1121">      return measureAfter;</span>
+<span class="source-line-no">1120</span><span id="line-1120">    public int getPeriod() {</span>
+<span class="source-line-no">1121</span><span id="line-1121">      return period;</span>
 <span class="source-line-no">1122</span><span id="line-1122">    }</span>
 <span class="source-line-no">1123</span><span id="line-1123"></span>
-<span class="source-line-no">1124</span><span id="line-1124">    public void setMeasureAfter(int measureAfter) {</span>
-<span class="source-line-no">1125</span><span id="line-1125">      this.measureAfter = measureAfter;</span>
+<span class="source-line-no">1124</span><span id="line-1124">    public BloomType getBloomType() {</span>
+<span class="source-line-no">1125</span><span id="line-1125">      return bloomType;</span>
 <span class="source-line-no">1126</span><span id="line-1126">    }</span>
 <span class="source-line-no">1127</span><span id="line-1127"></span>
-<span class="source-line-no">1128</span><span id="line-1128">    public boolean getAddColumns() {</span>
-<span class="source-line-no">1129</span><span id="line-1129">      return addColumns;</span>
+<span class="source-line-no">1128</span><span id="line-1128">    public int getBlockSize() {</span>
+<span class="source-line-no">1129</span><span id="line-1129">      return blockSize;</span>
 <span class="source-line-no">1130</span><span id="line-1130">    }</span>
 <span class="source-line-no">1131</span><span id="line-1131"></span>
-<span class="source-line-no">1132</span><span id="line-1132">    public void setAddColumns(boolean addColumns) {</span>
-<span class="source-line-no">1133</span><span id="line-1133">      this.addColumns = addColumns;</span>
+<span class="source-line-no">1132</span><span id="line-1132">    public boolean isOneCon() {</span>
+<span class="source-line-no">1133</span><span id="line-1133">      return oneCon;</span>
 <span class="source-line-no">1134</span><span id="line-1134">    }</span>
 <span class="source-line-no">1135</span><span id="line-1135"></span>
-<span class="source-line-no">1136</span><span id="line-1136">    public void setInMemoryCompaction(MemoryCompactionPolicy inMemoryCompaction) {</span>
-<span class="source-line-no">1137</span><span id="line-1137">      this.inMemoryCompaction = inMemoryCompaction;</span>
+<span class="source-line-no">1136</span><span id="line-1136">    public int getMeasureAfter() {</span>
+<span class="source-line-no">1137</span><span id="line-1137">      return measureAfter;</span>
 <span class="source-line-no">1138</span><span id="line-1138">    }</span>
 <span class="source-line-no">1139</span><span id="line-1139"></span>
-<span class="source-line-no">1140</span><span id="line-1140">    public MemoryCompactionPolicy getInMemoryCompaction() {</span>
-<span class="source-line-no">1141</span><span id="line-1141">      return this.inMemoryCompaction;</span>
+<span class="source-line-no">1140</span><span id="line-1140">    public void setMeasureAfter(int measureAfter) {</span>
+<span class="source-line-no">1141</span><span id="line-1141">      this.measureAfter = measureAfter;</span>
 <span class="source-line-no">1142</span><span id="line-1142">    }</span>
 <span class="source-line-no">1143</span><span id="line-1143"></span>
-<span class="source-line-no">1144</span><span id="line-1144">    public long getBufferSize() {</span>
-<span class="source-line-no">1145</span><span id="line-1145">      return this.bufferSize;</span>
+<span class="source-line-no">1144</span><span id="line-1144">    public boolean getAddColumns() {</span>
+<span class="source-line-no">1145</span><span id="line-1145">      return addColumns;</span>
 <span class="source-line-no">1146</span><span id="line-1146">    }</span>
-<span class="source-line-no">1147</span><span id="line-1147">  }</span>
-<span class="source-line-no">1148</span><span id="line-1148"></span>
-<span class="source-line-no">1149</span><span id="line-1149">  /*</span>
-<span class="source-line-no">1150</span><span id="line-1150">   * A test. Subclass to particularize what happens per row.</span>
-<span class="source-line-no">1151</span><span id="line-1151">   */</span>
-<span class="source-line-no">1152</span><span id="line-1152">  static abstract class TestBase {</span>
-<span class="source-line-no">1153</span><span id="line-1153">    // Below is make it so when Tests are all running in the one</span>
-<span class="source-line-no">1154</span><span id="line-1154">    // jvm, that they each have a differently seeded Random.</span>
-<span class="source-line-no">1155</span><span id="line-1155">    private static final Random randomSeed = new Random(EnvironmentEdgeManager.currentTime());</span>
-<span class="source-line-no">1156</span><span id="line-1156"></span>
-<span class="source-line-no">1157</span><span id="line-1157">    private static long nextRandomSeed() {</span>
-<span class="source-line-no">1158</span><span id="line-1158">      return randomSeed.nextLong();</span>
-<span class="source-line-no">1159</span><span id="line-1159">    }</span>
-<span class="source-line-no">1160</span><span id="line-1160"></span>
-<span class="source-line-no">1161</span><span id="line-1161">    private final int everyN;</span>
-<span class="source-line-no">1162</span><span id="line-1162"></span>
-<span class="source-line-no">1163</span><span id="line-1163">    protected final Random rand = new Random(nextRandomSeed());</span>
-<span class="source-line-no">1164</span><span id="line-1164">    protected final Configuration conf;</span>
-<span class="source-line-no">1165</span><span id="line-1165">    protected final TestOptions opts;</span>
-<span class="source-line-no">1166</span><span id="line-1166"></span>
-<span class="source-line-no">1167</span><span id="line-1167">    protected final Status status;</span>
-<span class="source-line-no">1168</span><span id="line-1168"></span>
-<span class="source-line-no">1169</span><span id="line-1169">    private String testName;</span>
-<span class="source-line-no">1170</span><span id="line-1170">    protected Histogram latencyHistogram;</span>
-<span class="source-line-no">1171</span><span id="line-1171">    private Histogram replicaLatencyHistogram;</span>
-<span class="source-line-no">1172</span><span id="line-1172">    private Histogram valueSizeHistogram;</span>
-<span class="source-line-no">1173</span><span id="line-1173">    private Histogram rpcCallsHistogram;</span>
-<span class="source-line-no">1174</span><span id="line-1174">    private Histogram remoteRpcCallsHistogram;</span>
-<span class="source-line-no">1175</span><span id="line-1175">    private Histogram millisBetweenNextHistogram;</span>
-<span class="source-line-no">1176</span><span id="line-1176">    private Histogram regionsScannedHistogram;</span>
-<span class="source-line-no">1177</span><span id="line-1177">    private Histogram bytesInResultsHistogram;</span>
-<span class="source-line-no">1178</span><span id="line-1178">    private Histogram bytesInRemoteResultsHistogram;</span>
-<span class="source-line-no">1179</span><span id="line-1179">    private RandomDistribution.Zipf zipf;</span>
-<span class="source-line-no">1180</span><span id="line-1180">    private long numOfReplyOverLatencyThreshold = 0;</span>
-<span class="source-line-no">1181</span><span id="line-1181">    private long numOfReplyFromReplica = 0;</span>
+<span class="source-line-no">1147</span><span id="line-1147"></span>
+<span class="source-line-no">1148</span><span id="line-1148">    public void setAddColumns(boolean addColumns) {</span>
+<span class="source-line-no">1149</span><span id="line-1149">      this.addColumns = addColumns;</span>
+<span class="source-line-no">1150</span><span id="line-1150">    }</span>
+<span class="source-line-no">1151</span><span id="line-1151"></span>
+<span class="source-line-no">1152</span><span id="line-1152">    public void setInMemoryCompaction(MemoryCompactionPolicy inMemoryCompaction) {</span>
+<span class="source-line-no">1153</span><span id="line-1153">      this.inMemoryCompaction = inMemoryCompaction;</span>
+<span class="source-line-no">1154</span><span id="line-1154">    }</span>
+<span class="source-line-no">1155</span><span id="line-1155"></span>
+<span class="source-line-no">1156</span><span id="line-1156">    public MemoryCompactionPolicy getInMemoryCompaction() {</span>
+<span class="source-line-no">1157</span><span id="line-1157">      return this.inMemoryCompaction;</span>
+<span class="source-line-no">1158</span><span id="line-1158">    }</span>
+<span class="source-line-no">1159</span><span id="line-1159"></span>
+<span class="source-line-no">1160</span><span id="line-1160">    public long getBufferSize() {</span>
+<span class="source-line-no">1161</span><span id="line-1161">      return this.bufferSize;</span>
+<span class="source-line-no">1162</span><span id="line-1162">    }</span>
+<span class="source-line-no">1163</span><span id="line-1163">  }</span>
+<span class="source-line-no">1164</span><span id="line-1164"></span>
+<span class="source-line-no">1165</span><span id="line-1165">  /*</span>
+<span class="source-line-no">1166</span><span id="line-1166">   * A test. Subclass to particularize what happens per row.</span>
+<span class="source-line-no">1167</span><span id="line-1167">   */</span>
+<span class="source-line-no">1168</span><span id="line-1168">  static abstract class TestBase {</span>
+<span class="source-line-no">1169</span><span id="line-1169">    // Below is make it so when Tests are all running in the one</span>
+<span class="source-line-no">1170</span><span id="line-1170">    // jvm, that they each have a differently seeded Random.</span>
+<span class="source-line-no">1171</span><span id="line-1171">    private static final Random randomSeed = new Random(EnvironmentEdgeManager.currentTime());</span>
+<span class="source-line-no">1172</span><span id="line-1172"></span>
+<span class="source-line-no">1173</span><span id="line-1173">    private static long nextRandomSeed() {</span>
+<span class="source-line-no">1174</span><span id="line-1174">      return randomSeed.nextLong();</span>
+<span class="source-line-no">1175</span><span id="line-1175">    }</span>
+<span class="source-line-no">1176</span><span id="line-1176"></span>
+<span class="source-line-no">1177</span><span id="line-1177">    private final int everyN;</span>
+<span class="source-line-no">1178</span><span id="line-1178"></span>
+<span class="source-line-no">1179</span><span id="line-1179">    protected final Random rand = new Random(nextRandomSeed());</span>
+<span class="source-line-no">1180</span><span id="line-1180">    protected final Configuration conf;</span>
+<span class="source-line-no">1181</span><span id="line-1181">    protected final TestOptions opts;</span>
 <span class="source-line-no">1182</span><span id="line-1182"></span>
-<span class="source-line-no">1183</span><span id="line-1183">    /**</span>
-<span class="source-line-no">1184</span><span id="line-1184">     * Note that all subclasses of this class must provide a public constructor that has the exact</span>
-<span class="source-line-no">1185</span><span id="line-1185">     * same list of arguments.</span>
-<span class="source-line-no">1186</span><span id="line-1186">     */</span>
-<span class="source-line-no">1187</span><span id="line-1187">    TestBase(final Configuration conf, final TestOptions options, final Status status) {</span>
-<span class="source-line-no">1188</span><span id="line-1188">      this.conf = conf;</span>
-<span class="source-line-no">1189</span><span id="line-1189">      this.opts = options;</span>
-<span class="source-line-no">1190</span><span id="line-1190">      this.status = status;</span>
-<span class="source-line-no">1191</span><span id="line-1191">      this.testName = this.getClass().getSimpleName();</span>
-<span class="source-line-no">1192</span><span id="line-1192">      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));</span>
-<span class="source-line-no">1193</span><span id="line-1193">      if (options.isValueZipf()) {</span>
-<span class="source-line-no">1194</span><span id="line-1194">        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);</span>
-<span class="source-line-no">1195</span><span id="line-1195">      }</span>
-<span class="source-line-no">1196</span><span id="line-1196">      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");</span>
-<span class="source-line-no">1197</span><span id="line-1197">    }</span>
+<span class="source-line-no">1183</span><span id="line-1183">    protected final Status status;</span>
+<span class="source-line-no">1184</span><span id="line-1184"></span>
+<span class="source-line-no">1185</span><span id="line-1185">    private String testName;</span>
+<span class="source-line-no">1186</span><span id="line-1186">    protected Histogram latencyHistogram;</span>
+<span class="source-line-no">1187</span><span id="line-1187">    private Histogram replicaLatencyHistogram;</span>
+<span class="source-line-no">1188</span><span id="line-1188">    private Histogram valueSizeHistogram;</span>
+<span class="source-line-no">1189</span><span id="line-1189">    private Histogram rpcCallsHistogram;</span>
+<span class="source-line-no">1190</span><span id="line-1190">    private Histogram remoteRpcCallsHistogram;</span>
+<span class="source-line-no">1191</span><span id="line-1191">    private Histogram millisBetweenNextHistogram;</span>
+<span class="source-line-no">1192</span><span id="line-1192">    private Histogram regionsScannedHistogram;</span>
+<span class="source-line-no">1193</span><span id="line-1193">    private Histogram bytesInResultsHistogram;</span>
+<span class="source-line-no">1194</span><span id="line-1194">    private Histogram bytesInRemoteResultsHistogram;</span>
+<span class="source-line-no">1195</span><span id="line-1195">    private RandomDistribution.Zipf zipf;</span>
+<span class="source-line-no">1196</span><span id="line-1196">    private long numOfReplyOverLatencyThreshold = 0;</span>
+<span class="source-line-no">1197</span><span id="line-1197">    private long numOfReplyFromReplica = 0;</span>
 <span class="source-line-no">1198</span><span id="line-1198"></span>
-<span class="source-line-no">1199</span><span id="line-1199">    int getValueLength(final Random r) {</span>
-<span class="source-line-no">1200</span><span id="line-1200">      if (this.opts.isValueRandom()) {</span>
-<span class="source-line-no">1201</span><span id="line-1201">        return r.nextInt(opts.valueSize);</span>
-<span class="source-line-no">1202</span><span id="line-1202">      } else if (this.opts.isValueZipf()) {</span>
-<span class="source-line-no">1203</span><span id="line-1203">        return Math.abs(this.zipf.nextInt());</span>
-<span class="source-line-no">1204</span><span id="line-1204">      } else {</span>
-<span class="source-line-no">1205</span><span id="line-1205">        return opts.valueSize;</span>
-<span class="source-line-no">1206</span><span id="line-1206">      }</span>
-<span class="source-line-no">1207</span><span id="line-1207">    }</span>
-<span class="source-line-no">1208</span><span id="line-1208"></span>
-<span class="source-line-no">1209</span><span id="line-1209">    void updateValueSize(final Result[] rs) throws IOException {</span>
-<span class="source-line-no">1210</span><span id="line-1210">      updateValueSize(rs, 0);</span>
-<span class="source-line-no">1211</span><span id="line-1211">    }</span>
-<span class="source-line-no">1212</span><span id="line-1212"></span>
-<span class="source-line-no">1213</span><span id="line-1213">    void updateValueSize(final Result[] rs, final long latency) throws IOException {</span>
-<span class="source-line-no">1214</span><span id="line-1214">      if (rs == null || (latency == 0)) return;</span>
-<span class="source-line-no">1215</span><span id="line-1215">      for (Result r : rs)</span>
-<span class="source-line-no">1216</span><span id="line-1216">        updateValueSize(r, latency);</span>
-<span class="source-line-no">1217</span><span id="line-1217">    }</span>
-<span class="source-line-no">1218</span><span id="line-1218"></span>
-<span class="source-line-no">1219</span><span id="line-1219">    void updateValueSize(final Result r) throws IOException {</span>
-<span class="source-line-no">1220</span><span id="line-1220">      updateValueSize(r, 0);</span>
-<span class="source-line-no">1221</span><span id="line-1221">    }</span>
-<span class="source-line-no">1222</span><span id="line-1222"></span>
-<span class="source-line-no">1223</span><span id="line-1223">    void updateValueSize(final Result r, final long latency) throws IOException {</span>
-<span class="source-line-no">1224</span><span id="line-1224">      if (r == null || (latency == 0)) return;</span>
-<span class="source-line-no">1225</span><span id="line-1225">      int size = 0;</span>
-<span class="source-line-no">1226</span><span id="line-1226">      // update replicaHistogram</span>
-<span class="source-line-no">1227</span><span id="line-1227">      if (r.isStale()) {</span>
-<span class="source-line-no">1228</span><span id="line-1228">        replicaLatencyHistogram.update(latency / 1000);</span>
-<span class="source-line-no">1229</span><span id="line-1229">        numOfReplyFromReplica++;</span>
-<span class="source-line-no">1230</span><span id="line-1230">      }</span>
-<span class="source-line-no">1231</span><span id="line-1231">      if (!isRandomValueSize()) return;</span>
-<span class="source-line-no">1232</span><span id="line-1232"></span>
-<span class="source-line-no">1233</span><span id="line-1233">      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {</span>
-<span class="source-line-no">1234</span><span id="line-1234">        size += scanner.current().getValueLength();</span>
-<span class="source-line-no">1235</span><span id="line-1235">      }</span>
-<span class="source-line-no">1236</span><span id="line-1236">      updateValueSize(size);</span>
+<span class="source-line-no">1199</span><span id="line-1199">    /**</span>
+<span class="source-line-no">1200</span><span id="line-1200">     * Note that all subclasses of this class must provide a public constructor that has the exact</span>
+<span class="source-line-no">1201</span><span id="line-1201">     * same list of arguments.</span>
+<span class="source-line-no">1202</span><span id="line-1202">     */</span>
+<span class="source-line-no">1203</span><span id="line-1203">    TestBase(final Configuration conf, final TestOptions options, final Status status) {</span>
+<span class="source-line-no">1204</span><span id="line-1204">      this.conf = conf;</span>
+<span class="source-line-no">1205</span><span id="line-1205">      this.opts = options;</span>
+<span class="source-line-no">1206</span><span id="line-1206">      this.status = status;</span>
+<span class="source-line-no">1207</span><span id="line-1207">      this.testName = this.getClass().getSimpleName();</span>
+<span class="source-line-no">1208</span><span id="line-1208">      everyN = (int) (opts.totalRows / (opts.totalRows * opts.sampleRate));</span>
+<span class="source-line-no">1209</span><span id="line-1209">      if (options.isValueZipf()) {</span>
+<span class="source-line-no">1210</span><span id="line-1210">        this.zipf = new RandomDistribution.Zipf(this.rand, 1, options.getValueSize(), 1.2);</span>
+<span class="source-line-no">1211</span><span id="line-1211">      }</span>
+<span class="source-line-no">1212</span><span id="line-1212">      LOG.info("Sampling 1 every " + everyN + " out of " + opts.perClientRunRows + " total rows.");</span>
+<span class="source-line-no">1213</span><span id="line-1213">    }</span>
+<span class="source-line-no">1214</span><span id="line-1214"></span>
+<span class="source-line-no">1215</span><span id="line-1215">    int getValueLength(final Random r) {</span>
+<span class="source-line-no">1216</span><span id="line-1216">      if (this.opts.isValueRandom()) {</span>
+<span class="source-line-no">1217</span><span id="line-1217">        return r.nextInt(opts.valueSize);</span>
+<span class="source-line-no">1218</span><span id="line-1218">      } else if (this.opts.isValueZipf()) {</span>
+<span class="source-line-no">1219</span><span id="line-1219">        return Math.abs(this.zipf.nextInt());</span>
+<span class="source-line-no">1220</span><span id="line-1220">      } else {</span>
+<span class="source-line-no">1221</span><span id="line-1221">        return opts.valueSize;</span>
+<span class="source-line-no">1222</span><span id="line-1222">      }</span>
+<span class="source-line-no">1223</span><span id="line-1223">    }</span>
+<span class="source-line-no">1224</span><span id="line-1224"></span>
+<span class="source-line-no">1225</span><span id="line-1225">    void updateValueSize(final Result[] rs) throws IOException {</span>
+<span class="source-line-no">1226</span><span id="line-1226">      updateValueSize(rs, 0);</span>
+<span class="source-line-no">1227</span><span id="line-1227">    }</span>
+<span class="source-line-no">1228</span><span id="line-1228"></span>
+<span class="source-line-no">1229</span><span id="line-1229">    void updateValueSize(final Result[] rs, final long latency) throws IOException {</span>
+<span class="source-line-no">1230</span><span id="line-1230">      if (rs == null || (latency == 0)) return;</span>
+<span class="source-line-no">1231</span><span id="line-1231">      for (Result r : rs)</span>
+<span class="source-line-no">1232</span><span id="line-1232">        updateValueSize(r, latency);</span>
+<span class="source-line-no">1233</span><span id="line-1233">    }</span>
+<span class="source-line-no">1234</span><span id="line-1234"></span>
+<span class="source-line-no">1235</span><span id="line-1235">    void updateValueSize(final Result r) throws IOException {</span>
+<span class="source-line-no">1236</span><span id="line-1236">      updateValueSize(r, 0);</span>
 <span class="source-line-no">1237</span><span id="line-1237">    }</span>
 <span class="source-line-no">1238</span><span id="line-1238"></span>
-<span class="source-line-no">1239</span><span id="line-1239">    void updateValueSize(final int valueSize) {</span>
-<span class="source-line-no">1240</span><span id="line-1240">      if (!isRandomValueSize()) return;</span>
-<span class="source-line-no">1241</span><span id="line-1241">      this.valueSizeHistogram.update(valueSize);</span>
-<span class="source-line-no">1242</span><span id="line-1242">    }</span>
-<span class="source-line-no">1243</span><span id="line-1243"></span>
-<span class="source-line-no">1244</span><span id="line-1244">    void updateScanMetrics(final ScanMetrics metrics) {</span>
-<span class="source-line-no">1245</span><span id="line-1245">      if (metrics == null) return;</span>
-<span class="source-line-no">1246</span><span id="line-1246">      Map&lt;String, Long&gt; metricsMap = metrics.getMetricsMap();</span>
-<span class="source-line-no">1247</span><span id="line-1247">      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);</span>
-<span class="source-line-no">1248</span><span id="line-1248">      if (rpcCalls != null) {</span>
-<span class="source-line-no">1249</span><span id="line-1249">        this.rpcCallsHistogram.update(rpcCalls.longValue());</span>
-<span class="source-line-no">1250</span><span id="line-1250">      }</span>
-<span class="source-line-no">1251</span><span id="line-1251">      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);</span>
-<span class="source-line-no">1252</span><span id="line-1252">      if (remoteRpcCalls != null) {</span>
-<span class="source-line-no">1253</span><span id="line-1253">        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());</span>
-<span class="source-line-no">1254</span><span id="line-1254">      }</span>
-<span class="source-line-no">1255</span><span id="line-1255">      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);</span>
-<span class="source-line-no">1256</span><span id="line-1256">      if (millisBetweenNext != null) {</span>
-<span class="source-line-no">1257</span><span id="line-1257">        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());</span>
-<span class="source-line-no">1258</span><span id="line-1258">      }</span>
-<span class="source-line-no">1259</span><span id="line-1259">      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);</span>
-<span class="source-line-no">1260</span><span id="line-1260">      if (regionsScanned != null) {</span>
-<span class="source-line-no">1261</span><span id="line-1261">        this.regionsScannedHistogram.update(regionsScanned.longValue());</span>
-<span class="source-line-no">1262</span><span id="line-1262">      }</span>
-<span class="source-line-no">1263</span><span id="line-1263">      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);</span>
-<span class="source-line-no">1264</span><span id="line-1264">      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {</span>
-<span class="source-line-no">1265</span><span id="line-1265">        this.bytesInResultsHistogram.update(bytesInResults.longValue());</span>
+<span class="source-line-no">1239</span><span id="line-1239">    void updateValueSize(final Result r, final long latency) throws IOException {</span>
+<span class="source-line-no">1240</span><span id="line-1240">      if (r == null || (latency == 0)) return;</span>
+<span class="source-line-no">1241</span><span id="line-1241">      int size = 0;</span>
+<span class="source-line-no">1242</span><span id="line-1242">      // update replicaHistogram</span>
+<span class="source-line-no">1243</span><span id="line-1243">      if (r.isStale()) {</span>
+<span class="source-line-no">1244</span><span id="line-1244">        replicaLatencyHistogram.update(latency / 1000);</span>
+<span class="source-line-no">1245</span><span id="line-1245">        numOfReplyFromReplica++;</span>
+<span class="source-line-no">1246</span><span id="line-1246">      }</span>
+<span class="source-line-no">1247</span><span id="line-1247">      if (!isRandomValueSize()) return;</span>
+<span class="source-line-no">1248</span><span id="line-1248"></span>
+<span class="source-line-no">1249</span><span id="line-1249">      for (CellScanner scanner = r.cellScanner(); scanner.advance();) {</span>
+<span class="source-line-no">1250</span><span id="line-1250">        size += scanner.current().getValueLength();</span>
+<span class="source-line-no">1251</span><span id="line-1251">      }</span>
+<span class="source-line-no">1252</span><span id="line-1252">      updateValueSize(size);</span>
+<span class="source-line-no">1253</span><span id="line-1253">    }</span>
+<span class="source-line-no">1254</span><span id="line-1254"></span>
+<span class="source-line-no">1255</span><span id="line-1255">    void updateValueSize(final int valueSize) {</span>
+<span class="source-line-no">1256</span><span id="line-1256">      if (!isRandomValueSize()) return;</span>
+<span class="source-line-no">1257</span><span id="line-1257">      this.valueSizeHistogram.update(valueSize);</span>
+<span class="source-line-no">1258</span><span id="line-1258">    }</span>
+<span class="source-line-no">1259</span><span id="line-1259"></span>
+<span class="source-line-no">1260</span><span id="line-1260">    void updateScanMetrics(final ScanMetrics metrics) {</span>
+<span class="source-line-no">1261</span><span id="line-1261">      if (metrics == null) return;</span>
+<span class="source-line-no">1262</span><span id="line-1262">      Map&lt;String, Long&gt; metricsMap = metrics.getMetricsMap();</span>
+<span class="source-line-no">1263</span><span id="line-1263">      Long rpcCalls = metricsMap.get(ScanMetrics.RPC_CALLS_METRIC_NAME);</span>
+<span class="source-line-no">1264</span><span id="line-1264">      if (rpcCalls != null) {</span>
+<span class="source-line-no">1265</span><span id="line-1265">        this.rpcCallsHistogram.update(rpcCalls.longValue());</span>
 <span class="source-line-no">1266</span><span id="line-1266">      }</span>
-<span class="source-line-no">1267</span><span id="line-1267">      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);</span>
-<span class="source-line-no">1268</span><span id="line-1268">      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {</span>
-<span class="source-line-no">1269</span><span id="line-1269">        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());</span>
+<span class="source-line-no">1267</span><span id="line-1267">      Long remoteRpcCalls = metricsMap.get(ScanMetrics.REMOTE_RPC_CALLS_METRIC_NAME);</span>
+<span class="source-line-no">1268</span><span id="line-1268">      if (remoteRpcCalls != null) {</span>
+<span class="source-line-no">1269</span><span id="line-1269">        this.remoteRpcCallsHistogram.update(remoteRpcCalls.longValue());</span>
 <span class="source-line-no">1270</span><span id="line-1270">      }</span>
-<span class="source-line-no">1271</span><span id="line-1271">    }</span>
-<span class="source-line-no">1272</span><span id="line-1272"></span>
-<span class="source-line-no">1273</span><span id="line-1273">    String generateStatus(final int sr, final int i, final int lr) {</span>
-<span class="source-line-no">1274</span><span id="line-1274">      return "row [start=" + sr + ", current=" + i + ", last=" + lr + "], latency ["</span>
-<span class="source-line-no">1275</span><span id="line-1275">        + getShortLatencyReport() + "]"</span>
-<span class="source-line-no">1276</span><span id="line-1276">        + (!isRandomValueSize() ? "" : ", value size [" + getShortValueSizeReport() + "]");</span>
-<span class="source-line-no">1277</span><span id="line-1277">    }</span>
-<span class="source-line-no">1278</span><span id="line-1278"></span>
-<span class="source-line-no">1279</span><span id="line-1279">    boolean isRandomValueSize() {</span>
-<span class="source-line-no">1280</span><span id="line-1280">      return opts.valueRandom;</span>
-<span class="source-line-no">1281</span><span id="line-1281">    }</span>
-<span class="source-line-no">1282</span><span id="line-1282"></span>
-<span class="source-line-no">1283</span><span id="line-1283">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1284</span><span id="line-1284">      return opts.period;</span>
-<span class="source-line-no">1285</span><span id="line-1285">    }</span>
-<span class="source-line-no">1286</span><span id="line-1286"></span>
-<span class="source-line-no">1287</span><span id="line-1287">    /**</span>
-<span class="source-line-no">1288</span><span id="line-1288">     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.</span>
-<span class="source-line-no">1289</span><span id="line-1289">     */</span>
-<span class="source-line-no">1290</span><span id="line-1290">    public Histogram getLatencyHistogram() {</span>
-<span class="source-line-no">1291</span><span id="line-1291">      return latencyHistogram;</span>
-<span class="source-line-no">1292</span><span id="line-1292">    }</span>
-<span class="source-line-no">1293</span><span id="line-1293"></span>
-<span class="source-line-no">1294</span><span id="line-1294">    void testSetup() throws IOException {</span>
-<span class="source-line-no">1295</span><span id="line-1295">      // test metrics</span>
-<span class="source-line-no">1296</span><span id="line-1296">      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1297</span><span id="line-1297">      // If it is a replica test, set up histogram for replica.</span>
-<span class="source-line-no">1298</span><span id="line-1298">      if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">1299</span><span id="line-1299">        replicaLatencyHistogram =</span>
-<span class="source-line-no">1300</span><span id="line-1300">          YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1301</span><span id="line-1301">      }</span>
-<span class="source-line-no">1302</span><span id="line-1302">      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1303</span><span id="line-1303">      // scan metrics</span>
-<span class="source-line-no">1304</span><span id="line-1304">      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1305</span><span id="line-1305">      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1306</span><span id="line-1306">      millisBetweenNextHistogram =</span>
-<span class="source-line-no">1307</span><span id="line-1307">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1308</span><span id="line-1308">      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1309</span><span id="line-1309">      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1310</span><span id="line-1310">      bytesInRemoteResultsHistogram =</span>
-<span class="source-line-no">1311</span><span id="line-1311">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
-<span class="source-line-no">1312</span><span id="line-1312"></span>
-<span class="source-line-no">1313</span><span id="line-1313">      onStartup();</span>
-<span class="source-line-no">1314</span><span id="line-1314">    }</span>
-<span class="source-line-no">1315</span><span id="line-1315"></span>
-<span class="source-line-no">1316</span><span id="line-1316">    abstract void onStartup() throws IOException;</span>
-<span class="source-line-no">1317</span><span id="line-1317"></span>
-<span class="source-line-no">1318</span><span id="line-1318">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">1319</span><span id="line-1319">      onTakedown();</span>
-<span class="source-line-no">1320</span><span id="line-1320">      // Print all stats for this thread continuously.</span>
-<span class="source-line-no">1321</span><span id="line-1321">      // Synchronize on Test.class so different threads don't intermingle the</span>
-<span class="source-line-no">1322</span><span id="line-1322">      // output. We can't use 'this' here because each thread has its own instance of Test class.</span>
-<span class="source-line-no">1323</span><span id="line-1323">      synchronized (Test.class) {</span>
-<span class="source-line-no">1324</span><span id="line-1324">        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());</span>
-<span class="source-line-no">1325</span><span id="line-1325">        status</span>
-<span class="source-line-no">1326</span><span id="line-1326">          .setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(latencyHistogram));</span>
-<span class="source-line-no">1327</span><span id="line-1327">        if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">1328</span><span id="line-1328">          status.setStatus("Latency (us) from Replica Regions: "</span>
-<span class="source-line-no">1329</span><span id="line-1329">            + YammerHistogramUtils.getHistogramReport(replicaLatencyHistogram));</span>
-<span class="source-line-no">1330</span><span id="line-1330">        }</span>
-<span class="source-line-no">1331</span><span id="line-1331">        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());</span>
-<span class="source-line-no">1332</span><span id="line-1332">        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));</span>
-<span class="source-line-no">1333</span><span id="line-1333">        if (valueSizeHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1334</span><span id="line-1334">          status.setStatus(</span>
-<span class="source-line-no">1335</span><span id="line-1335">            "ValueSize (bytes) : " + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));</span>
-<span class="source-line-no">1336</span><span id="line-1336">          status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());</span>
-<span class="source-line-no">1337</span><span id="line-1337">          status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));</span>
-<span class="source-line-no">1338</span><span id="line-1338">        } else {</span>
-<span class="source-line-no">1339</span><span id="line-1339">          status.setStatus("No valueSize statistics available");</span>
-<span class="source-line-no">1340</span><span id="line-1340">        }</span>
-<span class="source-line-no">1341</span><span id="line-1341">        if (rpcCallsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1342</span><span id="line-1342">          status.setStatus(</span>
-<span class="source-line-no">1343</span><span id="line-1343">            "rpcCalls (count): " + YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));</span>
-<span class="source-line-no">1344</span><span id="line-1344">        }</span>
-<span class="source-line-no">1345</span><span id="line-1345">        if (remoteRpcCallsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1346</span><span id="line-1346">          status.setStatus("remoteRpcCalls (count): "</span>
-<span class="source-line-no">1347</span><span id="line-1347">            + YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));</span>
-<span class="source-line-no">1348</span><span id="line-1348">        }</span>
-<span class="source-line-no">1349</span><span id="line-1349">        if (millisBetweenNextHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1350</span><span id="line-1350">          status.setStatus("millisBetweenNext (latency): "</span>
-<span class="source-line-no">1351</span><span id="line-1351">            + YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));</span>
-<span class="source-line-no">1352</span><span id="line-1352">        }</span>
-<span class="source-line-no">1353</span><span id="line-1353">        if (regionsScannedHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1354</span><span id="line-1354">          status.setStatus("regionsScanned (count): "</span>
-<span class="source-line-no">1355</span><span id="line-1355">            + YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));</span>
+<span class="source-line-no">1271</span><span id="line-1271">      Long millisBetweenNext = metricsMap.get(ScanMetrics.MILLIS_BETWEEN_NEXTS_METRIC_NAME);</span>
+<span class="source-line-no">1272</span><span id="line-1272">      if (millisBetweenNext != null) {</span>
+<span class="source-line-no">1273</span><span id="line-1273">        this.millisBetweenNextHistogram.update(millisBetweenNext.longValue());</span>
+<span class="source-line-no">1274</span><span id="line-1274">      }</span>
+<span class="source-line-no">1275</span><span id="line-1275">      Long regionsScanned = metricsMap.get(ScanMetrics.REGIONS_SCANNED_METRIC_NAME);</span>
+<span class="source-line-no">1276</span><span id="line-1276">      if (regionsScanned != null) {</span>
+<span class="source-line-no">1277</span><span id="line-1277">        this.regionsScannedHistogram.update(regionsScanned.longValue());</span>
+<span class="source-line-no">1278</span><span id="line-1278">      }</span>
+<span class="source-line-no">1279</span><span id="line-1279">      Long bytesInResults = metricsMap.get(ScanMetrics.BYTES_IN_RESULTS_METRIC_NAME);</span>
+<span class="source-line-no">1280</span><span id="line-1280">      if (bytesInResults != null &amp;&amp; bytesInResults.longValue() &gt; 0) {</span>
+<span class="source-line-no">1281</span><span id="line-1281">        this.bytesInResultsHistogram.update(bytesInResults.longValue());</span>
+<span class="source-line-no">1282</span><span id="line-1282">      }</span>
+<span class="source-line-no">1283</span><span id="line-1283">      Long bytesInRemoteResults = metricsMap.get(ScanMetrics.BYTES_IN_REMOTE_RESULTS_METRIC_NAME);</span>
+<span class="source-line-no">1284</span><span id="line-1284">      if (bytesInRemoteResults != null &amp;&amp; bytesInRemoteResults.longValue() &gt; 0) {</span>
+<span class="source-line-no">1285</span><span id="line-1285">        this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.longValue());</span>
+<span class="source-line-no">1286</span><span id="line-1286">      }</span>
+<span class="source-line-no">1287</span><span id="line-1287">    }</span>
+<span class="source-line-no">1288</span><span id="line-1288"></span>
+<span class="source-line-no">1289</span><span id="line-1289">    String generateStatus(final int sr, final int i, final int lr) {</span>
+<span class="source-line-no">1290</span><span id="line-1290">      return "row [start=" + sr + ", current=" + i + ", last=" + lr + "], latency ["</span>
+<span class="source-line-no">1291</span><span id="line-1291">        + getShortLatencyReport() + "]"</span>
+<span class="source-line-no">1292</span><span id="line-1292">        + (!isRandomValueSize() ? "" : ", value size [" + getShortValueSizeReport() + "]");</span>
+<span class="source-line-no">1293</span><span id="line-1293">    }</span>
+<span class="source-line-no">1294</span><span id="line-1294"></span>
+<span class="source-line-no">1295</span><span id="line-1295">    boolean isRandomValueSize() {</span>
+<span class="source-line-no">1296</span><span id="line-1296">      return opts.valueRandom;</span>
+<span class="source-line-no">1297</span><span id="line-1297">    }</span>
+<span class="source-line-no">1298</span><span id="line-1298"></span>
+<span class="source-line-no">1299</span><span id="line-1299">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1300</span><span id="line-1300">      return opts.period;</span>
+<span class="source-line-no">1301</span><span id="line-1301">    }</span>
+<span class="source-line-no">1302</span><span id="line-1302"></span>
+<span class="source-line-no">1303</span><span id="line-1303">    /**</span>
+<span class="source-line-no">1304</span><span id="line-1304">     * Populated by testTakedown. Only implemented by RandomReadTest at the moment.</span>
+<span class="source-line-no">1305</span><span id="line-1305">     */</span>
+<span class="source-line-no">1306</span><span id="line-1306">    public Histogram getLatencyHistogram() {</span>
+<span class="source-line-no">1307</span><span id="line-1307">      return latencyHistogram;</span>
+<span class="source-line-no">1308</span><span id="line-1308">    }</span>
+<span class="source-line-no">1309</span><span id="line-1309"></span>
+<span class="source-line-no">1310</span><span id="line-1310">    void testSetup() throws IOException {</span>
+<span class="source-line-no">1311</span><span id="line-1311">      // test metrics</span>
+<span class="source-line-no">1312</span><span id="line-1312">      latencyHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1313</span><span id="line-1313">      // If it is a replica test, set up histogram for replica.</span>
+<span class="source-line-no">1314</span><span id="line-1314">      if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">1315</span><span id="line-1315">        replicaLatencyHistogram =</span>
+<span class="source-line-no">1316</span><span id="line-1316">          YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1317</span><span id="line-1317">      }</span>
+<span class="source-line-no">1318</span><span id="line-1318">      valueSizeHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1319</span><span id="line-1319">      // scan metrics</span>
+<span class="source-line-no">1320</span><span id="line-1320">      rpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1321</span><span id="line-1321">      remoteRpcCallsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1322</span><span id="line-1322">      millisBetweenNextHistogram =</span>
+<span class="source-line-no">1323</span><span id="line-1323">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1324</span><span id="line-1324">      regionsScannedHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1325</span><span id="line-1325">      bytesInResultsHistogram = YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1326</span><span id="line-1326">      bytesInRemoteResultsHistogram =</span>
+<span class="source-line-no">1327</span><span id="line-1327">        YammerHistogramUtils.newHistogram(new UniformReservoir(1024 * 500));</span>
+<span class="source-line-no">1328</span><span id="line-1328"></span>
+<span class="source-line-no">1329</span><span id="line-1329">      onStartup();</span>
+<span class="source-line-no">1330</span><span id="line-1330">    }</span>
+<span class="source-line-no">1331</span><span id="line-1331"></span>
+<span class="source-line-no">1332</span><span id="line-1332">    abstract void onStartup() throws IOException;</span>
+<span class="source-line-no">1333</span><span id="line-1333"></span>
+<span class="source-line-no">1334</span><span id="line-1334">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">1335</span><span id="line-1335">      onTakedown();</span>
+<span class="source-line-no">1336</span><span id="line-1336">      // Print all stats for this thread continuously.</span>
+<span class="source-line-no">1337</span><span id="line-1337">      // Synchronize on Test.class so different threads don't intermingle the</span>
+<span class="source-line-no">1338</span><span id="line-1338">      // output. We can't use 'this' here because each thread has its own instance of Test class.</span>
+<span class="source-line-no">1339</span><span id="line-1339">      synchronized (Test.class) {</span>
+<span class="source-line-no">1340</span><span id="line-1340">        status.setStatus("Test : " + testName + ", Thread : " + Thread.currentThread().getName());</span>
+<span class="source-line-no">1341</span><span id="line-1341">        status</span>
+<span class="source-line-no">1342</span><span id="line-1342">          .setStatus("Latency (us) : " + YammerHistogramUtils.getHistogramReport(latencyHistogram));</span>
+<span class="source-line-no">1343</span><span id="line-1343">        if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">1344</span><span id="line-1344">          status.setStatus("Latency (us) from Replica Regions: "</span>
+<span class="source-line-no">1345</span><span id="line-1345">            + YammerHistogramUtils.getHistogramReport(replicaLatencyHistogram));</span>
+<span class="source-line-no">1346</span><span id="line-1346">        }</span>
+<span class="source-line-no">1347</span><span id="line-1347">        status.setStatus("Num measures (latency) : " + latencyHistogram.getCount());</span>
+<span class="source-line-no">1348</span><span id="line-1348">        status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(latencyHistogram));</span>
+<span class="source-line-no">1349</span><span id="line-1349">        if (valueSizeHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1350</span><span id="line-1350">          status.setStatus(</span>
+<span class="source-line-no">1351</span><span id="line-1351">            "ValueSize (bytes) : " + YammerHistogramUtils.getHistogramReport(valueSizeHistogram));</span>
+<span class="source-line-no">1352</span><span id="line-1352">          status.setStatus("Num measures (ValueSize): " + valueSizeHistogram.getCount());</span>
+<span class="source-line-no">1353</span><span id="line-1353">          status.setStatus(YammerHistogramUtils.getPrettyHistogramReport(valueSizeHistogram));</span>
+<span class="source-line-no">1354</span><span id="line-1354">        } else {</span>
+<span class="source-line-no">1355</span><span id="line-1355">          status.setStatus("No valueSize statistics available");</span>
 <span class="source-line-no">1356</span><span id="line-1356">        }</span>
-<span class="source-line-no">1357</span><span id="line-1357">        if (bytesInResultsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1358</span><span id="line-1358">          status.setStatus("bytesInResults (size): "</span>
-<span class="source-line-no">1359</span><span id="line-1359">            + YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));</span>
+<span class="source-line-no">1357</span><span id="line-1357">        if (rpcCallsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1358</span><span id="line-1358">          status.setStatus(</span>
+<span class="source-line-no">1359</span><span id="line-1359">            "rpcCalls (count): " + YammerHistogramUtils.getHistogramReport(rpcCallsHistogram));</span>
 <span class="source-line-no">1360</span><span id="line-1360">        }</span>
-<span class="source-line-no">1361</span><span id="line-1361">        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {</span>
-<span class="source-line-no">1362</span><span id="line-1362">          status.setStatus("bytesInRemoteResults (size): "</span>
-<span class="source-line-no">1363</span><span id="line-1363">            + YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));</span>
+<span class="source-line-no">1361</span><span id="line-1361">        if (remoteRpcCallsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1362</span><span id="line-1362">          status.setStatus("remoteRpcCalls (count): "</span>
+<span class="source-line-no">1363</span><span id="line-1363">            + YammerHistogramUtils.getHistogramReport(remoteRpcCallsHistogram));</span>
 <span class="source-line-no">1364</span><span id="line-1364">        }</span>
-<span class="source-line-no">1365</span><span id="line-1365">      }</span>
-<span class="source-line-no">1366</span><span id="line-1366">    }</span>
-<span class="source-line-no">1367</span><span id="line-1367"></span>
-<span class="source-line-no">1368</span><span id="line-1368">    abstract void onTakedown() throws IOException;</span>
-<span class="source-line-no">1369</span><span id="line-1369"></span>
-<span class="source-line-no">1370</span><span id="line-1370">    /*</span>
-<span class="source-line-no">1371</span><span id="line-1371">     * Run test</span>
-<span class="source-line-no">1372</span><span id="line-1372">     * @return Elapsed time.</span>
-<span class="source-line-no">1373</span><span id="line-1373">     */</span>
-<span class="source-line-no">1374</span><span id="line-1374">    long test() throws IOException, InterruptedException {</span>
-<span class="source-line-no">1375</span><span id="line-1375">      testSetup();</span>
-<span class="source-line-no">1376</span><span id="line-1376">      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());</span>
-<span class="source-line-no">1377</span><span id="line-1377">      final long startTime = System.nanoTime();</span>
-<span class="source-line-no">1378</span><span id="line-1378">      try {</span>
-<span class="source-line-no">1379</span><span id="line-1379">        testTimed();</span>
-<span class="source-line-no">1380</span><span id="line-1380">      } finally {</span>
-<span class="source-line-no">1381</span><span id="line-1381">        testTakedown();</span>
-<span class="source-line-no">1382</span><span id="line-1382">      }</span>
-<span class="source-line-no">1383</span><span id="line-1383">      return (System.nanoTime() - startTime) / 1000000;</span>
-<span class="source-line-no">1384</span><span id="line-1384">    }</span>
+<span class="source-line-no">1365</span><span id="line-1365">        if (millisBetweenNextHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1366</span><span id="line-1366">          status.setStatus("millisBetweenNext (latency): "</span>
+<span class="source-line-no">1367</span><span id="line-1367">            + YammerHistogramUtils.getHistogramReport(millisBetweenNextHistogram));</span>
+<span class="source-line-no">1368</span><span id="line-1368">        }</span>
+<span class="source-line-no">1369</span><span id="line-1369">        if (regionsScannedHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1370</span><span id="line-1370">          status.setStatus("regionsScanned (count): "</span>
+<span class="source-line-no">1371</span><span id="line-1371">            + YammerHistogramUtils.getHistogramReport(regionsScannedHistogram));</span>
+<span class="source-line-no">1372</span><span id="line-1372">        }</span>
+<span class="source-line-no">1373</span><span id="line-1373">        if (bytesInResultsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1374</span><span id="line-1374">          status.setStatus("bytesInResults (size): "</span>
+<span class="source-line-no">1375</span><span id="line-1375">            + YammerHistogramUtils.getHistogramReport(bytesInResultsHistogram));</span>
+<span class="source-line-no">1376</span><span id="line-1376">        }</span>
+<span class="source-line-no">1377</span><span id="line-1377">        if (bytesInRemoteResultsHistogram.getCount() &gt; 0) {</span>
+<span class="source-line-no">1378</span><span id="line-1378">          status.setStatus("bytesInRemoteResults (size): "</span>
+<span class="source-line-no">1379</span><span id="line-1379">            + YammerHistogramUtils.getHistogramReport(bytesInRemoteResultsHistogram));</span>
+<span class="source-line-no">1380</span><span id="line-1380">        }</span>
+<span class="source-line-no">1381</span><span id="line-1381">      }</span>
+<span class="source-line-no">1382</span><span id="line-1382">    }</span>
+<span class="source-line-no">1383</span><span id="line-1383"></span>
+<span class="source-line-no">1384</span><span id="line-1384">    abstract void onTakedown() throws IOException;</span>
 <span class="source-line-no">1385</span><span id="line-1385"></span>
-<span class="source-line-no">1386</span><span id="line-1386">    int getStartRow() {</span>
-<span class="source-line-no">1387</span><span id="line-1387">      return opts.startRow;</span>
-<span class="source-line-no">1388</span><span id="line-1388">    }</span>
-<span class="source-line-no">1389</span><span id="line-1389"></span>
-<span class="source-line-no">1390</span><span id="line-1390">    int getLastRow() {</span>
-<span class="source-line-no">1391</span><span id="line-1391">      return getStartRow() + opts.perClientRunRows;</span>
-<span class="source-line-no">1392</span><span id="line-1392">    }</span>
-<span class="source-line-no">1393</span><span id="line-1393"></span>
-<span class="source-line-no">1394</span><span id="line-1394">    /**</span>
-<span class="source-line-no">1395</span><span id="line-1395">     * Provides an extension point for tests that don't want a per row invocation.</span>
-<span class="source-line-no">1396</span><span id="line-1396">     */</span>
-<span class="source-line-no">1397</span><span id="line-1397">    void testTimed() throws IOException, InterruptedException {</span>
-<span class="source-line-no">1398</span><span id="line-1398">      int startRow = getStartRow();</span>
-<span class="source-line-no">1399</span><span id="line-1399">      int lastRow = getLastRow();</span>
-<span class="source-line-no">1400</span><span id="line-1400">      // Report on completion of 1/10th of total.</span>
-<span class="source-line-no">1401</span><span id="line-1401">      for (int ii = 0; ii &lt; opts.cycles; ii++) {</span>
-<span class="source-line-no">1402</span><span id="line-1402">        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);</span>
-<span class="source-line-no">1403</span><span id="line-1403">        for (int i = startRow; i &lt; lastRow; i++) {</span>
-<span class="source-line-no">1404</span><span id="line-1404">          if (i % everyN != 0) continue;</span>
-<span class="source-line-no">1405</span><span id="line-1405">          long startTime = System.nanoTime();</span>
-<span class="source-line-no">1406</span><span id="line-1406">          boolean requestSent = false;</span>
-<span class="source-line-no">1407</span><span id="line-1407">          Span span = TraceUtil.getGlobalTracer().spanBuilder("test row").startSpan();</span>
-<span class="source-line-no">1408</span><span id="line-1408">          try (Scope scope = span.makeCurrent()) {</span>
-<span class="source-line-no">1409</span><span id="line-1409">            requestSent = testRow(i, startTime);</span>
-<span class="source-line-no">1410</span><span id="line-1410">          } finally {</span>
-<span class="source-line-no">1411</span><span id="line-1411">            span.end();</span>
-<span class="source-line-no">1412</span><span id="line-1412">          }</span>
-<span class="source-line-no">1413</span><span id="line-1413">          if ((i - startRow) &gt; opts.measureAfter) {</span>
-<span class="source-line-no">1414</span><span id="line-1414">            // If multiget or multiput is enabled, say set to 10, testRow() returns immediately</span>
-<span class="source-line-no">1415</span><span id="line-1415">            // first 9 times and sends the actual get request in the 10th iteration.</span>
-<span class="source-line-no">1416</span><span id="line-1416">            // We should only set latency when actual request is sent because otherwise</span>
-<span class="source-line-no">1417</span><span id="line-1417">            // it turns out to be 0.</span>
-<span class="source-line-no">1418</span><span id="line-1418">            if (requestSent) {</span>
-<span class="source-line-no">1419</span><span id="line-1419">              long latency = (System.nanoTime() - startTime) / 1000;</span>
-<span class="source-line-no">1420</span><span id="line-1420">              latencyHistogram.update(latency);</span>
-<span class="source-line-no">1421</span><span id="line-1421">              if ((opts.latencyThreshold &gt; 0) &amp;&amp; (latency / 1000 &gt;= opts.latencyThreshold)) {</span>
-<span class="source-line-no">1422</span><span id="line-1422">                numOfReplyOverLatencyThreshold++;</span>
-<span class="source-line-no">1423</span><span id="line-1423">              }</span>
-<span class="source-line-no">1424</span><span id="line-1424">            }</span>
-<span class="source-line-no">1425</span><span id="line-1425">            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {</span>
-<span class="source-line-no">1426</span><span id="line-1426">              status.setStatus(generateStatus(startRow, i, lastRow));</span>
-<span class="source-line-no">1427</span><span id="line-1427">            }</span>
+<span class="source-line-no">1386</span><span id="line-1386">    /*</span>
+<span class="source-line-no">1387</span><span id="line-1387">     * Run test</span>
+<span class="source-line-no">1388</span><span id="line-1388">     * @return Elapsed time.</span>
+<span class="source-line-no">1389</span><span id="line-1389">     */</span>
+<span class="source-line-no">1390</span><span id="line-1390">    long test() throws IOException, InterruptedException {</span>
+<span class="source-line-no">1391</span><span id="line-1391">      testSetup();</span>
+<span class="source-line-no">1392</span><span id="line-1392">      LOG.info("Timed test starting in thread " + Thread.currentThread().getName());</span>
+<span class="source-line-no">1393</span><span id="line-1393">      final long startTime = System.nanoTime();</span>
+<span class="source-line-no">1394</span><span id="line-1394">      try {</span>
+<span class="source-line-no">1395</span><span id="line-1395">        testTimed();</span>
+<span class="source-line-no">1396</span><span id="line-1396">      } finally {</span>
+<span class="source-line-no">1397</span><span id="line-1397">        testTakedown();</span>
+<span class="source-line-no">1398</span><span id="line-1398">      }</span>
+<span class="source-line-no">1399</span><span id="line-1399">      return (System.nanoTime() - startTime) / 1000000;</span>
+<span class="source-line-no">1400</span><span id="line-1400">    }</span>
+<span class="source-line-no">1401</span><span id="line-1401"></span>
+<span class="source-line-no">1402</span><span id="line-1402">    int getStartRow() {</span>
+<span class="source-line-no">1403</span><span id="line-1403">      return opts.startRow;</span>
+<span class="source-line-no">1404</span><span id="line-1404">    }</span>
+<span class="source-line-no">1405</span><span id="line-1405"></span>
+<span class="source-line-no">1406</span><span id="line-1406">    int getLastRow() {</span>
+<span class="source-line-no">1407</span><span id="line-1407">      return getStartRow() + opts.perClientRunRows;</span>
+<span class="source-line-no">1408</span><span id="line-1408">    }</span>
+<span class="source-line-no">1409</span><span id="line-1409"></span>
+<span class="source-line-no">1410</span><span id="line-1410">    /**</span>
+<span class="source-line-no">1411</span><span id="line-1411">     * Provides an extension point for tests that don't want a per row invocation.</span>
+<span class="source-line-no">1412</span><span id="line-1412">     */</span>
+<span class="source-line-no">1413</span><span id="line-1413">    void testTimed() throws IOException, InterruptedException {</span>
+<span class="source-line-no">1414</span><span id="line-1414">      int startRow = getStartRow();</span>
+<span class="source-line-no">1415</span><span id="line-1415">      int lastRow = getLastRow();</span>
+<span class="source-line-no">1416</span><span id="line-1416">      // Report on completion of 1/10th of total.</span>
+<span class="source-line-no">1417</span><span id="line-1417">      for (int ii = 0; ii &lt; opts.cycles; ii++) {</span>
+<span class="source-line-no">1418</span><span id="line-1418">        if (opts.cycles &gt; 1) LOG.info("Cycle=" + ii + " of " + opts.cycles);</span>
+<span class="source-line-no">1419</span><span id="line-1419">        for (int i = startRow; i &lt; lastRow; i++) {</span>
+<span class="source-line-no">1420</span><span id="line-1420">          if (i % everyN != 0) continue;</span>
+<span class="source-line-no">1421</span><span id="line-1421">          long startTime = System.nanoTime();</span>
+<span class="source-line-no">1422</span><span id="line-1422">          boolean requestSent = false;</span>
+<span class="source-line-no">1423</span><span id="line-1423">          Span span = TraceUtil.getGlobalTracer().spanBuilder("test row").startSpan();</span>
+<span class="source-line-no">1424</span><span id="line-1424">          try (Scope scope = span.makeCurrent()) {</span>
+<span class="source-line-no">1425</span><span id="line-1425">            requestSent = testRow(i, startTime);</span>
+<span class="source-line-no">1426</span><span id="line-1426">          } finally {</span>
+<span class="source-line-no">1427</span><span id="line-1427">            span.end();</span>
 <span class="source-line-no">1428</span><span id="line-1428">          }</span>
-<span class="source-line-no">1429</span><span id="line-1429">        }</span>
-<span class="source-line-no">1430</span><span id="line-1430">      }</span>
-<span class="source-line-no">1431</span><span id="line-1431">    }</span>
-<span class="source-line-no">1432</span><span id="line-1432"></span>
-<span class="source-line-no">1433</span><span id="line-1433">    /** Returns Subset of the histograms' calculation. */</span>
-<span class="source-line-no">1434</span><span id="line-1434">    public String getShortLatencyReport() {</span>
-<span class="source-line-no">1435</span><span id="line-1435">      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);</span>
-<span class="source-line-no">1436</span><span id="line-1436">    }</span>
-<span class="source-line-no">1437</span><span id="line-1437"></span>
-<span class="source-line-no">1438</span><span id="line-1438">    /** Returns Subset of the histograms' calculation. */</span>
-<span class="source-line-no">1439</span><span id="line-1439">    public String getShortValueSizeReport() {</span>
-<span class="source-line-no">1440</span><span id="line-1440">      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);</span>
-<span class="source-line-no">1441</span><span id="line-1441">    }</span>
-<span class="source-line-no">1442</span><span id="line-1442"></span>
-<span class="source-line-no">1443</span><span id="line-1443">    /**</span>
-<span class="source-line-no">1444</span><span id="line-1444">     * Test for individual row.</span>
-<span class="source-line-no">1445</span><span id="line-1445">     * @param i Row index.</span>
-<span class="source-line-no">1446</span><span id="line-1446">     * @return true if the row was sent to server and need to record metrics. False if not, multiGet</span>
-<span class="source-line-no">1447</span><span id="line-1447">     *         and multiPut e.g., the rows are sent to server only if enough gets/puts are gathered.</span>
-<span class="source-line-no">1448</span><span id="line-1448">     */</span>
-<span class="source-line-no">1449</span><span id="line-1449">    abstract boolean testRow(final int i, final long startTime)</span>
-<span class="source-line-no">1450</span><span id="line-1450">      throws IOException, InterruptedException;</span>
-<span class="source-line-no">1451</span><span id="line-1451">  }</span>
-<span class="source-line-no">1452</span><span id="line-1452"></span>
-<span class="source-line-no">1453</span><span id="line-1453">  static abstract class Test extends TestBase {</span>
-<span class="source-line-no">1454</span><span id="line-1454">    protected Connection connection;</span>
-<span class="source-line-no">1455</span><span id="line-1455"></span>
-<span class="source-line-no">1456</span><span id="line-1456">    Test(final Connection con, final TestOptions options, final Status status) {</span>
-<span class="source-line-no">1457</span><span id="line-1457">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
-<span class="source-line-no">1458</span><span id="line-1458">      this.connection = con;</span>
-<span class="source-line-no">1459</span><span id="line-1459">    }</span>
-<span class="source-line-no">1460</span><span id="line-1460">  }</span>
-<span class="source-line-no">1461</span><span id="line-1461"></span>
-<span class="source-line-no">1462</span><span id="line-1462">  static abstract class AsyncTest extends TestBase {</span>
-<span class="source-line-no">1463</span><span id="line-1463">    protected AsyncConnection connection;</span>
-<span class="source-line-no">1464</span><span id="line-1464"></span>
-<span class="source-line-no">1465</span><span id="line-1465">    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {</span>
-<span class="source-line-no">1466</span><span id="line-1466">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
-<span class="source-line-no">1467</span><span id="line-1467">      this.connection = con;</span>
-<span class="source-line-no">1468</span><span id="line-1468">    }</span>
-<span class="source-line-no">1469</span><span id="line-1469">  }</span>
-<span class="source-line-no">1470</span><span id="line-1470"></span>
-<span class="source-line-no">1471</span><span id="line-1471">  static abstract class TableTest extends Test {</span>
-<span class="source-line-no">1472</span><span id="line-1472">    protected Table table;</span>
-<span class="source-line-no">1473</span><span id="line-1473"></span>
-<span class="source-line-no">1474</span><span id="line-1474">    TableTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1475</span><span id="line-1475">      super(con, options, status);</span>
-<span class="source-line-no">1476</span><span id="line-1476">    }</span>
+<span class="source-line-no">1429</span><span id="line-1429">          if ((i - startRow) &gt; opts.measureAfter) {</span>
+<span class="source-line-no">1430</span><span id="line-1430">            // If multiget or multiput is enabled, say set to 10, testRow() returns immediately</span>
+<span class="source-line-no">1431</span><span id="line-1431">            // first 9 times and sends the actual get request in the 10th iteration.</span>
+<span class="source-line-no">1432</span><span id="line-1432">            // We should only set latency when actual request is sent because otherwise</span>
+<span class="source-line-no">1433</span><span id="line-1433">            // it turns out to be 0.</span>
+<span class="source-line-no">1434</span><span id="line-1434">            if (requestSent) {</span>
+<span class="source-line-no">1435</span><span id="line-1435">              long latency = (System.nanoTime() - startTime) / 1000;</span>
+<span class="source-line-no">1436</span><span id="line-1436">              latencyHistogram.update(latency);</span>
+<span class="source-line-no">1437</span><span id="line-1437">              if ((opts.latencyThreshold &gt; 0) &amp;&amp; (latency / 1000 &gt;= opts.latencyThreshold)) {</span>
+<span class="source-line-no">1438</span><span id="line-1438">                numOfReplyOverLatencyThreshold++;</span>
+<span class="source-line-no">1439</span><span id="line-1439">              }</span>
+<span class="source-line-no">1440</span><span id="line-1440">            }</span>
+<span class="source-line-no">1441</span><span id="line-1441">            if (status != null &amp;&amp; i &gt; 0 &amp;&amp; (i % getReportingPeriod()) == 0) {</span>
+<span class="source-line-no">1442</span><span id="line-1442">              status.setStatus(generateStatus(startRow, i, lastRow));</span>
+<span class="source-line-no">1443</span><span id="line-1443">            }</span>
+<span class="source-line-no">1444</span><span id="line-1444">          }</span>
+<span class="source-line-no">1445</span><span id="line-1445">        }</span>
+<span class="source-line-no">1446</span><span id="line-1446">      }</span>
+<span class="source-line-no">1447</span><span id="line-1447">    }</span>
+<span class="source-line-no">1448</span><span id="line-1448"></span>
+<span class="source-line-no">1449</span><span id="line-1449">    /** Returns Subset of the histograms' calculation. */</span>
+<span class="source-line-no">1450</span><span id="line-1450">    public String getShortLatencyReport() {</span>
+<span class="source-line-no">1451</span><span id="line-1451">      return YammerHistogramUtils.getShortHistogramReport(this.latencyHistogram);</span>
+<span class="source-line-no">1452</span><span id="line-1452">    }</span>
+<span class="source-line-no">1453</span><span id="line-1453"></span>
+<span class="source-line-no">1454</span><span id="line-1454">    /** Returns Subset of the histograms' calculation. */</span>
+<span class="source-line-no">1455</span><span id="line-1455">    public String getShortValueSizeReport() {</span>
+<span class="source-line-no">1456</span><span id="line-1456">      return YammerHistogramUtils.getShortHistogramReport(this.valueSizeHistogram);</span>
+<span class="source-line-no">1457</span><span id="line-1457">    }</span>
+<span class="source-line-no">1458</span><span id="line-1458"></span>
+<span class="source-line-no">1459</span><span id="line-1459">    /**</span>
+<span class="source-line-no">1460</span><span id="line-1460">     * Test for individual row.</span>
+<span class="source-line-no">1461</span><span id="line-1461">     * @param i Row index.</span>
+<span class="source-line-no">1462</span><span id="line-1462">     * @return true if the row was sent to server and need to record metrics. False if not, multiGet</span>
+<span class="source-line-no">1463</span><span id="line-1463">     *         and multiPut e.g., the rows are sent to server only if enough gets/puts are gathered.</span>
+<span class="source-line-no">1464</span><span id="line-1464">     */</span>
+<span class="source-line-no">1465</span><span id="line-1465">    abstract boolean testRow(final int i, final long startTime)</span>
+<span class="source-line-no">1466</span><span id="line-1466">      throws IOException, InterruptedException;</span>
+<span class="source-line-no">1467</span><span id="line-1467">  }</span>
+<span class="source-line-no">1468</span><span id="line-1468"></span>
+<span class="source-line-no">1469</span><span id="line-1469">  static abstract class Test extends TestBase {</span>
+<span class="source-line-no">1470</span><span id="line-1470">    protected Connection connection;</span>
+<span class="source-line-no">1471</span><span id="line-1471"></span>
+<span class="source-line-no">1472</span><span id="line-1472">    Test(final Connection con, final TestOptions options, final Status status) {</span>
+<span class="source-line-no">1473</span><span id="line-1473">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
+<span class="source-line-no">1474</span><span id="line-1474">      this.connection = con;</span>
+<span class="source-line-no">1475</span><span id="line-1475">    }</span>
+<span class="source-line-no">1476</span><span id="line-1476">  }</span>
 <span class="source-line-no">1477</span><span id="line-1477"></span>
-<span class="source-line-no">1478</span><span id="line-1478">    @Override</span>
-<span class="source-line-no">1479</span><span id="line-1479">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1480</span><span id="line-1480">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1481</span><span id="line-1481">    }</span>
-<span class="source-line-no">1482</span><span id="line-1482"></span>
-<span class="source-line-no">1483</span><span id="line-1483">    @Override</span>
-<span class="source-line-no">1484</span><span id="line-1484">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1485</span><span id="line-1485">      table.close();</span>
-<span class="source-line-no">1486</span><span id="line-1486">    }</span>
-<span class="source-line-no">1487</span><span id="line-1487">  }</span>
-<span class="source-line-no">1488</span><span id="line-1488"></span>
-<span class="source-line-no">1489</span><span id="line-1489">  /*</span>
-<span class="source-line-no">1490</span><span id="line-1490">   * Parent class for all meta tests: MetaWriteTest, MetaRandomReadTest and CleanMetaTest</span>
-<span class="source-line-no">1491</span><span id="line-1491">   */</span>
-<span class="source-line-no">1492</span><span id="line-1492">  static abstract class MetaTest extends TableTest {</span>
-<span class="source-line-no">1493</span><span id="line-1493">    protected int keyLength;</span>
-<span class="source-line-no">1494</span><span id="line-1494"></span>
-<span class="source-line-no">1495</span><span id="line-1495">    MetaTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1496</span><span id="line-1496">      super(con, options, status);</span>
-<span class="source-line-no">1497</span><span id="line-1497">      keyLength = Integer.toString(opts.perClientRunRows).length();</span>
-<span class="source-line-no">1498</span><span id="line-1498">    }</span>
-<span class="source-line-no">1499</span><span id="line-1499"></span>
-<span class="source-line-no">1500</span><span id="line-1500">    @Override</span>
-<span class="source-line-no">1501</span><span id="line-1501">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1502</span><span id="line-1502">      // No clean up</span>
-<span class="source-line-no">1503</span><span id="line-1503">    }</span>
+<span class="source-line-no">1478</span><span id="line-1478">  static abstract class AsyncTest extends TestBase {</span>
+<span class="source-line-no">1479</span><span id="line-1479">    protected AsyncConnection connection;</span>
+<span class="source-line-no">1480</span><span id="line-1480"></span>
+<span class="source-line-no">1481</span><span id="line-1481">    AsyncTest(final AsyncConnection con, final TestOptions options, final Status status) {</span>
+<span class="source-line-no">1482</span><span id="line-1482">      super(con == null ? HBaseConfiguration.create() : con.getConfiguration(), options, status);</span>
+<span class="source-line-no">1483</span><span id="line-1483">      this.connection = con;</span>
+<span class="source-line-no">1484</span><span id="line-1484">    }</span>
+<span class="source-line-no">1485</span><span id="line-1485">  }</span>
+<span class="source-line-no">1486</span><span id="line-1486"></span>
+<span class="source-line-no">1487</span><span id="line-1487">  static abstract class TableTest extends Test {</span>
+<span class="source-line-no">1488</span><span id="line-1488">    protected Table table;</span>
+<span class="source-line-no">1489</span><span id="line-1489"></span>
+<span class="source-line-no">1490</span><span id="line-1490">    TableTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1491</span><span id="line-1491">      super(con, options, status);</span>
+<span class="source-line-no">1492</span><span id="line-1492">    }</span>
+<span class="source-line-no">1493</span><span id="line-1493"></span>
+<span class="source-line-no">1494</span><span id="line-1494">    @Override</span>
+<span class="source-line-no">1495</span><span id="line-1495">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1496</span><span id="line-1496">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1497</span><span id="line-1497">    }</span>
+<span class="source-line-no">1498</span><span id="line-1498"></span>
+<span class="source-line-no">1499</span><span id="line-1499">    @Override</span>
+<span class="source-line-no">1500</span><span id="line-1500">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1501</span><span id="line-1501">      table.close();</span>
+<span class="source-line-no">1502</span><span id="line-1502">    }</span>
+<span class="source-line-no">1503</span><span id="line-1503">  }</span>
 <span class="source-line-no">1504</span><span id="line-1504"></span>
-<span class="source-line-no">1505</span><span id="line-1505">    /*</span>
-<span class="source-line-no">1506</span><span id="line-1506">     * Generates Lexicographically ascending strings</span>
-<span class="source-line-no">1507</span><span id="line-1507">     */</span>
-<span class="source-line-no">1508</span><span id="line-1508">    protected byte[] getSplitKey(final int i) {</span>
-<span class="source-line-no">1509</span><span id="line-1509">      return Bytes.toBytes(String.format("%0" + keyLength + "d", i));</span>
-<span class="source-line-no">1510</span><span id="line-1510">    }</span>
-<span class="source-line-no">1511</span><span id="line-1511"></span>
-<span class="source-line-no">1512</span><span id="line-1512">  }</span>
-<span class="source-line-no">1513</span><span id="line-1513"></span>
-<span class="source-line-no">1514</span><span id="line-1514">  static abstract class AsyncTableTest extends AsyncTest {</span>
-<span class="source-line-no">1515</span><span id="line-1515">    protected AsyncTable&lt;?&gt; table;</span>
-<span class="source-line-no">1516</span><span id="line-1516"></span>
-<span class="source-line-no">1517</span><span id="line-1517">    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1518</span><span id="line-1518">      super(con, options, status);</span>
+<span class="source-line-no">1505</span><span id="line-1505">  /*</span>
+<span class="source-line-no">1506</span><span id="line-1506">   * Parent class for all meta tests: MetaWriteTest, MetaRandomReadTest and CleanMetaTest</span>
+<span class="source-line-no">1507</span><span id="line-1507">   */</span>
+<span class="source-line-no">1508</span><span id="line-1508">  static abstract class MetaTest extends TableTest {</span>
+<span class="source-line-no">1509</span><span id="line-1509">    protected int keyLength;</span>
+<span class="source-line-no">1510</span><span id="line-1510"></span>
+<span class="source-line-no">1511</span><span id="line-1511">    MetaTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1512</span><span id="line-1512">      super(con, options, status);</span>
+<span class="source-line-no">1513</span><span id="line-1513">      keyLength = Integer.toString(opts.perClientRunRows).length();</span>
+<span class="source-line-no">1514</span><span id="line-1514">    }</span>
+<span class="source-line-no">1515</span><span id="line-1515"></span>
+<span class="source-line-no">1516</span><span id="line-1516">    @Override</span>
+<span class="source-line-no">1517</span><span id="line-1517">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1518</span><span id="line-1518">      // No clean up</span>
 <span class="source-line-no">1519</span><span id="line-1519">    }</span>
 <span class="source-line-no">1520</span><span id="line-1520"></span>
-<span class="source-line-no">1521</span><span id="line-1521">    @Override</span>
-<span class="source-line-no">1522</span><span id="line-1522">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1523</span><span id="line-1523">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1524</span><span id="line-1524">    }</span>
-<span class="source-line-no">1525</span><span id="line-1525"></span>
-<span class="source-line-no">1526</span><span id="line-1526">    @Override</span>
-<span class="source-line-no">1527</span><span id="line-1527">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1528</span><span id="line-1528">    }</span>
-<span class="source-line-no">1529</span><span id="line-1529">  }</span>
-<span class="source-line-no">1530</span><span id="line-1530"></span>
-<span class="source-line-no">1531</span><span id="line-1531">  static class AsyncRandomReadTest extends AsyncTableTest {</span>
-<span class="source-line-no">1532</span><span id="line-1532">    private final Consistency consistency;</span>
-<span class="source-line-no">1533</span><span id="line-1533">    private ArrayList&lt;Get&gt; gets;</span>
-<span class="source-line-no">1534</span><span id="line-1534"></span>
-<span class="source-line-no">1535</span><span id="line-1535">    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1536</span><span id="line-1536">      super(con, options, status);</span>
-<span class="source-line-no">1537</span><span id="line-1537">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
-<span class="source-line-no">1538</span><span id="line-1538">      if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1539</span><span id="line-1539">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
-<span class="source-line-no">1540</span><span id="line-1540">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
-<span class="source-line-no">1541</span><span id="line-1541">      }</span>
-<span class="source-line-no">1542</span><span id="line-1542">    }</span>
-<span class="source-line-no">1543</span><span id="line-1543"></span>
-<span class="source-line-no">1544</span><span id="line-1544">    @Override</span>
-<span class="source-line-no">1545</span><span id="line-1545">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1546</span><span id="line-1546">      if (opts.randomSleep &gt; 0) {</span>
-<span class="source-line-no">1547</span><span id="line-1547">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
-<span class="source-line-no">1548</span><span id="line-1548">      }</span>
-<span class="source-line-no">1549</span><span id="line-1549">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
-<span class="source-line-no">1550</span><span id="line-1550">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1551</span><span id="line-1551">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1552</span><span id="line-1552">        if (opts.addColumns) {</span>
-<span class="source-line-no">1553</span><span id="line-1553">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1554</span><span id="line-1554">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1555</span><span id="line-1555">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1556</span><span id="line-1556">          }</span>
-<span class="source-line-no">1557</span><span id="line-1557">        } else {</span>
-<span class="source-line-no">1558</span><span id="line-1558">          get.addFamily(familyName);</span>
-<span class="source-line-no">1559</span><span id="line-1559">        }</span>
-<span class="source-line-no">1560</span><span id="line-1560">      }</span>
-<span class="source-line-no">1561</span><span id="line-1561">      if (opts.filterAll) {</span>
-<span class="source-line-no">1562</span><span id="line-1562">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1563</span><span id="line-1563">      }</span>
-<span class="source-line-no">1564</span><span id="line-1564">      get.setConsistency(consistency);</span>
-<span class="source-line-no">1565</span><span id="line-1565">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
-<span class="source-line-no">1566</span><span id="line-1566">      try {</span>
-<span class="source-line-no">1567</span><span id="line-1567">        if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1568</span><span id="line-1568">          this.gets.add(get);</span>
-<span class="source-line-no">1569</span><span id="line-1569">          if (this.gets.size() == opts.multiGet) {</span>
-<span class="source-line-no">1570</span><span id="line-1570">            Result[] rs =</span>
-<span class="source-line-no">1571</span><span id="line-1571">              this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);</span>
-<span class="source-line-no">1572</span><span id="line-1572">            updateValueSize(rs);</span>
-<span class="source-line-no">1573</span><span id="line-1573">            this.gets.clear();</span>
-<span class="source-line-no">1574</span><span id="line-1574">          } else {</span>
-<span class="source-line-no">1575</span><span id="line-1575">            return false;</span>
-<span class="source-line-no">1576</span><span id="line-1576">          }</span>
-<span class="source-line-no">1577</span><span id="line-1577">        } else {</span>
-<span class="source-line-no">1578</span><span id="line-1578">          updateValueSize(this.table.get(get).get());</span>
-<span class="source-line-no">1579</span><span id="line-1579">        }</span>
-<span class="source-line-no">1580</span><span id="line-1580">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">1581</span><span id="line-1581">        throw new IOException(e);</span>
-<span class="source-line-no">1582</span><span id="line-1582">      }</span>
-<span class="source-line-no">1583</span><span id="line-1583">      return true;</span>
-<span class="source-line-no">1584</span><span id="line-1584">    }</span>
-<span class="source-line-no">1585</span><span id="line-1585"></span>
-<span class="source-line-no">1586</span><span id="line-1586">    public static RuntimeException runtime(Throwable e) {</span>
-<span class="source-line-no">1587</span><span id="line-1587">      if (e instanceof RuntimeException) {</span>
-<span class="source-line-no">1588</span><span id="line-1588">        return (RuntimeException) e;</span>
-<span class="source-line-no">1589</span><span id="line-1589">      }</span>
-<span class="source-line-no">1590</span><span id="line-1590">      return new RuntimeException(e);</span>
-<span class="source-line-no">1591</span><span id="line-1591">    }</span>
-<span class="source-line-no">1592</span><span id="line-1592"></span>
-<span class="source-line-no">1593</span><span id="line-1593">    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {</span>
-<span class="source-line-no">1594</span><span id="line-1594">      try {</span>
-<span class="source-line-no">1595</span><span id="line-1595">        return callable.call();</span>
-<span class="source-line-no">1596</span><span id="line-1596">      } catch (Exception e) {</span>
-<span class="source-line-no">1597</span><span id="line-1597">        throw runtime(e);</span>
+<span class="source-line-no">1521</span><span id="line-1521">    /*</span>
+<span class="source-line-no">1522</span><span id="line-1522">     * Generates Lexicographically ascending strings</span>
+<span class="source-line-no">1523</span><span id="line-1523">     */</span>
+<span class="source-line-no">1524</span><span id="line-1524">    protected byte[] getSplitKey(final int i) {</span>
+<span class="source-line-no">1525</span><span id="line-1525">      return Bytes.toBytes(String.format("%0" + keyLength + "d", i));</span>
+<span class="source-line-no">1526</span><span id="line-1526">    }</span>
+<span class="source-line-no">1527</span><span id="line-1527"></span>
+<span class="source-line-no">1528</span><span id="line-1528">  }</span>
+<span class="source-line-no">1529</span><span id="line-1529"></span>
+<span class="source-line-no">1530</span><span id="line-1530">  static abstract class AsyncTableTest extends AsyncTest {</span>
+<span class="source-line-no">1531</span><span id="line-1531">    protected AsyncTable&lt;?&gt; table;</span>
+<span class="source-line-no">1532</span><span id="line-1532"></span>
+<span class="source-line-no">1533</span><span id="line-1533">    AsyncTableTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1534</span><span id="line-1534">      super(con, options, status);</span>
+<span class="source-line-no">1535</span><span id="line-1535">    }</span>
+<span class="source-line-no">1536</span><span id="line-1536"></span>
+<span class="source-line-no">1537</span><span id="line-1537">    @Override</span>
+<span class="source-line-no">1538</span><span id="line-1538">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1539</span><span id="line-1539">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1540</span><span id="line-1540">    }</span>
+<span class="source-line-no">1541</span><span id="line-1541"></span>
+<span class="source-line-no">1542</span><span id="line-1542">    @Override</span>
+<span class="source-line-no">1543</span><span id="line-1543">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1544</span><span id="line-1544">    }</span>
+<span class="source-line-no">1545</span><span id="line-1545">  }</span>
+<span class="source-line-no">1546</span><span id="line-1546"></span>
+<span class="source-line-no">1547</span><span id="line-1547">  static class AsyncRandomReadTest extends AsyncTableTest {</span>
+<span class="source-line-no">1548</span><span id="line-1548">    private final Consistency consistency;</span>
+<span class="source-line-no">1549</span><span id="line-1549">    private ArrayList&lt;Get&gt; gets;</span>
+<span class="source-line-no">1550</span><span id="line-1550"></span>
+<span class="source-line-no">1551</span><span id="line-1551">    AsyncRandomReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1552</span><span id="line-1552">      super(con, options, status);</span>
+<span class="source-line-no">1553</span><span id="line-1553">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
+<span class="source-line-no">1554</span><span id="line-1554">      if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">1555</span><span id="line-1555">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
+<span class="source-line-no">1556</span><span id="line-1556">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
+<span class="source-line-no">1557</span><span id="line-1557">      }</span>
+<span class="source-line-no">1558</span><span id="line-1558">    }</span>
+<span class="source-line-no">1559</span><span id="line-1559"></span>
+<span class="source-line-no">1560</span><span id="line-1560">    @Override</span>
+<span class="source-line-no">1561</span><span id="line-1561">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1562</span><span id="line-1562">      if (opts.randomSleep &gt; 0) {</span>
+<span class="source-line-no">1563</span><span id="line-1563">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
+<span class="source-line-no">1564</span><span id="line-1564">      }</span>
+<span class="source-line-no">1565</span><span id="line-1565">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
+<span class="source-line-no">1566</span><span id="line-1566">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1567</span><span id="line-1567">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1568</span><span id="line-1568">        if (opts.addColumns) {</span>
+<span class="source-line-no">1569</span><span id="line-1569">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1570</span><span id="line-1570">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1571</span><span id="line-1571">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1572</span><span id="line-1572">          }</span>
+<span class="source-line-no">1573</span><span id="line-1573">        } else {</span>
+<span class="source-line-no">1574</span><span id="line-1574">          get.addFamily(familyName);</span>
+<span class="source-line-no">1575</span><span id="line-1575">        }</span>
+<span class="source-line-no">1576</span><span id="line-1576">      }</span>
+<span class="source-line-no">1577</span><span id="line-1577">      if (opts.filterAll) {</span>
+<span class="source-line-no">1578</span><span id="line-1578">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1579</span><span id="line-1579">      }</span>
+<span class="source-line-no">1580</span><span id="line-1580">      get.setConsistency(consistency);</span>
+<span class="source-line-no">1581</span><span id="line-1581">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
+<span class="source-line-no">1582</span><span id="line-1582">      try {</span>
+<span class="source-line-no">1583</span><span id="line-1583">        if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">1584</span><span id="line-1584">          this.gets.add(get);</span>
+<span class="source-line-no">1585</span><span id="line-1585">          if (this.gets.size() == opts.multiGet) {</span>
+<span class="source-line-no">1586</span><span id="line-1586">            Result[] rs =</span>
+<span class="source-line-no">1587</span><span id="line-1587">              this.table.get(this.gets).stream().map(f -&gt; propagate(f::get)).toArray(Result[]::new);</span>
+<span class="source-line-no">1588</span><span id="line-1588">            updateValueSize(rs);</span>
+<span class="source-line-no">1589</span><span id="line-1589">            this.gets.clear();</span>
+<span class="source-line-no">1590</span><span id="line-1590">          } else {</span>
+<span class="source-line-no">1591</span><span id="line-1591">            return false;</span>
+<span class="source-line-no">1592</span><span id="line-1592">          }</span>
+<span class="source-line-no">1593</span><span id="line-1593">        } else {</span>
+<span class="source-line-no">1594</span><span id="line-1594">          updateValueSize(this.table.get(get).get());</span>
+<span class="source-line-no">1595</span><span id="line-1595">        }</span>
+<span class="source-line-no">1596</span><span id="line-1596">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">1597</span><span id="line-1597">        throw new IOException(e);</span>
 <span class="source-line-no">1598</span><span id="line-1598">      }</span>
-<span class="source-line-no">1599</span><span id="line-1599">    }</span>
-<span class="source-line-no">1600</span><span id="line-1600"></span>
-<span class="source-line-no">1601</span><span id="line-1601">    @Override</span>
-<span class="source-line-no">1602</span><span id="line-1602">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1603</span><span id="line-1603">      int period = opts.perClientRunRows / 10;</span>
-<span class="source-line-no">1604</span><span id="line-1604">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">1605</span><span id="line-1605">    }</span>
-<span class="source-line-no">1606</span><span id="line-1606"></span>
-<span class="source-line-no">1607</span><span id="line-1607">    @Override</span>
-<span class="source-line-no">1608</span><span id="line-1608">    protected void testTakedown() throws IOException {</span>
-<span class="source-line-no">1609</span><span id="line-1609">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
-<span class="source-line-no">1610</span><span id="line-1610">        this.table.get(gets);</span>
-<span class="source-line-no">1611</span><span id="line-1611">        this.gets.clear();</span>
-<span class="source-line-no">1612</span><span id="line-1612">      }</span>
-<span class="source-line-no">1613</span><span id="line-1613">      super.testTakedown();</span>
-<span class="source-line-no">1614</span><span id="line-1614">    }</span>
-<span class="source-line-no">1615</span><span id="line-1615">  }</span>
+<span class="source-line-no">1599</span><span id="line-1599">      return true;</span>
+<span class="source-line-no">1600</span><span id="line-1600">    }</span>
+<span class="source-line-no">1601</span><span id="line-1601"></span>
+<span class="source-line-no">1602</span><span id="line-1602">    public static RuntimeException runtime(Throwable e) {</span>
+<span class="source-line-no">1603</span><span id="line-1603">      if (e instanceof RuntimeException) {</span>
+<span class="source-line-no">1604</span><span id="line-1604">        return (RuntimeException) e;</span>
+<span class="source-line-no">1605</span><span id="line-1605">      }</span>
+<span class="source-line-no">1606</span><span id="line-1606">      return new RuntimeException(e);</span>
+<span class="source-line-no">1607</span><span id="line-1607">    }</span>
+<span class="source-line-no">1608</span><span id="line-1608"></span>
+<span class="source-line-no">1609</span><span id="line-1609">    public static &lt;V&gt; V propagate(Callable&lt;V&gt; callable) {</span>
+<span class="source-line-no">1610</span><span id="line-1610">      try {</span>
+<span class="source-line-no">1611</span><span id="line-1611">        return callable.call();</span>
+<span class="source-line-no">1612</span><span id="line-1612">      } catch (Exception e) {</span>
+<span class="source-line-no">1613</span><span id="line-1613">        throw runtime(e);</span>
+<span class="source-line-no">1614</span><span id="line-1614">      }</span>
+<span class="source-line-no">1615</span><span id="line-1615">    }</span>
 <span class="source-line-no">1616</span><span id="line-1616"></span>
-<span class="source-line-no">1617</span><span id="line-1617">  static class AsyncRandomWriteTest extends AsyncSequentialWriteTest {</span>
-<span class="source-line-no">1618</span><span id="line-1618"></span>
-<span class="source-line-no">1619</span><span id="line-1619">    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1620</span><span id="line-1620">      super(con, options, status);</span>
+<span class="source-line-no">1617</span><span id="line-1617">    @Override</span>
+<span class="source-line-no">1618</span><span id="line-1618">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1619</span><span id="line-1619">      int period = opts.perClientRunRows / 10;</span>
+<span class="source-line-no">1620</span><span id="line-1620">      return period == 0 ? opts.perClientRunRows : period;</span>
 <span class="source-line-no">1621</span><span id="line-1621">    }</span>
 <span class="source-line-no">1622</span><span id="line-1622"></span>
 <span class="source-line-no">1623</span><span id="line-1623">    @Override</span>
-<span class="source-line-no">1624</span><span id="line-1624">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">1625</span><span id="line-1625">      return getRandomRow(this.rand, opts.totalRows);</span>
-<span class="source-line-no">1626</span><span id="line-1626">    }</span>
-<span class="source-line-no">1627</span><span id="line-1627">  }</span>
-<span class="source-line-no">1628</span><span id="line-1628"></span>
-<span class="source-line-no">1629</span><span id="line-1629">  static class AsyncScanTest extends AsyncTableTest {</span>
-<span class="source-line-no">1630</span><span id="line-1630">    private ResultScanner testScanner;</span>
-<span class="source-line-no">1631</span><span id="line-1631">    private AsyncTable&lt;?&gt; asyncTable;</span>
+<span class="source-line-no">1624</span><span id="line-1624">    protected void testTakedown() throws IOException {</span>
+<span class="source-line-no">1625</span><span id="line-1625">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
+<span class="source-line-no">1626</span><span id="line-1626">        this.table.get(gets);</span>
+<span class="source-line-no">1627</span><span id="line-1627">        this.gets.clear();</span>
+<span class="source-line-no">1628</span><span id="line-1628">      }</span>
+<span class="source-line-no">1629</span><span id="line-1629">      super.testTakedown();</span>
+<span class="source-line-no">1630</span><span id="line-1630">    }</span>
+<span class="source-line-no">1631</span><span id="line-1631">  }</span>
 <span class="source-line-no">1632</span><span id="line-1632"></span>
-<span class="source-line-no">1633</span><span id="line-1633">    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1634</span><span id="line-1634">      super(con, options, status);</span>
-<span class="source-line-no">1635</span><span id="line-1635">    }</span>
-<span class="source-line-no">1636</span><span id="line-1636"></span>
-<span class="source-line-no">1637</span><span id="line-1637">    @Override</span>
-<span class="source-line-no">1638</span><span id="line-1638">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1639</span><span id="line-1639">      this.asyncTable = connection.getTable(TableName.valueOf(opts.tableName),</span>
-<span class="source-line-no">1640</span><span id="line-1640">        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));</span>
-<span class="source-line-no">1641</span><span id="line-1641">    }</span>
-<span class="source-line-no">1642</span><span id="line-1642"></span>
-<span class="source-line-no">1643</span><span id="line-1643">    @Override</span>
-<span class="source-line-no">1644</span><span id="line-1644">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">1645</span><span id="line-1645">      if (this.testScanner != null) {</span>
-<span class="source-line-no">1646</span><span id="line-1646">        updateScanMetrics(this.testScanner.getScanMetrics());</span>
-<span class="source-line-no">1647</span><span id="line-1647">        this.testScanner.close();</span>
-<span class="source-line-no">1648</span><span id="line-1648">      }</span>
-<span class="source-line-no">1649</span><span id="line-1649">      super.testTakedown();</span>
-<span class="source-line-no">1650</span><span id="line-1650">    }</span>
-<span class="source-line-no">1651</span><span id="line-1651"></span>
-<span class="source-line-no">1652</span><span id="line-1652">    @Override</span>
-<span class="source-line-no">1653</span><span id="line-1653">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">1654</span><span id="line-1654">      if (this.testScanner == null) {</span>
-<span class="source-line-no">1655</span><span id="line-1655">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
-<span class="source-line-no">1656</span><span id="line-1656">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">1657</span><span id="line-1657">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">1658</span><span id="line-1658">        for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1659</span><span id="line-1659">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1660</span><span id="line-1660">          if (opts.addColumns) {</span>
-<span class="source-line-no">1661</span><span id="line-1661">            for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1662</span><span id="line-1662">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1663</span><span id="line-1663">              scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1664</span><span id="line-1664">            }</span>
-<span class="source-line-no">1665</span><span id="line-1665">          } else {</span>
-<span class="source-line-no">1666</span><span id="line-1666">            scan.addFamily(familyName);</span>
-<span class="source-line-no">1667</span><span id="line-1667">          }</span>
-<span class="source-line-no">1668</span><span id="line-1668">        }</span>
-<span class="source-line-no">1669</span><span id="line-1669">        if (opts.filterAll) {</span>
-<span class="source-line-no">1670</span><span id="line-1670">          scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1671</span><span id="line-1671">        }</span>
-<span class="source-line-no">1672</span><span id="line-1672">        this.testScanner = asyncTable.getScanner(scan);</span>
-<span class="source-line-no">1673</span><span id="line-1673">      }</span>
-<span class="source-line-no">1674</span><span id="line-1674">      Result r = testScanner.next();</span>
-<span class="source-line-no">1675</span><span id="line-1675">      updateValueSize(r);</span>
-<span class="source-line-no">1676</span><span id="line-1676">      return true;</span>
-<span class="source-line-no">1677</span><span id="line-1677">    }</span>
-<span class="source-line-no">1678</span><span id="line-1678">  }</span>
-<span class="source-line-no">1679</span><span id="line-1679"></span>
-<span class="source-line-no">1680</span><span id="line-1680">  static class AsyncSequentialReadTest extends AsyncTableTest {</span>
-<span class="source-line-no">1681</span><span id="line-1681">    AsyncSequentialReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1682</span><span id="line-1682">      super(con, options, status);</span>
-<span class="source-line-no">1683</span><span id="line-1683">    }</span>
-<span class="source-line-no">1684</span><span id="line-1684"></span>
-<span class="source-line-no">1685</span><span id="line-1685">    @Override</span>
-<span class="source-line-no">1686</span><span id="line-1686">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1687</span><span id="line-1687">      Get get = new Get(format(i));</span>
-<span class="source-line-no">1688</span><span id="line-1688">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1689</span><span id="line-1689">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1690</span><span id="line-1690">        if (opts.addColumns) {</span>
-<span class="source-line-no">1691</span><span id="line-1691">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1692</span><span id="line-1692">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1693</span><span id="line-1693">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1694</span><span id="line-1694">          }</span>
-<span class="source-line-no">1695</span><span id="line-1695">        } else {</span>
-<span class="source-line-no">1696</span><span id="line-1696">          get.addFamily(familyName);</span>
-<span class="source-line-no">1697</span><span id="line-1697">        }</span>
-<span class="source-line-no">1698</span><span id="line-1698">      }</span>
-<span class="source-line-no">1699</span><span id="line-1699">      if (opts.filterAll) {</span>
-<span class="source-line-no">1700</span><span id="line-1700">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1701</span><span id="line-1701">      }</span>
-<span class="source-line-no">1702</span><span id="line-1702">      try {</span>
-<span class="source-line-no">1703</span><span id="line-1703">        updateValueSize(table.get(get).get());</span>
-<span class="source-line-no">1704</span><span id="line-1704">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">1705</span><span id="line-1705">        throw new IOException(e);</span>
-<span class="source-line-no">1706</span><span id="line-1706">      }</span>
-<span class="source-line-no">1707</span><span id="line-1707">      return true;</span>
-<span class="source-line-no">1708</span><span id="line-1708">    }</span>
-<span class="source-line-no">1709</span><span id="line-1709">  }</span>
-<span class="source-line-no">1710</span><span id="line-1710"></span>
-<span class="source-line-no">1711</span><span id="line-1711">  static class AsyncSequentialWriteTest extends AsyncTableTest {</span>
-<span class="source-line-no">1712</span><span id="line-1712">    private ArrayList&lt;Put&gt; puts;</span>
-<span class="source-line-no">1713</span><span id="line-1713"></span>
-<span class="source-line-no">1714</span><span id="line-1714">    AsyncSequentialWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1715</span><span id="line-1715">      super(con, options, status);</span>
-<span class="source-line-no">1716</span><span id="line-1716">      if (opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">1717</span><span id="line-1717">        LOG.info("MultiPut enabled. Sending PUTs in batches of " + opts.multiPut + ".");</span>
-<span class="source-line-no">1718</span><span id="line-1718">        this.puts = new ArrayList&lt;&gt;(opts.multiPut);</span>
-<span class="source-line-no">1719</span><span id="line-1719">      }</span>
-<span class="source-line-no">1720</span><span id="line-1720">    }</span>
-<span class="source-line-no">1721</span><span id="line-1721"></span>
-<span class="source-line-no">1722</span><span id="line-1722">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">1723</span><span id="line-1723">      return format(i);</span>
+<span class="source-line-no">1633</span><span id="line-1633">  static class AsyncRandomWriteTest extends AsyncSequentialWriteTest {</span>
+<span class="source-line-no">1634</span><span id="line-1634"></span>
+<span class="source-line-no">1635</span><span id="line-1635">    AsyncRandomWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1636</span><span id="line-1636">      super(con, options, status);</span>
+<span class="source-line-no">1637</span><span id="line-1637">    }</span>
+<span class="source-line-no">1638</span><span id="line-1638"></span>
+<span class="source-line-no">1639</span><span id="line-1639">    @Override</span>
+<span class="source-line-no">1640</span><span id="line-1640">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">1641</span><span id="line-1641">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">1642</span><span id="line-1642">    }</span>
+<span class="source-line-no">1643</span><span id="line-1643">  }</span>
+<span class="source-line-no">1644</span><span id="line-1644"></span>
+<span class="source-line-no">1645</span><span id="line-1645">  static class AsyncScanTest extends AsyncTableTest {</span>
+<span class="source-line-no">1646</span><span id="line-1646">    private ResultScanner testScanner;</span>
+<span class="source-line-no">1647</span><span id="line-1647">    private AsyncTable&lt;?&gt; asyncTable;</span>
+<span class="source-line-no">1648</span><span id="line-1648"></span>
+<span class="source-line-no">1649</span><span id="line-1649">    AsyncScanTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1650</span><span id="line-1650">      super(con, options, status);</span>
+<span class="source-line-no">1651</span><span id="line-1651">    }</span>
+<span class="source-line-no">1652</span><span id="line-1652"></span>
+<span class="source-line-no">1653</span><span id="line-1653">    @Override</span>
+<span class="source-line-no">1654</span><span id="line-1654">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1655</span><span id="line-1655">      this.asyncTable = connection.getTable(TableName.valueOf(opts.tableName),</span>
+<span class="source-line-no">1656</span><span id="line-1656">        Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()));</span>
+<span class="source-line-no">1657</span><span id="line-1657">    }</span>
+<span class="source-line-no">1658</span><span id="line-1658"></span>
+<span class="source-line-no">1659</span><span id="line-1659">    @Override</span>
+<span class="source-line-no">1660</span><span id="line-1660">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">1661</span><span id="line-1661">      if (this.testScanner != null) {</span>
+<span class="source-line-no">1662</span><span id="line-1662">        updateScanMetrics(this.testScanner.getScanMetrics());</span>
+<span class="source-line-no">1663</span><span id="line-1663">        this.testScanner.close();</span>
+<span class="source-line-no">1664</span><span id="line-1664">      }</span>
+<span class="source-line-no">1665</span><span id="line-1665">      super.testTakedown();</span>
+<span class="source-line-no">1666</span><span id="line-1666">    }</span>
+<span class="source-line-no">1667</span><span id="line-1667"></span>
+<span class="source-line-no">1668</span><span id="line-1668">    @Override</span>
+<span class="source-line-no">1669</span><span id="line-1669">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">1670</span><span id="line-1670">      if (this.testScanner == null) {</span>
+<span class="source-line-no">1671</span><span id="line-1671">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
+<span class="source-line-no">1672</span><span id="line-1672">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">1673</span><span id="line-1673">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">1674</span><span id="line-1674">        for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1675</span><span id="line-1675">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1676</span><span id="line-1676">          if (opts.addColumns) {</span>
+<span class="source-line-no">1677</span><span id="line-1677">            for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1678</span><span id="line-1678">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1679</span><span id="line-1679">              scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1680</span><span id="line-1680">            }</span>
+<span class="source-line-no">1681</span><span id="line-1681">          } else {</span>
+<span class="source-line-no">1682</span><span id="line-1682">            scan.addFamily(familyName);</span>
+<span class="source-line-no">1683</span><span id="line-1683">          }</span>
+<span class="source-line-no">1684</span><span id="line-1684">        }</span>
+<span class="source-line-no">1685</span><span id="line-1685">        if (opts.filterAll) {</span>
+<span class="source-line-no">1686</span><span id="line-1686">          scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1687</span><span id="line-1687">        }</span>
+<span class="source-line-no">1688</span><span id="line-1688">        this.testScanner = asyncTable.getScanner(scan);</span>
+<span class="source-line-no">1689</span><span id="line-1689">      }</span>
+<span class="source-line-no">1690</span><span id="line-1690">      Result r = testScanner.next();</span>
+<span class="source-line-no">1691</span><span id="line-1691">      updateValueSize(r);</span>
+<span class="source-line-no">1692</span><span id="line-1692">      return true;</span>
+<span class="source-line-no">1693</span><span id="line-1693">    }</span>
+<span class="source-line-no">1694</span><span id="line-1694">  }</span>
+<span class="source-line-no">1695</span><span id="line-1695"></span>
+<span class="source-line-no">1696</span><span id="line-1696">  static class AsyncSequentialReadTest extends AsyncTableTest {</span>
+<span class="source-line-no">1697</span><span id="line-1697">    AsyncSequentialReadTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1698</span><span id="line-1698">      super(con, options, status);</span>
+<span class="source-line-no">1699</span><span id="line-1699">    }</span>
+<span class="source-line-no">1700</span><span id="line-1700"></span>
+<span class="source-line-no">1701</span><span id="line-1701">    @Override</span>
+<span class="source-line-no">1702</span><span id="line-1702">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1703</span><span id="line-1703">      Get get = new Get(format(i));</span>
+<span class="source-line-no">1704</span><span id="line-1704">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1705</span><span id="line-1705">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1706</span><span id="line-1706">        if (opts.addColumns) {</span>
+<span class="source-line-no">1707</span><span id="line-1707">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1708</span><span id="line-1708">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1709</span><span id="line-1709">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1710</span><span id="line-1710">          }</span>
+<span class="source-line-no">1711</span><span id="line-1711">        } else {</span>
+<span class="source-line-no">1712</span><span id="line-1712">          get.addFamily(familyName);</span>
+<span class="source-line-no">1713</span><span id="line-1713">        }</span>
+<span class="source-line-no">1714</span><span id="line-1714">      }</span>
+<span class="source-line-no">1715</span><span id="line-1715">      if (opts.filterAll) {</span>
+<span class="source-line-no">1716</span><span id="line-1716">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1717</span><span id="line-1717">      }</span>
+<span class="source-line-no">1718</span><span id="line-1718">      try {</span>
+<span class="source-line-no">1719</span><span id="line-1719">        updateValueSize(table.get(get).get());</span>
+<span class="source-line-no">1720</span><span id="line-1720">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">1721</span><span id="line-1721">        throw new IOException(e);</span>
+<span class="source-line-no">1722</span><span id="line-1722">      }</span>
+<span class="source-line-no">1723</span><span id="line-1723">      return true;</span>
 <span class="source-line-no">1724</span><span id="line-1724">    }</span>
-<span class="source-line-no">1725</span><span id="line-1725"></span>
-<span class="source-line-no">1726</span><span id="line-1726">    @Override</span>
-<span class="source-line-no">1727</span><span id="line-1727">    @SuppressWarnings("ReturnValueIgnored")</span>
-<span class="source-line-no">1728</span><span id="line-1728">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1729</span><span id="line-1729">      byte[] row = generateRow(i);</span>
-<span class="source-line-no">1730</span><span id="line-1730">      Put put = new Put(row);</span>
-<span class="source-line-no">1731</span><span id="line-1731">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1732</span><span id="line-1732">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1733</span><span id="line-1733">        for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1734</span><span id="line-1734">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1735</span><span id="line-1735">          byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
-<span class="source-line-no">1736</span><span id="line-1736">          if (opts.useTags) {</span>
-<span class="source-line-no">1737</span><span id="line-1737">            byte[] tag = generateData(this.rand, TAG_LENGTH);</span>
-<span class="source-line-no">1738</span><span id="line-1738">            Tag[] tags = new Tag[opts.noOfTags];</span>
-<span class="source-line-no">1739</span><span id="line-1739">            for (int n = 0; n &lt; opts.noOfTags; n++) {</span>
-<span class="source-line-no">1740</span><span id="line-1740">              Tag t = new ArrayBackedTag((byte) n, tag);</span>
-<span class="source-line-no">1741</span><span id="line-1741">              tags[n] = t;</span>
-<span class="source-line-no">1742</span><span id="line-1742">            }</span>
-<span class="source-line-no">1743</span><span id="line-1743">            KeyValue kv =</span>
-<span class="source-line-no">1744</span><span id="line-1744">              new KeyValue(row, familyName, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);</span>
-<span class="source-line-no">1745</span><span id="line-1745">            put.add(kv);</span>
-<span class="source-line-no">1746</span><span id="line-1746">            updateValueSize(kv.getValueLength());</span>
-<span class="source-line-no">1747</span><span id="line-1747">          } else {</span>
-<span class="source-line-no">1748</span><span id="line-1748">            put.addColumn(familyName, qualifier, value);</span>
-<span class="source-line-no">1749</span><span id="line-1749">            updateValueSize(value.length);</span>
-<span class="source-line-no">1750</span><span id="line-1750">          }</span>
-<span class="source-line-no">1751</span><span id="line-1751">        }</span>
-<span class="source-line-no">1752</span><span id="line-1752">      }</span>
-<span class="source-line-no">1753</span><span id="line-1753">      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
-<span class="source-line-no">1754</span><span id="line-1754">      try {</span>
-<span class="source-line-no">1755</span><span id="line-1755">        table.put(put).get();</span>
-<span class="source-line-no">1756</span><span id="line-1756">        if (opts.multiPut &gt; 0) {</span>
-<span class="source-line-no">1757</span><span id="line-1757">          this.puts.add(put);</span>
-<span class="source-line-no">1758</span><span id="line-1758">          if (this.puts.size() == opts.multiPut) {</span>
-<span class="source-line-no">1759</span><span id="line-1759">            this.table.put(puts).stream().map(f -&gt; AsyncRandomReadTest.propagate(f::get));</span>
-<span class="source-line-no">1760</span><span id="line-1760">            this.puts.clear();</span>
-<span class="source-line-no">1761</span><span id="line-1761">          } else {</span>
-<span class="source-line-no">1762</span><span id="line-1762">            return false;</span>
-<span class="source-line-no">1763</span><span id="line-1763">          }</span>
-<span class="source-line-no">1764</span><span id="line-1764">        } else {</span>
-<span class="source-line-no">1765</span><span id="line-1765">          table.put(put).get();</span>
-<span class="source-line-no">1766</span><span id="line-1766">        }</span>
-<span class="source-line-no">1767</span><span id="line-1767">      } catch (ExecutionException e) {</span>
-<span class="source-line-no">1768</span><span id="line-1768">        throw new IOException(e);</span>
-<span class="source-line-no">1769</span><span id="line-1769">      }</span>
-<span class="source-line-no">1770</span><span id="line-1770">      return true;</span>
-<span class="source-line-no">1771</span><span id="line-1771">    }</span>
-<span class="source-line-no">1772</span><span id="line-1772">  }</span>
-<span class="source-line-no">1773</span><span id="line-1773"></span>
-<span class="source-line-no">1774</span><span id="line-1774">  static abstract class BufferedMutatorTest extends Test {</span>
-<span class="source-line-no">1775</span><span id="line-1775">    protected BufferedMutator mutator;</span>
-<span class="source-line-no">1776</span><span id="line-1776">    protected Table table;</span>
-<span class="source-line-no">1777</span><span id="line-1777"></span>
-<span class="source-line-no">1778</span><span id="line-1778">    BufferedMutatorTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1779</span><span id="line-1779">      super(con, options, status);</span>
-<span class="source-line-no">1780</span><span id="line-1780">    }</span>
-<span class="source-line-no">1781</span><span id="line-1781"></span>
-<span class="source-line-no">1782</span><span id="line-1782">    @Override</span>
-<span class="source-line-no">1783</span><span id="line-1783">    void onStartup() throws IOException {</span>
-<span class="source-line-no">1784</span><span id="line-1784">      BufferedMutatorParams p = new BufferedMutatorParams(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1785</span><span id="line-1785">      p.writeBufferSize(opts.bufferSize);</span>
-<span class="source-line-no">1786</span><span id="line-1786">      this.mutator = connection.getBufferedMutator(p);</span>
-<span class="source-line-no">1787</span><span id="line-1787">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
-<span class="source-line-no">1788</span><span id="line-1788">    }</span>
+<span class="source-line-no">1725</span><span id="line-1725">  }</span>
+<span class="source-line-no">1726</span><span id="line-1726"></span>
+<span class="source-line-no">1727</span><span id="line-1727">  static class AsyncSequentialWriteTest extends AsyncTableTest {</span>
+<span class="source-line-no">1728</span><span id="line-1728">    private ArrayList&lt;Put&gt; puts;</span>
+<span class="source-line-no">1729</span><span id="line-1729"></span>
+<span class="source-line-no">1730</span><span id="line-1730">    AsyncSequentialWriteTest(AsyncConnection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1731</span><span id="line-1731">      super(con, options, status);</span>
+<span class="source-line-no">1732</span><span id="line-1732">      if (opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">1733</span><span id="line-1733">        LOG.info("MultiPut enabled. Sending PUTs in batches of " + opts.multiPut + ".");</span>
+<span class="source-line-no">1734</span><span id="line-1734">        this.puts = new ArrayList&lt;&gt;(opts.multiPut);</span>
+<span class="source-line-no">1735</span><span id="line-1735">      }</span>
+<span class="source-line-no">1736</span><span id="line-1736">    }</span>
+<span class="source-line-no">1737</span><span id="line-1737"></span>
+<span class="source-line-no">1738</span><span id="line-1738">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">1739</span><span id="line-1739">      return format(i);</span>
+<span class="source-line-no">1740</span><span id="line-1740">    }</span>
+<span class="source-line-no">1741</span><span id="line-1741"></span>
+<span class="source-line-no">1742</span><span id="line-1742">    @Override</span>
+<span class="source-line-no">1743</span><span id="line-1743">    @SuppressWarnings("ReturnValueIgnored")</span>
+<span class="source-line-no">1744</span><span id="line-1744">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1745</span><span id="line-1745">      byte[] row = generateRow(i);</span>
+<span class="source-line-no">1746</span><span id="line-1746">      Put put = new Put(row);</span>
+<span class="source-line-no">1747</span><span id="line-1747">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1748</span><span id="line-1748">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1749</span><span id="line-1749">        for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1750</span><span id="line-1750">          byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1751</span><span id="line-1751">          byte[] value = generateData(this.rand, getValueLength(this.rand));</span>
+<span class="source-line-no">1752</span><span id="line-1752">          if (opts.useTags) {</span>
+<span class="source-line-no">1753</span><span id="line-1753">            byte[] tag = generateData(this.rand, TAG_LENGTH);</span>
+<span class="source-line-no">1754</span><span id="line-1754">            Tag[] tags = new Tag[opts.noOfTags];</span>
+<span class="source-line-no">1755</span><span id="line-1755">            for (int n = 0; n &lt; opts.noOfTags; n++) {</span>
+<span class="source-line-no">1756</span><span id="line-1756">              Tag t = new ArrayBackedTag((byte) n, tag);</span>
+<span class="source-line-no">1757</span><span id="line-1757">              tags[n] = t;</span>
+<span class="source-line-no">1758</span><span id="line-1758">            }</span>
+<span class="source-line-no">1759</span><span id="line-1759">            KeyValue kv =</span>
+<span class="source-line-no">1760</span><span id="line-1760">              new KeyValue(row, familyName, qualifier, HConstants.LATEST_TIMESTAMP, value, tags);</span>
+<span class="source-line-no">1761</span><span id="line-1761">            put.add(kv);</span>
+<span class="source-line-no">1762</span><span id="line-1762">            updateValueSize(kv.getValueLength());</span>
+<span class="source-line-no">1763</span><span id="line-1763">          } else {</span>
+<span class="source-line-no">1764</span><span id="line-1764">            put.addColumn(familyName, qualifier, value);</span>
+<span class="source-line-no">1765</span><span id="line-1765">            updateValueSize(value.length);</span>
+<span class="source-line-no">1766</span><span id="line-1766">          }</span>
+<span class="source-line-no">1767</span><span id="line-1767">        }</span>
+<span class="source-line-no">1768</span><span id="line-1768">      }</span>
+<span class="source-line-no">1769</span><span id="line-1769">      put.setDurability(opts.writeToWAL ? Durability.SYNC_WAL : Durability.SKIP_WAL);</span>
+<span class="source-line-no">1770</span><span id="line-1770">      try {</span>
+<span class="source-line-no">1771</span><span id="line-1771">        table.put(put).get();</span>
+<span class="source-line-no">1772</span><span id="line-1772">        if (opts.multiPut &gt; 0) {</span>
+<span class="source-line-no">1773</span><span id="line-1773">          this.puts.add(put);</span>
+<span class="source-line-no">1774</span><span id="line-1774">          if (this.puts.size() == opts.multiPut) {</span>
+<span class="source-line-no">1775</span><span id="line-1775">            this.table.put(puts).stream().map(f -&gt; AsyncRandomReadTest.propagate(f::get));</span>
+<span class="source-line-no">1776</span><span id="line-1776">            this.puts.clear();</span>
+<span class="source-line-no">1777</span><span id="line-1777">          } else {</span>
+<span class="source-line-no">1778</span><span id="line-1778">            return false;</span>
+<span class="source-line-no">1779</span><span id="line-1779">          }</span>
+<span class="source-line-no">1780</span><span id="line-1780">        } else {</span>
+<span class="source-line-no">1781</span><span id="line-1781">          table.put(put).get();</span>
+<span class="source-line-no">1782</span><span id="line-1782">        }</span>
+<span class="source-line-no">1783</span><span id="line-1783">      } catch (ExecutionException e) {</span>
+<span class="source-line-no">1784</span><span id="line-1784">        throw new IOException(e);</span>
+<span class="source-line-no">1785</span><span id="line-1785">      }</span>
+<span class="source-line-no">1786</span><span id="line-1786">      return true;</span>
+<span class="source-line-no">1787</span><span id="line-1787">    }</span>
+<span class="source-line-no">1788</span><span id="line-1788">  }</span>
 <span class="source-line-no">1789</span><span id="line-1789"></span>
-<span class="source-line-no">1790</span><span id="line-1790">    @Override</span>
-<span class="source-line-no">1791</span><span id="line-1791">    void onTakedown() throws IOException {</span>
-<span class="source-line-no">1792</span><span id="line-1792">      mutator.close();</span>
-<span class="source-line-no">1793</span><span id="line-1793">      table.close();</span>
-<span class="source-line-no">1794</span><span id="line-1794">    }</span>
-<span class="source-line-no">1795</span><span id="line-1795">  }</span>
-<span class="source-line-no">1796</span><span id="line-1796"></span>
-<span class="source-line-no">1797</span><span id="line-1797">  static class RandomSeekScanTest extends TableTest {</span>
-<span class="source-line-no">1798</span><span id="line-1798">    RandomSeekScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1799</span><span id="line-1799">      super(con, options, status);</span>
-<span class="source-line-no">1800</span><span id="line-1800">    }</span>
-<span class="source-line-no">1801</span><span id="line-1801"></span>
-<span class="source-line-no">1802</span><span id="line-1802">    @Override</span>
-<span class="source-line-no">1803</span><span id="line-1803">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">1804</span><span id="line-1804">      Scan scan =</span>
-<span class="source-line-no">1805</span><span id="line-1805">        new Scan().withStartRow(getRandomRow(this.rand, opts.totalRows)).setCaching(opts.caching)</span>
-<span class="source-line-no">1806</span><span id="line-1806">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">1807</span><span id="line-1807">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">1808</span><span id="line-1808">      FilterList list = new FilterList();</span>
-<span class="source-line-no">1809</span><span id="line-1809">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1810</span><span id="line-1810">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1811</span><span id="line-1811">        if (opts.addColumns) {</span>
-<span class="source-line-no">1812</span><span id="line-1812">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1813</span><span id="line-1813">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1814</span><span id="line-1814">            scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1815</span><span id="line-1815">          }</span>
-<span class="source-line-no">1816</span><span id="line-1816">        } else {</span>
-<span class="source-line-no">1817</span><span id="line-1817">          scan.addFamily(familyName);</span>
-<span class="source-line-no">1818</span><span id="line-1818">        }</span>
-<span class="source-line-no">1819</span><span id="line-1819">      }</span>
-<span class="source-line-no">1820</span><span id="line-1820">      if (opts.filterAll) {</span>
-<span class="source-line-no">1821</span><span id="line-1821">        list.addFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1822</span><span id="line-1822">      }</span>
-<span class="source-line-no">1823</span><span id="line-1823">      list.addFilter(new WhileMatchFilter(new PageFilter(120)));</span>
-<span class="source-line-no">1824</span><span id="line-1824">      scan.setFilter(list);</span>
-<span class="source-line-no">1825</span><span id="line-1825">      ResultScanner s = this.table.getScanner(scan);</span>
-<span class="source-line-no">1826</span><span id="line-1826">      try {</span>
-<span class="source-line-no">1827</span><span id="line-1827">        for (Result rr; (rr = s.next()) != null;) {</span>
-<span class="source-line-no">1828</span><span id="line-1828">          updateValueSize(rr);</span>
-<span class="source-line-no">1829</span><span id="line-1829">        }</span>
-<span class="source-line-no">1830</span><span id="line-1830">      } finally {</span>
-<span class="source-line-no">1831</span><span id="line-1831">        updateScanMetrics(s.getScanMetrics());</span>
-<span class="source-line-no">1832</span><span id="line-1832">        s.close();</span>
-<span class="source-line-no">1833</span><span id="line-1833">      }</span>
-<span class="source-line-no">1834</span><span id="line-1834">      return true;</span>
-<span class="source-line-no">1835</span><span id="line-1835">    }</span>
-<span class="source-line-no">1836</span><span id="line-1836"></span>
-<span class="source-line-no">1837</span><span id="line-1837">    @Override</span>
-<span class="source-line-no">1838</span><span id="line-1838">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1839</span><span id="line-1839">      int period = opts.perClientRunRows / 100;</span>
-<span class="source-line-no">1840</span><span id="line-1840">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">1841</span><span id="line-1841">    }</span>
-<span class="source-line-no">1842</span><span id="line-1842"></span>
-<span class="source-line-no">1843</span><span id="line-1843">  }</span>
-<span class="source-line-no">1844</span><span id="line-1844"></span>
-<span class="source-line-no">1845</span><span id="line-1845">  static abstract class RandomScanWithRangeTest extends TableTest {</span>
-<span class="source-line-no">1846</span><span id="line-1846">    RandomScanWithRangeTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1847</span><span id="line-1847">      super(con, options, status);</span>
-<span class="source-line-no">1848</span><span id="line-1848">    }</span>
-<span class="source-line-no">1849</span><span id="line-1849"></span>
-<span class="source-line-no">1850</span><span id="line-1850">    @Override</span>
-<span class="source-line-no">1851</span><span id="line-1851">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">1852</span><span id="line-1852">      Pair&lt;byte[], byte[]&gt; startAndStopRow = getStartAndStopRow();</span>
-<span class="source-line-no">1853</span><span id="line-1853">      Scan scan = new Scan().withStartRow(startAndStopRow.getFirst())</span>
-<span class="source-line-no">1854</span><span id="line-1854">        .withStopRow(startAndStopRow.getSecond()).setCaching(opts.caching)</span>
-<span class="source-line-no">1855</span><span id="line-1855">        .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">1856</span><span id="line-1856">        .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">1857</span><span id="line-1857">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1858</span><span id="line-1858">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1859</span><span id="line-1859">        if (opts.addColumns) {</span>
-<span class="source-line-no">1860</span><span id="line-1860">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1861</span><span id="line-1861">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1862</span><span id="line-1862">            scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1863</span><span id="line-1863">          }</span>
-<span class="source-line-no">1864</span><span id="line-1864">        } else {</span>
-<span class="source-line-no">1865</span><span id="line-1865">          scan.addFamily(familyName);</span>
-<span class="source-line-no">1866</span><span id="line-1866">        }</span>
-<span class="source-line-no">1867</span><span id="line-1867">      }</span>
-<span class="source-line-no">1868</span><span id="line-1868">      if (opts.filterAll) {</span>
-<span class="source-line-no">1869</span><span id="line-1869">        scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1870</span><span id="line-1870">      }</span>
-<span class="source-line-no">1871</span><span id="line-1871">      Result r = null;</span>
-<span class="source-line-no">1872</span><span id="line-1872">      int count = 0;</span>
-<span class="source-line-no">1873</span><span id="line-1873">      ResultScanner s = this.table.getScanner(scan);</span>
-<span class="source-line-no">1874</span><span id="line-1874">      try {</span>
-<span class="source-line-no">1875</span><span id="line-1875">        for (; (r = s.next()) != null;) {</span>
-<span class="source-line-no">1876</span><span id="line-1876">          updateValueSize(r);</span>
-<span class="source-line-no">1877</span><span id="line-1877">          count++;</span>
-<span class="source-line-no">1878</span><span id="line-1878">        }</span>
-<span class="source-line-no">1879</span><span id="line-1879">        if (i % 100 == 0) {</span>
-<span class="source-line-no">1880</span><span id="line-1880">          LOG.info(String.format("Scan for key range %s - %s returned %s rows",</span>
-<span class="source-line-no">1881</span><span id="line-1881">            Bytes.toString(startAndStopRow.getFirst()), Bytes.toString(startAndStopRow.getSecond()),</span>
-<span class="source-line-no">1882</span><span id="line-1882">            count));</span>
-<span class="source-line-no">1883</span><span id="line-1883">        }</span>
-<span class="source-line-no">1884</span><span id="line-1884">      } finally {</span>
-<span class="source-line-no">1885</span><span id="line-1885">        updateScanMetrics(s.getScanMetrics());</span>
-<span class="source-line-no">1886</span><span id="line-1886">        s.close();</span>
-<span class="source-line-no">1887</span><span id="line-1887">      }</span>
-<span class="source-line-no">1888</span><span id="line-1888">      return true;</span>
-<span class="source-line-no">1889</span><span id="line-1889">    }</span>
-<span class="source-line-no">1890</span><span id="line-1890"></span>
-<span class="source-line-no">1891</span><span id="line-1891">    protected abstract Pair&lt;byte[], byte[]&gt; getStartAndStopRow();</span>
-<span class="source-line-no">1892</span><span id="line-1892"></span>
-<span class="source-line-no">1893</span><span id="line-1893">    protected Pair&lt;byte[], byte[]&gt; generateStartAndStopRows(int maxRange) {</span>
-<span class="source-line-no">1894</span><span id="line-1894">      int start = this.rand.nextInt(Integer.MAX_VALUE) % opts.totalRows;</span>
-<span class="source-line-no">1895</span><span id="line-1895">      int stop = start + maxRange;</span>
-<span class="source-line-no">1896</span><span id="line-1896">      return new Pair&lt;&gt;(format(start), format(stop));</span>
-<span class="source-line-no">1897</span><span id="line-1897">    }</span>
-<span class="source-line-no">1898</span><span id="line-1898"></span>
-<span class="source-line-no">1899</span><span id="line-1899">    @Override</span>
-<span class="source-line-no">1900</span><span id="line-1900">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">1901</span><span id="line-1901">      int period = opts.perClientRunRows / 100;</span>
-<span class="source-line-no">1902</span><span id="line-1902">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">1903</span><span id="line-1903">    }</span>
-<span class="source-line-no">1904</span><span id="line-1904">  }</span>
-<span class="source-line-no">1905</span><span id="line-1905"></span>
-<span class="source-line-no">1906</span><span id="line-1906">  static class RandomScanWithRange10Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1907</span><span id="line-1907">    RandomScanWithRange10Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1908</span><span id="line-1908">      super(con, options, status);</span>
-<span class="source-line-no">1909</span><span id="line-1909">    }</span>
-<span class="source-line-no">1910</span><span id="line-1910"></span>
-<span class="source-line-no">1911</span><span id="line-1911">    @Override</span>
-<span class="source-line-no">1912</span><span id="line-1912">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1913</span><span id="line-1913">      return generateStartAndStopRows(10);</span>
-<span class="source-line-no">1914</span><span id="line-1914">    }</span>
-<span class="source-line-no">1915</span><span id="line-1915">  }</span>
-<span class="source-line-no">1916</span><span id="line-1916"></span>
-<span class="source-line-no">1917</span><span id="line-1917">  static class RandomScanWithRange100Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1918</span><span id="line-1918">    RandomScanWithRange100Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1919</span><span id="line-1919">      super(con, options, status);</span>
-<span class="source-line-no">1920</span><span id="line-1920">    }</span>
+<span class="source-line-no">1790</span><span id="line-1790">  static abstract class BufferedMutatorTest extends Test {</span>
+<span class="source-line-no">1791</span><span id="line-1791">    protected BufferedMutator mutator;</span>
+<span class="source-line-no">1792</span><span id="line-1792">    protected Table table;</span>
+<span class="source-line-no">1793</span><span id="line-1793"></span>
+<span class="source-line-no">1794</span><span id="line-1794">    BufferedMutatorTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1795</span><span id="line-1795">      super(con, options, status);</span>
+<span class="source-line-no">1796</span><span id="line-1796">    }</span>
+<span class="source-line-no">1797</span><span id="line-1797"></span>
+<span class="source-line-no">1798</span><span id="line-1798">    @Override</span>
+<span class="source-line-no">1799</span><span id="line-1799">    void onStartup() throws IOException {</span>
+<span class="source-line-no">1800</span><span id="line-1800">      BufferedMutatorParams p = new BufferedMutatorParams(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1801</span><span id="line-1801">      p.writeBufferSize(opts.bufferSize);</span>
+<span class="source-line-no">1802</span><span id="line-1802">      this.mutator = connection.getBufferedMutator(p);</span>
+<span class="source-line-no">1803</span><span id="line-1803">      this.table = connection.getTable(TableName.valueOf(opts.tableName));</span>
+<span class="source-line-no">1804</span><span id="line-1804">    }</span>
+<span class="source-line-no">1805</span><span id="line-1805"></span>
+<span class="source-line-no">1806</span><span id="line-1806">    @Override</span>
+<span class="source-line-no">1807</span><span id="line-1807">    void onTakedown() throws IOException {</span>
+<span class="source-line-no">1808</span><span id="line-1808">      mutator.close();</span>
+<span class="source-line-no">1809</span><span id="line-1809">      table.close();</span>
+<span class="source-line-no">1810</span><span id="line-1810">    }</span>
+<span class="source-line-no">1811</span><span id="line-1811">  }</span>
+<span class="source-line-no">1812</span><span id="line-1812"></span>
+<span class="source-line-no">1813</span><span id="line-1813">  static class RandomSeekScanTest extends TableTest {</span>
+<span class="source-line-no">1814</span><span id="line-1814">    RandomSeekScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1815</span><span id="line-1815">      super(con, options, status);</span>
+<span class="source-line-no">1816</span><span id="line-1816">    }</span>
+<span class="source-line-no">1817</span><span id="line-1817"></span>
+<span class="source-line-no">1818</span><span id="line-1818">    @Override</span>
+<span class="source-line-no">1819</span><span id="line-1819">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">1820</span><span id="line-1820">      Scan scan =</span>
+<span class="source-line-no">1821</span><span id="line-1821">        new Scan().withStartRow(getRandomRow(this.rand, opts.totalRows)).setCaching(opts.caching)</span>
+<span class="source-line-no">1822</span><span id="line-1822">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">1823</span><span id="line-1823">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">1824</span><span id="line-1824">      FilterList list = new FilterList();</span>
+<span class="source-line-no">1825</span><span id="line-1825">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1826</span><span id="line-1826">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1827</span><span id="line-1827">        if (opts.addColumns) {</span>
+<span class="source-line-no">1828</span><span id="line-1828">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1829</span><span id="line-1829">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1830</span><span id="line-1830">            scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1831</span><span id="line-1831">          }</span>
+<span class="source-line-no">1832</span><span id="line-1832">        } else {</span>
+<span class="source-line-no">1833</span><span id="line-1833">          scan.addFamily(familyName);</span>
+<span class="source-line-no">1834</span><span id="line-1834">        }</span>
+<span class="source-line-no">1835</span><span id="line-1835">      }</span>
+<span class="source-line-no">1836</span><span id="line-1836">      if (opts.filterAll) {</span>
+<span class="source-line-no">1837</span><span id="line-1837">        list.addFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1838</span><span id="line-1838">      }</span>
+<span class="source-line-no">1839</span><span id="line-1839">      list.addFilter(new WhileMatchFilter(new PageFilter(120)));</span>
+<span class="source-line-no">1840</span><span id="line-1840">      scan.setFilter(list);</span>
+<span class="source-line-no">1841</span><span id="line-1841">      ResultScanner s = this.table.getScanner(scan);</span>
+<span class="source-line-no">1842</span><span id="line-1842">      try {</span>
+<span class="source-line-no">1843</span><span id="line-1843">        for (Result rr; (rr = s.next()) != null;) {</span>
+<span class="source-line-no">1844</span><span id="line-1844">          updateValueSize(rr);</span>
+<span class="source-line-no">1845</span><span id="line-1845">        }</span>
+<span class="source-line-no">1846</span><span id="line-1846">      } finally {</span>
+<span class="source-line-no">1847</span><span id="line-1847">        updateScanMetrics(s.getScanMetrics());</span>
+<span class="source-line-no">1848</span><span id="line-1848">        s.close();</span>
+<span class="source-line-no">1849</span><span id="line-1849">      }</span>
+<span class="source-line-no">1850</span><span id="line-1850">      return true;</span>
+<span class="source-line-no">1851</span><span id="line-1851">    }</span>
+<span class="source-line-no">1852</span><span id="line-1852"></span>
+<span class="source-line-no">1853</span><span id="line-1853">    @Override</span>
+<span class="source-line-no">1854</span><span id="line-1854">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1855</span><span id="line-1855">      int period = opts.perClientRunRows / 100;</span>
+<span class="source-line-no">1856</span><span id="line-1856">      return period == 0 ? opts.perClientRunRows : period;</span>
+<span class="source-line-no">1857</span><span id="line-1857">    }</span>
+<span class="source-line-no">1858</span><span id="line-1858"></span>
+<span class="source-line-no">1859</span><span id="line-1859">  }</span>
+<span class="source-line-no">1860</span><span id="line-1860"></span>
+<span class="source-line-no">1861</span><span id="line-1861">  static abstract class RandomScanWithRangeTest extends TableTest {</span>
+<span class="source-line-no">1862</span><span id="line-1862">    RandomScanWithRangeTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1863</span><span id="line-1863">      super(con, options, status);</span>
+<span class="source-line-no">1864</span><span id="line-1864">    }</span>
+<span class="source-line-no">1865</span><span id="line-1865"></span>
+<span class="source-line-no">1866</span><span id="line-1866">    @Override</span>
+<span class="source-line-no">1867</span><span id="line-1867">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">1868</span><span id="line-1868">      Pair&lt;byte[], byte[]&gt; startAndStopRow = getStartAndStopRow();</span>
+<span class="source-line-no">1869</span><span id="line-1869">      Scan scan = new Scan().withStartRow(startAndStopRow.getFirst())</span>
+<span class="source-line-no">1870</span><span id="line-1870">        .withStopRow(startAndStopRow.getSecond()).setCaching(opts.caching)</span>
+<span class="source-line-no">1871</span><span id="line-1871">        .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">1872</span><span id="line-1872">        .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">1873</span><span id="line-1873">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1874</span><span id="line-1874">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1875</span><span id="line-1875">        if (opts.addColumns) {</span>
+<span class="source-line-no">1876</span><span id="line-1876">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1877</span><span id="line-1877">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1878</span><span id="line-1878">            scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1879</span><span id="line-1879">          }</span>
+<span class="source-line-no">1880</span><span id="line-1880">        } else {</span>
+<span class="source-line-no">1881</span><span id="line-1881">          scan.addFamily(familyName);</span>
+<span class="source-line-no">1882</span><span id="line-1882">        }</span>
+<span class="source-line-no">1883</span><span id="line-1883">      }</span>
+<span class="source-line-no">1884</span><span id="line-1884">      if (opts.filterAll) {</span>
+<span class="source-line-no">1885</span><span id="line-1885">        scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1886</span><span id="line-1886">      }</span>
+<span class="source-line-no">1887</span><span id="line-1887">      Result r = null;</span>
+<span class="source-line-no">1888</span><span id="line-1888">      int count = 0;</span>
+<span class="source-line-no">1889</span><span id="line-1889">      ResultScanner s = this.table.getScanner(scan);</span>
+<span class="source-line-no">1890</span><span id="line-1890">      try {</span>
+<span class="source-line-no">1891</span><span id="line-1891">        for (; (r = s.next()) != null;) {</span>
+<span class="source-line-no">1892</span><span id="line-1892">          updateValueSize(r);</span>
+<span class="source-line-no">1893</span><span id="line-1893">          count++;</span>
+<span class="source-line-no">1894</span><span id="line-1894">        }</span>
+<span class="source-line-no">1895</span><span id="line-1895">        if (i % 100 == 0) {</span>
+<span class="source-line-no">1896</span><span id="line-1896">          LOG.info(String.format("Scan for key range %s - %s returned %s rows",</span>
+<span class="source-line-no">1897</span><span id="line-1897">            Bytes.toString(startAndStopRow.getFirst()), Bytes.toString(startAndStopRow.getSecond()),</span>
+<span class="source-line-no">1898</span><span id="line-1898">            count));</span>
+<span class="source-line-no">1899</span><span id="line-1899">        }</span>
+<span class="source-line-no">1900</span><span id="line-1900">      } finally {</span>
+<span class="source-line-no">1901</span><span id="line-1901">        updateScanMetrics(s.getScanMetrics());</span>
+<span class="source-line-no">1902</span><span id="line-1902">        s.close();</span>
+<span class="source-line-no">1903</span><span id="line-1903">      }</span>
+<span class="source-line-no">1904</span><span id="line-1904">      return true;</span>
+<span class="source-line-no">1905</span><span id="line-1905">    }</span>
+<span class="source-line-no">1906</span><span id="line-1906"></span>
+<span class="source-line-no">1907</span><span id="line-1907">    protected abstract Pair&lt;byte[], byte[]&gt; getStartAndStopRow();</span>
+<span class="source-line-no">1908</span><span id="line-1908"></span>
+<span class="source-line-no">1909</span><span id="line-1909">    protected Pair&lt;byte[], byte[]&gt; generateStartAndStopRows(int maxRange) {</span>
+<span class="source-line-no">1910</span><span id="line-1910">      int start = this.rand.nextInt(Integer.MAX_VALUE) % opts.totalRows;</span>
+<span class="source-line-no">1911</span><span id="line-1911">      int stop = start + maxRange;</span>
+<span class="source-line-no">1912</span><span id="line-1912">      return new Pair&lt;&gt;(format(start), format(stop));</span>
+<span class="source-line-no">1913</span><span id="line-1913">    }</span>
+<span class="source-line-no">1914</span><span id="line-1914"></span>
+<span class="source-line-no">1915</span><span id="line-1915">    @Override</span>
+<span class="source-line-no">1916</span><span id="line-1916">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">1917</span><span id="line-1917">      int period = opts.perClientRunRows / 100;</span>
+<span class="source-line-no">1918</span><span id="line-1918">      return period == 0 ? opts.perClientRunRows : period;</span>
+<span class="source-line-no">1919</span><span id="line-1919">    }</span>
+<span class="source-line-no">1920</span><span id="line-1920">  }</span>
 <span class="source-line-no">1921</span><span id="line-1921"></span>
-<span class="source-line-no">1922</span><span id="line-1922">    @Override</span>
-<span class="source-line-no">1923</span><span id="line-1923">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1924</span><span id="line-1924">      return generateStartAndStopRows(100);</span>
+<span class="source-line-no">1922</span><span id="line-1922">  static class RandomScanWithRange10Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1923</span><span id="line-1923">    RandomScanWithRange10Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1924</span><span id="line-1924">      super(con, options, status);</span>
 <span class="source-line-no">1925</span><span id="line-1925">    }</span>
-<span class="source-line-no">1926</span><span id="line-1926">  }</span>
-<span class="source-line-no">1927</span><span id="line-1927"></span>
-<span class="source-line-no">1928</span><span id="line-1928">  static class RandomScanWithRange1000Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1929</span><span id="line-1929">    RandomScanWithRange1000Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1930</span><span id="line-1930">      super(con, options, status);</span>
-<span class="source-line-no">1931</span><span id="line-1931">    }</span>
+<span class="source-line-no">1926</span><span id="line-1926"></span>
+<span class="source-line-no">1927</span><span id="line-1927">    @Override</span>
+<span class="source-line-no">1928</span><span id="line-1928">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1929</span><span id="line-1929">      return generateStartAndStopRows(10);</span>
+<span class="source-line-no">1930</span><span id="line-1930">    }</span>
+<span class="source-line-no">1931</span><span id="line-1931">  }</span>
 <span class="source-line-no">1932</span><span id="line-1932"></span>
-<span class="source-line-no">1933</span><span id="line-1933">    @Override</span>
-<span class="source-line-no">1934</span><span id="line-1934">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1935</span><span id="line-1935">      return generateStartAndStopRows(1000);</span>
+<span class="source-line-no">1933</span><span id="line-1933">  static class RandomScanWithRange100Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1934</span><span id="line-1934">    RandomScanWithRange100Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1935</span><span id="line-1935">      super(con, options, status);</span>
 <span class="source-line-no">1936</span><span id="line-1936">    }</span>
-<span class="source-line-no">1937</span><span id="line-1937">  }</span>
-<span class="source-line-no">1938</span><span id="line-1938"></span>
-<span class="source-line-no">1939</span><span id="line-1939">  static class RandomScanWithRange10000Test extends RandomScanWithRangeTest {</span>
-<span class="source-line-no">1940</span><span id="line-1940">    RandomScanWithRange10000Test(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1941</span><span id="line-1941">      super(con, options, status);</span>
-<span class="source-line-no">1942</span><span id="line-1942">    }</span>
+<span class="source-line-no">1937</span><span id="line-1937"></span>
+<span class="source-line-no">1938</span><span id="line-1938">    @Override</span>
+<span class="source-line-no">1939</span><span id="line-1939">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1940</span><span id="line-1940">      return generateStartAndStopRows(100);</span>
+<span class="source-line-no">1941</span><span id="line-1941">    }</span>
+<span class="source-line-no">1942</span><span id="line-1942">  }</span>
 <span class="source-line-no">1943</span><span id="line-1943"></span>
-<span class="source-line-no">1944</span><span id="line-1944">    @Override</span>
-<span class="source-line-no">1945</span><span id="line-1945">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
-<span class="source-line-no">1946</span><span id="line-1946">      return generateStartAndStopRows(10000);</span>
+<span class="source-line-no">1944</span><span id="line-1944">  static class RandomScanWithRange1000Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1945</span><span id="line-1945">    RandomScanWithRange1000Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1946</span><span id="line-1946">      super(con, options, status);</span>
 <span class="source-line-no">1947</span><span id="line-1947">    }</span>
-<span class="source-line-no">1948</span><span id="line-1948">  }</span>
-<span class="source-line-no">1949</span><span id="line-1949"></span>
-<span class="source-line-no">1950</span><span id="line-1950">  static class RandomReadTest extends TableTest {</span>
-<span class="source-line-no">1951</span><span id="line-1951">    private final Consistency consistency;</span>
-<span class="source-line-no">1952</span><span id="line-1952">    private ArrayList&lt;Get&gt; gets;</span>
-<span class="source-line-no">1953</span><span id="line-1953"></span>
-<span class="source-line-no">1954</span><span id="line-1954">    RandomReadTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">1955</span><span id="line-1955">      super(con, options, status);</span>
-<span class="source-line-no">1956</span><span id="line-1956">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
-<span class="source-line-no">1957</span><span id="line-1957">      if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1958</span><span id="line-1958">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
-<span class="source-line-no">1959</span><span id="line-1959">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
-<span class="source-line-no">1960</span><span id="line-1960">      }</span>
-<span class="source-line-no">1961</span><span id="line-1961">    }</span>
-<span class="source-line-no">1962</span><span id="line-1962"></span>
-<span class="source-line-no">1963</span><span id="line-1963">    @Override</span>
-<span class="source-line-no">1964</span><span id="line-1964">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">1965</span><span id="line-1965">      if (opts.randomSleep &gt; 0) {</span>
-<span class="source-line-no">1966</span><span id="line-1966">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
-<span class="source-line-no">1967</span><span id="line-1967">      }</span>
-<span class="source-line-no">1968</span><span id="line-1968">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
-<span class="source-line-no">1969</span><span id="line-1969">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">1970</span><span id="line-1970">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">1971</span><span id="line-1971">        if (opts.addColumns) {</span>
-<span class="source-line-no">1972</span><span id="line-1972">          for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">1973</span><span id="line-1973">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">1974</span><span id="line-1974">            get.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">1975</span><span id="line-1975">          }</span>
-<span class="source-line-no">1976</span><span id="line-1976">        } else {</span>
-<span class="source-line-no">1977</span><span id="line-1977">          get.addFamily(familyName);</span>
-<span class="source-line-no">1978</span><span id="line-1978">        }</span>
-<span class="source-line-no">1979</span><span id="line-1979">      }</span>
-<span class="source-line-no">1980</span><span id="line-1980">      if (opts.filterAll) {</span>
-<span class="source-line-no">1981</span><span id="line-1981">        get.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">1982</span><span id="line-1982">      }</span>
-<span class="source-line-no">1983</span><span id="line-1983">      get.setConsistency(consistency);</span>
-<span class="source-line-no">1984</span><span id="line-1984">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
-<span class="source-line-no">1985</span><span id="line-1985">      if (opts.multiGet &gt; 0) {</span>
-<span class="source-line-no">1986</span><span id="line-1986">        this.gets.add(get);</span>
-<span class="source-line-no">1987</span><span id="line-1987">        if (this.gets.size() == opts.multiGet) {</span>
-<span class="source-line-no">1988</span><span id="line-1988">          Result[] rs = this.table.get(this.gets);</span>
-<span class="source-line-no">1989</span><span id="line-1989">          if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">1990</span><span id="line-1990">            long latency = System.nanoTime() - startTime;</span>
-<span class="source-line-no">1991</span><span id="line-1991">            updateValueSize(rs, latency);</span>
-<span class="source-line-no">1992</span><span id="line-1992">          } else {</span>
-<span class="source-line-no">1993</span><span id="line-1993">            updateValueSize(rs);</span>
-<span class="source-line-no">1994</span><span id="line-1994">          }</span>
-<span class="source-line-no">1995</span><span id="line-1995">          this.gets.clear();</span>
-<span class="source-line-no">1996</span><span id="line-1996">        } else {</span>
-<span class="source-line-no">1997</span><span id="line-1997">          return false;</span>
-<span class="source-line-no">1998</span><span id="line-1998">        }</span>
-<span class="source-line-no">1999</span><span id="line-1999">      } else {</span>
-<span class="source-line-no">2000</span><span id="line-2000">        if (opts.replicas &gt; 1) {</span>
-<span class="source-line-no">2001</span><span id="line-2001">          Result r = this.table.get(get);</span>
-<span class="source-line-no">2002</span><span id="line-2002">          long latency = System.nanoTime() - startTime;</span>
-<span class="source-line-no">2003</span><span id="line-2003">          updateValueSize(r, latency);</span>
-<span class="source-line-no">2004</span><span id="line-2004">        } else {</span>
-<span class="source-line-no">2005</span><span id="line-2005">          updateValueSize(this.table.get(get));</span>
-<span class="source-line-no">2006</span><span id="line-2006">        }</span>
-<span class="source-line-no">2007</span><span id="line-2007">      }</span>
-<span class="source-line-no">2008</span><span id="line-2008">      return true;</span>
-<span class="source-line-no">2009</span><span id="line-2009">    }</span>
-<span class="source-line-no">2010</span><span id="line-2010"></span>
-<span class="source-line-no">2011</span><span id="line-2011">    @Override</span>
-<span class="source-line-no">2012</span><span id="line-2012">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">2013</span><span id="line-2013">      int period = opts.perClientRunRows / 10;</span>
-<span class="source-line-no">2014</span><span id="line-2014">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">2015</span><span id="line-2015">    }</span>
-<span class="source-line-no">2016</span><span id="line-2016"></span>
-<span class="source-line-no">2017</span><span id="line-2017">    @Override</span>
-<span class="source-line-no">2018</span><span id="line-2018">    protected void testTakedown() throws IOException {</span>
-<span class="source-line-no">2019</span><span id="line-2019">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
-<span class="source-line-no">2020</span><span id="line-2020">        this.table.get(gets);</span>
-<span class="source-line-no">2021</span><span id="line-2021">        this.gets.clear();</span>
-<span class="source-line-no">2022</span><span id="line-2022">      }</span>
-<span class="source-line-no">2023</span><span id="line-2023">      super.testTakedown();</span>
-<span class="source-line-no">2024</span><span id="line-2024">    }</span>
-<span class="source-line-no">2025</span><span id="line-2025">  }</span>
+<span class="source-line-no">1948</span><span id="line-1948"></span>
+<span class="source-line-no">1949</span><span id="line-1949">    @Override</span>
+<span class="source-line-no">1950</span><span id="line-1950">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1951</span><span id="line-1951">      return generateStartAndStopRows(1000);</span>
+<span class="source-line-no">1952</span><span id="line-1952">    }</span>
+<span class="source-line-no">1953</span><span id="line-1953">  }</span>
+<span class="source-line-no">1954</span><span id="line-1954"></span>
+<span class="source-line-no">1955</span><span id="line-1955">  static class RandomScanWithRange10000Test extends RandomScanWithRangeTest {</span>
+<span class="source-line-no">1956</span><span id="line-1956">    RandomScanWithRange10000Test(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1957</span><span id="line-1957">      super(con, options, status);</span>
+<span class="source-line-no">1958</span><span id="line-1958">    }</span>
+<span class="source-line-no">1959</span><span id="line-1959"></span>
+<span class="source-line-no">1960</span><span id="line-1960">    @Override</span>
+<span class="source-line-no">1961</span><span id="line-1961">    protected Pair&lt;byte[], byte[]&gt; getStartAndStopRow() {</span>
+<span class="source-line-no">1962</span><span id="line-1962">      return generateStartAndStopRows(10000);</span>
+<span class="source-line-no">1963</span><span id="line-1963">    }</span>
+<span class="source-line-no">1964</span><span id="line-1964">  }</span>
+<span class="source-line-no">1965</span><span id="line-1965"></span>
+<span class="source-line-no">1966</span><span id="line-1966">  static class RandomReadTest extends TableTest {</span>
+<span class="source-line-no">1967</span><span id="line-1967">    private final Consistency consistency;</span>
+<span class="source-line-no">1968</span><span id="line-1968">    private ArrayList&lt;Get&gt; gets;</span>
+<span class="source-line-no">1969</span><span id="line-1969"></span>
+<span class="source-line-no">1970</span><span id="line-1970">    RandomReadTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">1971</span><span id="line-1971">      super(con, options, status);</span>
+<span class="source-line-no">1972</span><span id="line-1972">      consistency = options.replicas == DEFAULT_OPTS.replicas ? null : Consistency.TIMELINE;</span>
+<span class="source-line-no">1973</span><span id="line-1973">      if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">1974</span><span id="line-1974">        LOG.info("MultiGet enabled. Sending GETs in batches of " + opts.multiGet + ".");</span>
+<span class="source-line-no">1975</span><span id="line-1975">        this.gets = new ArrayList&lt;&gt;(opts.multiGet);</span>
+<span class="source-line-no">1976</span><span id="line-1976">      }</span>
+<span class="source-line-no">1977</span><span id="line-1977">    }</span>
+<span class="source-line-no">1978</span><span id="line-1978"></span>
+<span class="source-line-no">1979</span><span id="line-1979">    @Override</span>
+<span class="source-line-no">1980</span><span id="line-1980">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">1981</span><span id="line-1981">      if (opts.randomSleep &gt; 0) {</span>
+<span class="source-line-no">1982</span><span id="line-1982">        Thread.sleep(ThreadLocalRandom.current().nextInt(opts.randomSleep));</span>
+<span class="source-line-no">1983</span><span id="line-1983">      }</span>
+<span class="source-line-no">1984</span><span id="line-1984">      Get get = new Get(getRandomRow(this.rand, opts.totalRows));</span>
+<span class="source-line-no">1985</span><span id="line-1985">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">1986</span><span id="line-1986">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">1987</span><span id="line-1987">        if (opts.addColumns) {</span>
+<span class="source-line-no">1988</span><span id="line-1988">          for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">1989</span><span id="line-1989">            byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">1990</span><span id="line-1990">            get.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">1991</span><span id="line-1991">          }</span>
+<span class="source-line-no">1992</span><span id="line-1992">        } else {</span>
+<span class="source-line-no">1993</span><span id="line-1993">          get.addFamily(familyName);</span>
+<span class="source-line-no">1994</span><span id="line-1994">        }</span>
+<span class="source-line-no">1995</span><span id="line-1995">      }</span>
+<span class="source-line-no">1996</span><span id="line-1996">      if (opts.filterAll) {</span>
+<span class="source-line-no">1997</span><span id="line-1997">        get.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">1998</span><span id="line-1998">      }</span>
+<span class="source-line-no">1999</span><span id="line-1999">      get.setConsistency(consistency);</span>
+<span class="source-line-no">2000</span><span id="line-2000">      if (LOG.isTraceEnabled()) LOG.trace(get.toString());</span>
+<span class="source-line-no">2001</span><span id="line-2001">      if (opts.multiGet &gt; 0) {</span>
+<span class="source-line-no">2002</span><span id="line-2002">        this.gets.add(get);</span>
+<span class="source-line-no">2003</span><span id="line-2003">        if (this.gets.size() == opts.multiGet) {</span>
+<span class="source-line-no">2004</span><span id="line-2004">          Result[] rs = this.table.get(this.gets);</span>
+<span class="source-line-no">2005</span><span id="line-2005">          if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">2006</span><span id="line-2006">            long latency = System.nanoTime() - startTime;</span>
+<span class="source-line-no">2007</span><span id="line-2007">            updateValueSize(rs, latency);</span>
+<span class="source-line-no">2008</span><span id="line-2008">          } else {</span>
+<span class="source-line-no">2009</span><span id="line-2009">            updateValueSize(rs);</span>
+<span class="source-line-no">2010</span><span id="line-2010">          }</span>
+<span class="source-line-no">2011</span><span id="line-2011">          this.gets.clear();</span>
+<span class="source-line-no">2012</span><span id="line-2012">        } else {</span>
+<span class="source-line-no">2013</span><span id="line-2013">          return false;</span>
+<span class="source-line-no">2014</span><span id="line-2014">        }</span>
+<span class="source-line-no">2015</span><span id="line-2015">      } else {</span>
+<span class="source-line-no">2016</span><span id="line-2016">        if (opts.replicas &gt; 1) {</span>
+<span class="source-line-no">2017</span><span id="line-2017">          Result r = this.table.get(get);</span>
+<span class="source-line-no">2018</span><span id="line-2018">          long latency = System.nanoTime() - startTime;</span>
+<span class="source-line-no">2019</span><span id="line-2019">          updateValueSize(r, latency);</span>
+<span class="source-line-no">2020</span><span id="line-2020">        } else {</span>
+<span class="source-line-no">2021</span><span id="line-2021">          updateValueSize(this.table.get(get));</span>
+<span class="source-line-no">2022</span><span id="line-2022">        }</span>
+<span class="source-line-no">2023</span><span id="line-2023">      }</span>
+<span class="source-line-no">2024</span><span id="line-2024">      return true;</span>
+<span class="source-line-no">2025</span><span id="line-2025">    }</span>
 <span class="source-line-no">2026</span><span id="line-2026"></span>
-<span class="source-line-no">2027</span><span id="line-2027">  /*</span>
-<span class="source-line-no">2028</span><span id="line-2028">   * Send random reads against fake regions inserted by MetaWriteTest</span>
-<span class="source-line-no">2029</span><span id="line-2029">   */</span>
-<span class="source-line-no">2030</span><span id="line-2030">  static class MetaRandomReadTest extends MetaTest {</span>
-<span class="source-line-no">2031</span><span id="line-2031">    private RegionLocator regionLocator;</span>
+<span class="source-line-no">2027</span><span id="line-2027">    @Override</span>
+<span class="source-line-no">2028</span><span id="line-2028">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">2029</span><span id="line-2029">      int period = opts.perClientRunRows / 10;</span>
+<span class="source-line-no">2030</span><span id="line-2030">      return period == 0 ? opts.perClientRunRows : period;</span>
+<span class="source-line-no">2031</span><span id="line-2031">    }</span>
 <span class="source-line-no">2032</span><span id="line-2032"></span>
-<span class="source-line-no">2033</span><span id="line-2033">    MetaRandomReadTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2034</span><span id="line-2034">      super(con, options, status);</span>
-<span class="source-line-no">2035</span><span id="line-2035">      LOG.info("call getRegionLocation");</span>
-<span class="source-line-no">2036</span><span id="line-2036">    }</span>
-<span class="source-line-no">2037</span><span id="line-2037"></span>
-<span class="source-line-no">2038</span><span id="line-2038">    @Override</span>
-<span class="source-line-no">2039</span><span id="line-2039">    void onStartup() throws IOException {</span>
-<span class="source-line-no">2040</span><span id="line-2040">      super.onStartup();</span>
-<span class="source-line-no">2041</span><span id="line-2041">      this.regionLocator = connection.getRegionLocator(table.getName());</span>
-<span class="source-line-no">2042</span><span id="line-2042">    }</span>
-<span class="source-line-no">2043</span><span id="line-2043"></span>
-<span class="source-line-no">2044</span><span id="line-2044">    @Override</span>
-<span class="source-line-no">2045</span><span id="line-2045">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
-<span class="source-line-no">2046</span><span id="line-2046">      if (opts.randomSleep &gt; 0) {</span>
-<span class="source-line-no">2047</span><span id="line-2047">        Thread.sleep(rand.nextInt(opts.randomSleep));</span>
-<span class="source-line-no">2048</span><span id="line-2048">      }</span>
-<span class="source-line-no">2049</span><span id="line-2049">      HRegionLocation hRegionLocation =</span>
-<span class="source-line-no">2050</span><span id="line-2050">        regionLocator.getRegionLocation(getSplitKey(rand.nextInt(opts.perClientRunRows)), true);</span>
-<span class="source-line-no">2051</span><span id="line-2051">      LOG.debug("get location for region: " + hRegionLocation);</span>
-<span class="source-line-no">2052</span><span id="line-2052">      return true;</span>
-<span class="source-line-no">2053</span><span id="line-2053">    }</span>
-<span class="source-line-no">2054</span><span id="line-2054"></span>
-<span class="source-line-no">2055</span><span id="line-2055">    @Override</span>
-<span class="source-line-no">2056</span><span id="line-2056">    protected int getReportingPeriod() {</span>
-<span class="source-line-no">2057</span><span id="line-2057">      int period = opts.perClientRunRows / 10;</span>
-<span class="source-line-no">2058</span><span id="line-2058">      return period == 0 ? opts.perClientRunRows : period;</span>
-<span class="source-line-no">2059</span><span id="line-2059">    }</span>
-<span class="source-line-no">2060</span><span id="line-2060"></span>
-<span class="source-line-no">2061</span><span id="line-2061">    @Override</span>
-<span class="source-line-no">2062</span><span id="line-2062">    protected void testTakedown() throws IOException {</span>
-<span class="source-line-no">2063</span><span id="line-2063">      super.testTakedown();</span>
-<span class="source-line-no">2064</span><span id="line-2064">    }</span>
-<span class="source-line-no">2065</span><span id="line-2065">  }</span>
-<span class="source-line-no">2066</span><span id="line-2066"></span>
-<span class="source-line-no">2067</span><span id="line-2067">  static class RandomWriteTest extends SequentialWriteTest {</span>
-<span class="source-line-no">2068</span><span id="line-2068">    RandomWriteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2069</span><span id="line-2069">      super(con, options, status);</span>
-<span class="source-line-no">2070</span><span id="line-2070">    }</span>
-<span class="source-line-no">2071</span><span id="line-2071"></span>
-<span class="source-line-no">2072</span><span id="line-2072">    @Override</span>
-<span class="source-line-no">2073</span><span id="line-2073">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">2074</span><span id="line-2074">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">2033</span><span id="line-2033">    @Override</span>
+<span class="source-line-no">2034</span><span id="line-2034">    protected void testTakedown() throws IOException {</span>
+<span class="source-line-no">2035</span><span id="line-2035">      if (this.gets != null &amp;&amp; this.gets.size() &gt; 0) {</span>
+<span class="source-line-no">2036</span><span id="line-2036">        this.table.get(gets);</span>
+<span class="source-line-no">2037</span><span id="line-2037">        this.gets.clear();</span>
+<span class="source-line-no">2038</span><span id="line-2038">      }</span>
+<span class="source-line-no">2039</span><span id="line-2039">      super.testTakedown();</span>
+<span class="source-line-no">2040</span><span id="line-2040">    }</span>
+<span class="source-line-no">2041</span><span id="line-2041">  }</span>
+<span class="source-line-no">2042</span><span id="line-2042"></span>
+<span class="source-line-no">2043</span><span id="line-2043">  /*</span>
+<span class="source-line-no">2044</span><span id="line-2044">   * Send random reads against fake regions inserted by MetaWriteTest</span>
+<span class="source-line-no">2045</span><span id="line-2045">   */</span>
+<span class="source-line-no">2046</span><span id="line-2046">  static class MetaRandomReadTest extends MetaTest {</span>
+<span class="source-line-no">2047</span><span id="line-2047">    private RegionLocator regionLocator;</span>
+<span class="source-line-no">2048</span><span id="line-2048"></span>
+<span class="source-line-no">2049</span><span id="line-2049">    MetaRandomReadTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2050</span><span id="line-2050">      super(con, options, status);</span>
+<span class="source-line-no">2051</span><span id="line-2051">      LOG.info("call getRegionLocation");</span>
+<span class="source-line-no">2052</span><span id="line-2052">    }</span>
+<span class="source-line-no">2053</span><span id="line-2053"></span>
+<span class="source-line-no">2054</span><span id="line-2054">    @Override</span>
+<span class="source-line-no">2055</span><span id="line-2055">    void onStartup() throws IOException {</span>
+<span class="source-line-no">2056</span><span id="line-2056">      super.onStartup();</span>
+<span class="source-line-no">2057</span><span id="line-2057">      this.regionLocator = connection.getRegionLocator(table.getName());</span>
+<span class="source-line-no">2058</span><span id="line-2058">    }</span>
+<span class="source-line-no">2059</span><span id="line-2059"></span>
+<span class="source-line-no">2060</span><span id="line-2060">    @Override</span>
+<span class="source-line-no">2061</span><span id="line-2061">    boolean testRow(final int i, final long startTime) throws IOException, InterruptedException {</span>
+<span class="source-line-no">2062</span><span id="line-2062">      if (opts.randomSleep &gt; 0) {</span>
+<span class="source-line-no">2063</span><span id="line-2063">        Thread.sleep(rand.nextInt(opts.randomSleep));</span>
+<span class="source-line-no">2064</span><span id="line-2064">      }</span>
+<span class="source-line-no">2065</span><span id="line-2065">      HRegionLocation hRegionLocation =</span>
+<span class="source-line-no">2066</span><span id="line-2066">        regionLocator.getRegionLocation(getSplitKey(rand.nextInt(opts.perClientRunRows)), true);</span>
+<span class="source-line-no">2067</span><span id="line-2067">      LOG.debug("get location for region: " + hRegionLocation);</span>
+<span class="source-line-no">2068</span><span id="line-2068">      return true;</span>
+<span class="source-line-no">2069</span><span id="line-2069">    }</span>
+<span class="source-line-no">2070</span><span id="line-2070"></span>
+<span class="source-line-no">2071</span><span id="line-2071">    @Override</span>
+<span class="source-line-no">2072</span><span id="line-2072">    protected int getReportingPeriod() {</span>
+<span class="source-line-no">2073</span><span id="line-2073">      int period = opts.perClientRunRows / 10;</span>
+<span class="source-line-no">2074</span><span id="line-2074">      return period == 0 ? opts.perClientRunRows : period;</span>
 <span class="source-line-no">2075</span><span id="line-2075">    }</span>
 <span class="source-line-no">2076</span><span id="line-2076"></span>
-<span class="source-line-no">2077</span><span id="line-2077">  }</span>
-<span class="source-line-no">2078</span><span id="line-2078"></span>
-<span class="source-line-no">2079</span><span id="line-2079">  static class RandomDeleteTest extends SequentialDeleteTest {</span>
-<span class="source-line-no">2080</span><span id="line-2080">    RandomDeleteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2081</span><span id="line-2081">      super(con, options, status);</span>
-<span class="source-line-no">2082</span><span id="line-2082">    }</span>
-<span class="source-line-no">2083</span><span id="line-2083"></span>
-<span class="source-line-no">2084</span><span id="line-2084">    @Override</span>
-<span class="source-line-no">2085</span><span id="line-2085">    protected byte[] generateRow(final int i) {</span>
-<span class="source-line-no">2086</span><span id="line-2086">      return getRandomRow(this.rand, opts.totalRows);</span>
-<span class="source-line-no">2087</span><span id="line-2087">    }</span>
-<span class="source-line-no">2088</span><span id="line-2088"></span>
-<span class="source-line-no">2089</span><span id="line-2089">  }</span>
-<span class="source-line-no">2090</span><span id="line-2090"></span>
-<span class="source-line-no">2091</span><span id="line-2091">  static class ScanTest extends TableTest {</span>
-<span class="source-line-no">2092</span><span id="line-2092">    private ResultScanner testScanner;</span>
-<span class="source-line-no">2093</span><span id="line-2093"></span>
-<span class="source-line-no">2094</span><span id="line-2094">    ScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2095</span><span id="line-2095">      super(con, options, status);</span>
-<span class="source-line-no">2096</span><span id="line-2096">    }</span>
-<span class="source-line-no">2097</span><span id="line-2097"></span>
-<span class="source-line-no">2098</span><span id="line-2098">    @Override</span>
-<span class="source-line-no">2099</span><span id="line-2099">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">2100</span><span id="line-2100">      if (this.testScanner != null) {</span>
-<span class="source-line-no">2101</span><span id="line-2101">        this.testScanner.close();</span>
-<span class="source-line-no">2102</span><span id="line-2102">      }</span>
-<span class="source-line-no">2103</span><span id="line-2103">      super.testTakedown();</span>
-<span class="source-line-no">2104</span><span id="line-2104">    }</span>
-<span class="source-line-no">2105</span><span id="line-2105"></span>
-<span class="source-line-no">2106</span><span id="line-2106">    @Override</span>
-<span class="source-line-no">2107</span><span id="line-2107">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2108</span><span id="line-2108">      if (this.testScanner == null) {</span>
-<span class="source-line-no">2109</span><span id="line-2109">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
-<span class="source-line-no">2110</span><span id="line-2110">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
-<span class="source-line-no">2111</span><span id="line-2111">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
-<span class="source-line-no">2112</span><span id="line-2112">        for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2113</span><span id="line-2113">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2114</span><span id="line-2114">          if (opts.addColumns) {</span>
-<span class="source-line-no">2115</span><span id="line-2115">            for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2116</span><span id="line-2116">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2117</span><span id="line-2117">              scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">2118</span><span id="line-2118">            }</span>
-<span class="source-line-no">2119</span><span id="line-2119">          } else {</span>
-<span class="source-line-no">2120</span><span id="line-2120">            scan.addFamily(familyName);</span>
-<span class="source-line-no">2121</span><span id="line-2121">          }</span>
-<span class="source-line-no">2122</span><span id="line-2122">        }</span>
-<span class="source-line-no">2123</span><span id="line-2123">        if (opts.filterAll) {</span>
-<span class="source-line-no">2124</span><span id="line-2124">          scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">2125</span><span id="line-2125">        }</span>
-<span class="source-line-no">2126</span><span id="line-2126">        this.testScanner = table.getScanner(scan);</span>
-<span class="source-line-no">2127</span><span id="line-2127">      }</span>
-<span class="source-line-no">2128</span><span id="line-2128">      Result r = testScanner.next();</span>
-<span class="source-line-no">2129</span><span id="line-2129">      updateValueSize(r);</span>
-<span class="source-line-no">2130</span><span id="line-2130">      return true;</span>
-<span class="source-line-no">2131</span><span id="line-2131">    }</span>
-<span class="source-line-no">2132</span><span id="line-2132">  }</span>
-<span class="source-line-no">2133</span><span id="line-2133"></span>
-<span class="source-line-no">2134</span><span id="line-2134">  static class ReverseScanTest extends TableTest {</span>
-<span class="source-line-no">2135</span><span id="line-2135">    private ResultScanner testScanner;</span>
-<span class="source-line-no">2136</span><span id="line-2136"></span>
-<span class="source-line-no">2137</span><span id="line-2137">    ReverseScanTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2138</span><span id="line-2138">      super(con, options, status);</span>
-<span class="source-line-no">2139</span><span id="line-2139">    }</span>
-<span class="source-line-no">2140</span><span id="line-2140"></span>
-<span class="source-line-no">2141</span><span id="line-2141">    @Override</span>
-<span class="source-line-no">2142</span><span id="line-2142">    void testTakedown() throws IOException {</span>
-<span class="source-line-no">2143</span><span id="line-2143">      if (this.testScanner != null) {</span>
-<span class="source-line-no">2144</span><span id="line-2144">        this.testScanner.close();</span>
-<span class="source-line-no">2145</span><span id="line-2145">      }</span>
-<span class="source-line-no">2146</span><span id="line-2146">      super.testTakedown();</span>
+<span class="source-line-no">2077</span><span id="line-2077">    @Override</span>
+<span class="source-line-no">2078</span><span id="line-2078">    protected void testTakedown() throws IOException {</span>
+<span class="source-line-no">2079</span><span id="line-2079">      super.testTakedown();</span>
+<span class="source-line-no">2080</span><span id="line-2080">    }</span>
+<span class="source-line-no">2081</span><span id="line-2081">  }</span>
+<span class="source-line-no">2082</span><span id="line-2082"></span>
+<span class="source-line-no">2083</span><span id="line-2083">  static class RandomWriteTest extends SequentialWriteTest {</span>
+<span class="source-line-no">2084</span><span id="line-2084">    RandomWriteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2085</span><span id="line-2085">      super(con, options, status);</span>
+<span class="source-line-no">2086</span><span id="line-2086">    }</span>
+<span class="source-line-no">2087</span><span id="line-2087"></span>
+<span class="source-line-no">2088</span><span id="line-2088">    @Override</span>
+<span class="source-line-no">2089</span><span id="line-2089">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">2090</span><span id="line-2090">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">2091</span><span id="line-2091">    }</span>
+<span class="source-line-no">2092</span><span id="line-2092"></span>
+<span class="source-line-no">2093</span><span id="line-2093">  }</span>
+<span class="source-line-no">2094</span><span id="line-2094"></span>
+<span class="source-line-no">2095</span><span id="line-2095">  static class RandomDeleteTest extends SequentialDeleteTest {</span>
+<span class="source-line-no">2096</span><span id="line-2096">    RandomDeleteTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2097</span><span id="line-2097">      super(con, options, status);</span>
+<span class="source-line-no">2098</span><span id="line-2098">    }</span>
+<span class="source-line-no">2099</span><span id="line-2099"></span>
+<span class="source-line-no">2100</span><span id="line-2100">    @Override</span>
+<span class="source-line-no">2101</span><span id="line-2101">    protected byte[] generateRow(final int i) {</span>
+<span class="source-line-no">2102</span><span id="line-2102">      return getRandomRow(this.rand, opts.totalRows);</span>
+<span class="source-line-no">2103</span><span id="line-2103">    }</span>
+<span class="source-line-no">2104</span><span id="line-2104"></span>
+<span class="source-line-no">2105</span><span id="line-2105">  }</span>
+<span class="source-line-no">2106</span><span id="line-2106"></span>
+<span class="source-line-no">2107</span><span id="line-2107">  static class ScanTest extends TableTest {</span>
+<span class="source-line-no">2108</span><span id="line-2108">    private ResultScanner testScanner;</span>
+<span class="source-line-no">2109</span><span id="line-2109"></span>
+<span class="source-line-no">2110</span><span id="line-2110">    ScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2111</span><span id="line-2111">      super(con, options, status);</span>
+<span class="source-line-no">2112</span><span id="line-2112">    }</span>
+<span class="source-line-no">2113</span><span id="line-2113"></span>
+<span class="source-line-no">2114</span><span id="line-2114">    @Override</span>
+<span class="source-line-no">2115</span><span id="line-2115">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">2116</span><span id="line-2116">      if (this.testScanner != null) {</span>
+<span class="source-line-no">2117</span><span id="line-2117">        this.testScanner.close();</span>
+<span class="source-line-no">2118</span><span id="line-2118">      }</span>
+<span class="source-line-no">2119</span><span id="line-2119">      super.testTakedown();</span>
+<span class="source-line-no">2120</span><span id="line-2120">    }</span>
+<span class="source-line-no">2121</span><span id="line-2121"></span>
+<span class="source-line-no">2122</span><span id="line-2122">    @Override</span>
+<span class="source-line-no">2123</span><span id="line-2123">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2124</span><span id="line-2124">      if (this.testScanner == null) {</span>
+<span class="source-line-no">2125</span><span id="line-2125">        Scan scan = new Scan().withStartRow(format(opts.startRow)).setCaching(opts.caching)</span>
+<span class="source-line-no">2126</span><span id="line-2126">          .setCacheBlocks(opts.cacheBlocks).setAsyncPrefetch(opts.asyncPrefetch)</span>
+<span class="source-line-no">2127</span><span id="line-2127">          .setReadType(opts.scanReadType).setScanMetricsEnabled(true);</span>
+<span class="source-line-no">2128</span><span id="line-2128">        for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2129</span><span id="line-2129">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2130</span><span id="line-2130">          if (opts.addColumns) {</span>
+<span class="source-line-no">2131</span><span id="line-2131">            for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2132</span><span id="line-2132">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2133</span><span id="line-2133">              scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">2134</span><span id="line-2134">            }</span>
+<span class="source-line-no">2135</span><span id="line-2135">          } else {</span>
+<span class="source-line-no">2136</span><span id="line-2136">            scan.addFamily(familyName);</span>
+<span class="source-line-no">2137</span><span id="line-2137">          }</span>
+<span class="source-line-no">2138</span><span id="line-2138">        }</span>
+<span class="source-line-no">2139</span><span id="line-2139">        if (opts.filterAll) {</span>
+<span class="source-line-no">2140</span><span id="line-2140">          scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">2141</span><span id="line-2141">        }</span>
+<span class="source-line-no">2142</span><span id="line-2142">        this.testScanner = table.getScanner(scan);</span>
+<span class="source-line-no">2143</span><span id="line-2143">      }</span>
+<span class="source-line-no">2144</span><span id="line-2144">      Result r = testScanner.next();</span>
+<span class="source-line-no">2145</span><span id="line-2145">      updateValueSize(r);</span>
+<span class="source-line-no">2146</span><span id="line-2146">      return true;</span>
 <span class="source-line-no">2147</span><span id="line-2147">    }</span>
-<span class="source-line-no">2148</span><span id="line-2148"></span>
-<span class="source-line-no">2149</span><span id="line-2149">    @Override</span>
-<span class="source-line-no">2150</span><span id="line-2150">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2151</span><span id="line-2151">      if (this.testScanner == null) {</span>
-<span class="source-line-no">2152</span><span id="line-2152">        Scan scan = new Scan().setCaching(opts.caching).setCacheBlocks(opts.cacheBlocks)</span>
-<span class="source-line-no">2153</span><span id="line-2153">          .setAsyncPrefetch(opts.asyncPrefetch).setReadType(opts.scanReadType)</span>
-<span class="source-line-no">2154</span><span id="line-2154">          .setScanMetricsEnabled(true).setReversed(true);</span>
-<span class="source-line-no">2155</span><span id="line-2155">        for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2156</span><span id="line-2156">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2157</span><span id="line-2157">          if (opts.addColumns) {</span>
-<span class="source-line-no">2158</span><span id="line-2158">            for (int column = 0; column &lt; opts.columns; column++) {</span>
-<span class="source-line-no">2159</span><span id="line-2159">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
-<span class="source-line-no">2160</span><span id="line-2160">              scan.addColumn(familyName, qualifier);</span>
-<span class="source-line-no">2161</span><span id="line-2161">            }</span>
-<span class="source-line-no">2162</span><span id="line-2162">          } else {</span>
-<span class="source-line-no">2163</span><span id="line-2163">            scan.addFamily(familyName);</span>
-<span class="source-line-no">2164</span><span id="line-2164">          }</span>
-<span class="source-line-no">2165</span><span id="line-2165">        }</span>
-<span class="source-line-no">2166</span><span id="line-2166">        if (opts.filterAll) {</span>
-<span class="source-line-no">2167</span><span id="line-2167">          scan.setFilter(new FilterAllFilter());</span>
-<span class="source-line-no">2168</span><span id="line-2168">        }</span>
-<span class="source-line-no">2169</span><span id="line-2169">        this.testScanner = table.getScanner(scan);</span>
-<span class="source-line-no">2170</span><span id="line-2170">      }</span>
-<span class="source-line-no">2171</span><span id="line-2171">      Result r = testScanner.next();</span>
-<span class="source-line-no">2172</span><span id="line-2172">      updateValueSize(r);</span>
-<span class="source-line-no">2173</span><span id="line-2173">      return true;</span>
-<span class="source-line-no">2174</span><span id="line-2174">    }</span>
-<span class="source-line-no">2175</span><span id="line-2175">  }</span>
-<span class="source-line-no">2176</span><span id="line-2176"></span>
-<span class="source-line-no">2177</span><span id="line-2177">  /**</span>
-<span class="source-line-no">2178</span><span id="line-2178">   * Base class for operations that are CAS-like; that read a value and then set it based off what</span>
-<span class="source-line-no">2179</span><span id="line-2179">   * they read. In this category is increment, append, checkAndPut, etc.</span>
-<span class="source-line-no">2180</span><span id="line-2180">   * &lt;p&gt;</span>
-<span class="source-line-no">2181</span><span id="line-2181">   * These operations also want some concurrency going on. Usually when these tests run, they</span>
-<span class="source-line-no">2182</span><span id="line-2182">   * operate in their own part of the key range. In CASTest, we will have them all overlap on the</span>
-<span class="source-line-no">2183</span><span id="line-2183">   * same key space. We do this with our getStartRow and getLastRow overrides.</span>
-<span class="source-line-no">2184</span><span id="line-2184">   */</span>
-<span class="source-line-no">2185</span><span id="line-2185">  static abstract class CASTableTest extends TableTest {</span>
-<span class="source-line-no">2186</span><span id="line-2186">    private final byte[] qualifier;</span>
-<span class="source-line-no">2187</span><span id="line-2187"></span>
-<span class="source-line-no">2188</span><span id="line-2188">    CASTableTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2189</span><span id="line-2189">      super(con, options, status);</span>
-<span class="source-line-no">2190</span><span id="line-2190">      qualifier = Bytes.toBytes(this.getClass().getSimpleName());</span>
-<span class="source-line-no">2191</span><span id="line-2191">    }</span>
+<span class="source-line-no">2148</span><span id="line-2148">  }</span>
+<span class="source-line-no">2149</span><span id="line-2149"></span>
+<span class="source-line-no">2150</span><span id="line-2150">  static class ReverseScanTest extends TableTest {</span>
+<span class="source-line-no">2151</span><span id="line-2151">    private ResultScanner testScanner;</span>
+<span class="source-line-no">2152</span><span id="line-2152"></span>
+<span class="source-line-no">2153</span><span id="line-2153">    ReverseScanTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2154</span><span id="line-2154">      super(con, options, status);</span>
+<span class="source-line-no">2155</span><span id="line-2155">    }</span>
+<span class="source-line-no">2156</span><span id="line-2156"></span>
+<span class="source-line-no">2157</span><span id="line-2157">    @Override</span>
+<span class="source-line-no">2158</span><span id="line-2158">    void testTakedown() throws IOException {</span>
+<span class="source-line-no">2159</span><span id="line-2159">      if (this.testScanner != null) {</span>
+<span class="source-line-no">2160</span><span id="line-2160">        this.testScanner.close();</span>
+<span class="source-line-no">2161</span><span id="line-2161">      }</span>
+<span class="source-line-no">2162</span><span id="line-2162">      super.testTakedown();</span>
+<span class="source-line-no">2163</span><span id="line-2163">    }</span>
+<span class="source-line-no">2164</span><span id="line-2164"></span>
+<span class="source-line-no">2165</span><span id="line-2165">    @Override</span>
+<span class="source-line-no">2166</span><span id="line-2166">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2167</span><span id="line-2167">      if (this.testScanner == null) {</span>
+<span class="source-line-no">2168</span><span id="line-2168">        Scan scan = new Scan().setCaching(opts.caching).setCacheBlocks(opts.cacheBlocks)</span>
+<span class="source-line-no">2169</span><span id="line-2169">          .setAsyncPrefetch(opts.asyncPrefetch).setReadType(opts.scanReadType)</span>
+<span class="source-line-no">2170</span><span id="line-2170">          .setScanMetricsEnabled(true).setReversed(true);</span>
+<span class="source-line-no">2171</span><span id="line-2171">        for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2172</span><span id="line-2172">          byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2173</span><span id="line-2173">          if (opts.addColumns) {</span>
+<span class="source-line-no">2174</span><span id="line-2174">            for (int column = 0; column &lt; opts.columns; column++) {</span>
+<span class="source-line-no">2175</span><span id="line-2175">              byte[] qualifier = column == 0 ? COLUMN_ZERO : Bytes.toBytes("" + column);</span>
+<span class="source-line-no">2176</span><span id="line-2176">              scan.addColumn(familyName, qualifier);</span>
+<span class="source-line-no">2177</span><span id="line-2177">            }</span>
+<span class="source-line-no">2178</span><span id="line-2178">          } else {</span>
+<span class="source-line-no">2179</span><span id="line-2179">            scan.addFamily(familyName);</span>
+<span class="source-line-no">2180</span><span id="line-2180">          }</span>
+<span class="source-line-no">2181</span><span id="line-2181">        }</span>
+<span class="source-line-no">2182</span><span id="line-2182">        if (opts.filterAll) {</span>
+<span class="source-line-no">2183</span><span id="line-2183">          scan.setFilter(new FilterAllFilter());</span>
+<span class="source-line-no">2184</span><span id="line-2184">        }</span>
+<span class="source-line-no">2185</span><span id="line-2185">        this.testScanner = table.getScanner(scan);</span>
+<span class="source-line-no">2186</span><span id="line-2186">      }</span>
+<span class="source-line-no">2187</span><span id="line-2187">      Result r = testScanner.next();</span>
+<span class="source-line-no">2188</span><span id="line-2188">      updateValueSize(r);</span>
+<span class="source-line-no">2189</span><span id="line-2189">      return true;</span>
+<span class="source-line-no">2190</span><span id="line-2190">    }</span>
+<span class="source-line-no">2191</span><span id="line-2191">  }</span>
 <span class="source-line-no">2192</span><span id="line-2192"></span>
-<span class="source-line-no">2193</span><span id="line-2193">    byte[] getQualifier() {</span>
-<span class="source-line-no">2194</span><span id="line-2194">      return this.qualifier;</span>
-<span class="source-line-no">2195</span><span id="line-2195">    }</span>
-<span class="source-line-no">2196</span><span id="line-2196"></span>
-<span class="source-line-no">2197</span><span id="line-2197">    @Override</span>
-<span class="source-line-no">2198</span><span id="line-2198">    int getStartRow() {</span>
-<span class="source-line-no">2199</span><span id="line-2199">      return 0;</span>
-<span class="source-line-no">2200</span><span id="line-2200">    }</span>
-<span class="source-line-no">2201</span><span id="line-2201"></span>
-<span class="source-line-no">2202</span><span id="line-2202">    @Override</span>
-<span class="source-line-no">2203</span><span id="line-2203">    int getLastRow() {</span>
-<span class="source-line-no">2204</span><span id="line-2204">      return opts.perClientRunRows;</span>
-<span class="source-line-no">2205</span><span id="line-2205">    }</span>
-<span class="source-line-no">2206</span><span id="line-2206">  }</span>
-<span class="source-line-no">2207</span><span id="line-2207"></span>
-<span class="source-line-no">2208</span><span id="line-2208">  static class IncrementTest extends CASTableTest {</span>
-<span class="source-line-no">2209</span><span id="line-2209">    IncrementTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2210</span><span id="line-2210">      super(con, options, status);</span>
+<span class="source-line-no">2193</span><span id="line-2193">  /**</span>
+<span class="source-line-no">2194</span><span id="line-2194">   * Base class for operations that are CAS-like; that read a value and then set it based off what</span>
+<span class="source-line-no">2195</span><span id="line-2195">   * they read. In this category is increment, append, checkAndPut, etc.</span>
+<span class="source-line-no">2196</span><span id="line-2196">   * &lt;p&gt;</span>
+<span class="source-line-no">2197</span><span id="line-2197">   * These operations also want some concurrency going on. Usually when these tests run, they</span>
+<span class="source-line-no">2198</span><span id="line-2198">   * operate in their own part of the key range. In CASTest, we will have them all overlap on the</span>
+<span class="source-line-no">2199</span><span id="line-2199">   * same key space. We do this with our getStartRow and getLastRow overrides.</span>
+<span class="source-line-no">2200</span><span id="line-2200">   */</span>
+<span class="source-line-no">2201</span><span id="line-2201">  static abstract class CASTableTest extends TableTest {</span>
+<span class="source-line-no">2202</span><span id="line-2202">    private final byte[] qualifier;</span>
+<span class="source-line-no">2203</span><span id="line-2203"></span>
+<span class="source-line-no">2204</span><span id="line-2204">    CASTableTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2205</span><span id="line-2205">      super(con, options, status);</span>
+<span class="source-line-no">2206</span><span id="line-2206">      qualifier = Bytes.toBytes(this.getClass().getSimpleName());</span>
+<span class="source-line-no">2207</span><span id="line-2207">    }</span>
+<span class="source-line-no">2208</span><span id="line-2208"></span>
+<span class="source-line-no">2209</span><span id="line-2209">    byte[] getQualifier() {</span>
+<span class="source-line-no">2210</span><span id="line-2210">      return this.qualifier;</span>
 <span class="source-line-no">2211</span><span id="line-2211">    }</span>
 <span class="source-line-no">2212</span><span id="line-2212"></span>
 <span class="source-line-no">2213</span><span id="line-2213">    @Override</span>
-<span class="source-line-no">2214</span><span id="line-2214">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2215</span><span id="line-2215">      Increment increment = new Increment(format(i));</span>
-<span class="source-line-no">2216</span><span id="line-2216">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
-<span class="source-line-no">2217</span><span id="line-2217">      // if multiple families are specified for an increment test we assume it is</span>
-<span class="source-line-no">2218</span><span id="line-2218">      // meant to raise the work factor</span>
-<span class="source-line-no">2219</span><span id="line-2219">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2220</span><span id="line-2220">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2221</span><span id="line-2221">        increment.addColumn(familyName, getQualifier(), 1l);</span>
-<span class="source-line-no">2222</span><span id="line-2222">      }</span>
-<span class="source-line-no">2223</span><span id="line-2223">      updateValueSize(this.table.increment(increment));</span>
-<span class="source-line-no">2224</span><span id="line-2224">      return true;</span>
-<span class="source-line-no">2225</span><span id="line-2225">    }</span>
-<span class="source-line-no">2226</span><span id="line-2226">  }</span>
-<span class="source-line-no">2227</span><span id="line-2227"></span>
-<span class="source-line-no">2228</span><span id="line-2228">  static class AppendTest extends CASTableTest {</span>
-<span class="source-line-no">2229</span><span id="line-2229">    AppendTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2230</span><span id="line-2230">      super(con, options, status);</span>
-<span class="source-line-no">2231</span><span id="line-2231">    }</span>
-<span class="source-line-no">2232</span><span id="line-2232"></span>
-<span class="source-line-no">2233</span><span id="line-2233">    @Override</span>
-<span class="source-line-no">2234</span><span id="line-2234">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2235</span><span id="line-2235">      byte[] bytes = format(i);</span>
-<span class="source-line-no">2236</span><span id="line-2236">      Append append = new Append(bytes);</span>
-<span class="source-line-no">2237</span><span id="line-2237">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
-<span class="source-line-no">2238</span><span id="line-2238">      // if multiple families are specified for an append test we assume it is</span>
-<span class="source-line-no">2239</span><span id="line-2239">      // meant to raise the work factor</span>
-<span class="source-line-no">2240</span><span id="line-2240">      for (int family = 0; family &lt; opts.families; family++) {</span>
-<span class="source-line-no">2241</span><span id="line-2241">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
-<span class="source-line-no">2242</span><span id="line-2242">        append.addColumn(familyName, getQualifier(), bytes);</span>
-<span class="source-line-no">2243</span><span id="line-2243">      }</span>
-<span class="source-line-no">2244</span><span id="line-2244">      updateValueSize(this.table.append(append));</span>
-<span class="source-line-no">2245</span><span id="line-2245">      return true;</span>
-<span class="source-line-no">2246</span><span id="line-2246">    }</span>
-<span class="source-line-no">2247</span><span id="line-2247">  }</span>
+<span class="source-line-no">2214</span><span id="line-2214">    int getStartRow() {</span>
+<span class="source-line-no">2215</span><span id="line-2215">      return 0;</span>
+<span class="source-line-no">2216</span><span id="line-2216">    }</span>
+<span class="source-line-no">2217</span><span id="line-2217"></span>
+<span class="source-line-no">2218</span><span id="line-2218">    @Override</span>
+<span class="source-line-no">2219</span><span id="line-2219">    int getLastRow() {</span>
+<span class="source-line-no">2220</span><span id="line-2220">      return opts.perClientRunRows;</span>
+<span class="source-line-no">2221</span><span id="line-2221">    }</span>
+<span class="source-line-no">2222</span><span id="line-2222">  }</span>
+<span class="source-line-no">2223</span><span id="line-2223"></span>
+<span class="source-line-no">2224</span><span id="line-2224">  static class IncrementTest extends CASTableTest {</span>
+<span class="source-line-no">2225</span><span id="line-2225">    IncrementTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2226</span><span id="line-2226">      super(con, options, status);</span>
+<span class="source-line-no">2227</span><span id="line-2227">    }</span>
+<span class="source-line-no">2228</span><span id="line-2228"></span>
+<span class="source-line-no">2229</span><span id="line-2229">    @Override</span>
+<span class="source-line-no">2230</span><span id="line-2230">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2231</span><span id="line-2231">      Increment increment = new Increment(format(i));</span>
+<span class="source-line-no">2232</span><span id="line-2232">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
+<span class="source-line-no">2233</span><span id="line-2233">      // if multiple families are specified for an increment test we assume it is</span>
+<span class="source-line-no">2234</span><span id="line-2234">      // meant to raise the work factor</span>
+<span class="source-line-no">2235</span><span id="line-2235">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2236</span><span id="line-2236">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2237</span><span id="line-2237">        increment.addColumn(familyName, getQualifier(), 1l);</span>
+<span class="source-line-no">2238</span><span id="line-2238">      }</span>
+<span class="source-line-no">2239</span><span id="line-2239">      updateValueSize(this.table.increment(increment));</span>
+<span class="source-line-no">2240</span><span id="line-2240">      return true;</span>
+<span class="source-line-no">2241</span><span id="line-2241">    }</span>
+<span class="source-line-no">2242</span><span id="line-2242">  }</span>
+<span class="source-line-no">2243</span><span id="line-2243"></span>
+<span class="source-line-no">2244</span><span id="line-2244">  static class AppendTest extends CASTableTest {</span>
+<span class="source-line-no">2245</span><span id="line-2245">    AppendTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2246</span><span id="line-2246">      super(con, options, status);</span>
+<span class="source-line-no">2247</span><span id="line-2247">    }</span>
 <span class="source-line-no">2248</span><span id="line-2248"></span>
-<span class="source-line-no">2249</span><span id="line-2249">  static class CheckAndMutateTest extends CASTableTest {</span>
-<span class="source-line-no">2250</span><span id="line-2250">    CheckAndMutateTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2251</span><span id="line-2251">      super(con, options, status);</span>
-<span class="source-line-no">2252</span><span id="line-2252">    }</span>
-<span class="source-line-no">2253</span><span id="line-2253"></span>
-<span class="source-line-no">2254</span><span id="line-2254">    @Override</span>
-<span class="source-line-no">2255</span><span id="line-2255">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2256</span><span id="line-2256">      final byte[] bytes = format(i);</span>
-<span class="source-line-no">2257</span><span id="line-2257">      // checkAndXXX tests operate on only a single value</span>
-<span class="source-line-no">2258</span><span id="line-2258">      // Put a known value so when we go to check it, it is there.</span>
-<span class="source-line-no">2259</span><span id="line-2259">      Put put = new Put(bytes);</span>
-<span class="source-line-no">2260</span><span id="line-2260">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
-<span class="source-line-no">2261</span><span id="line-2261">      this.table.put(put);</span>
-<span class="source-line-no">2262</span><span id="line-2262">      RowMutations mutations = new RowMutations(bytes);</span>
-<span class="source-line-no">2263</span><span id="line-2263">      mutations.add(put);</span>
-<span class="source-line-no">2264</span><span id="line-2264">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
-<span class="source-line-no">2265</span><span id="line-2265">        .thenMutate(mutations);</span>
-<span class="source-line-no">2266</span><span id="line-2266">      return true;</span>
-<span class="source-line-no">2267</span><span id="line-2267">    }</span>
-<span class="source-line-no">2268</span><span id="line-2268">  }</span>
+<span class="source-line-no">2249</span><span id="line-2249">    @Override</span>
+<span class="source-line-no">2250</span><span id="line-2250">    boolean testRow(final int i, final long startTime) throws IOException {</span>
+<span class="source-line-no">2251</span><span id="line-2251">      byte[] bytes = format(i);</span>
+<span class="source-line-no">2252</span><span id="line-2252">      Append append = new Append(bytes);</span>
+<span class="source-line-no">2253</span><span id="line-2253">      // unlike checkAndXXX tests, which make most sense to do on a single value,</span>
+<span class="source-line-no">2254</span><span id="line-2254">      // if multiple families are specified for an append test we assume it is</span>
+<span class="source-line-no">2255</span><span id="line-2255">      // meant to raise the work factor</span>
+<span class="source-line-no">2256</span><span id="line-2256">      for (int family = 0; family &lt; opts.families; family++) {</span>
+<span class="source-line-no">2257</span><span id="line-2257">        byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);</span>
+<span class="source-line-no">2258</span><span id="line-2258">        append.addColumn(familyName, getQualifier(), bytes);</span>
+<span class="source-line-no">2259</span><span id="line-2259">      }</span>
+<span class="source-line-no">2260</span><span id="line-2260">      updateValueSize(this.table.append(append));</span>
+<span class="source-line-no">2261</span><span id="line-2261">      return true;</span>
+<span class="source-line-no">2262</span><span id="line-2262">    }</span>
+<span class="source-line-no">2263</span><span id="line-2263">  }</span>
+<span class="source-line-no">2264</span><span id="line-2264"></span>
+<span class="source-line-no">2265</span><span id="line-2265">  static class CheckAndMutateTest extends CASTableTest {</span>
+<span class="source-line-no">2266</span><span id="line-2266">    CheckAndMutateTest(Connection con, TestOptions options, Status status) {</span>
+<span class="source-line-no">2267</span><span id="line-2267">      super(con, options, status);</span>
+<span class="source-line-no">2268</span><span id="line-2268">    }</span>
 <span class="source-line-no">2269</span><span id="line-2269"></span>
-<span class="source-line-no">2270</span><span id="line-2270">  static class CheckAndPutTest extends CASTableTest {</span>
-<span class="source-line-no">2271</span><span id="line-2271">    CheckAndPutTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2272</span><span id="line-2272">      super(con, options, status);</span>
-<span class="source-line-no">2273</span><span id="line-2273">    }</span>
-<span class="source-line-no">2274</span><span id="line-2274"></span>
-<span class="source-line-no">2275</span><span id="line-2275">    @Override</span>
-<span class="source-line-no">2276</span><span id="line-2276">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2277</span><span id="line-2277">      final byte[] bytes = format(i);</span>
-<span class="source-line-no">2278</span><span id="line-2278">      // checkAndXXX tests operate on only a single value</span>
-<span class="source-line-no">2279</span><span id="line-2279">      // Put a known value so when we go to check it, it is there.</span>
-<span class="source-line-no">2280</span><span id="line-2280">      Put put = new Put(bytes);</span>
-<span class="source-line-no">2281</span><span id="line-2281">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
-<span class="source-line-no">2282</span><span id="line-2282">      this.table.put(put);</span>
-<span class="source-line-no">2283</span><span id="line-2283">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
-<span class="source-line-no">2284</span><span id="line-2284">        .thenPut(put);</span>
-<span class="source-line-no">2285</span><span id="line-2285">      return true;</span>
-<span class="source-line-no">2286</span><span id="line-2286">    }</span>
-<span class="source-line-no">2287</span><span id="line-2287">  }</span>
-<span class="source-line-no">2288</span><span id="line-2288"></span>
-<span class="source-line-no">2289</span><span id="line-2289">  static class CheckAndDeleteTest extends CASTableTest {</span>
-<span class="source-line-no">2290</span><span id="line-2290">    CheckAndDeleteTest(Connection con, TestOptions options, Status status) {</span>
-<span class="source-line-no">2291</span><span id="line-2291">      super(con, options, status);</span>
-<span class="source-line-no">2292</span><span id="line-2292">    }</span>
-<span class="source-line-no">2293</span><span id="line-2293"></span>
-<span class="source-line-no">2294</span><span id="line-2294">    @Override</span>
-<span class="source-line-no">2295</span><span id="line-2295">    boolean testRow(final int i, final long startTime) throws IOException {</span>
-<span class="source-line-no">2296</span><span id="line-2296">      final byte[] bytes = format(i);</span>
-<span class="source-line-no">2297</span><span id="line-2297">      // checkAndXXX tests operate on only a single value</span>
-<span class="source-line-no">2298</span><span id="line-2298">      // Put a known value so when we go to check it, it is there.</span>
-<span class="source-line-no">2299</span><span id="line-2299">      Put put = new Put(bytes);</span>
-<span class="source-line-no">2300</span><span id="line-2300">      put.addColumn(FAMILY_ZERO, getQualifier(), bytes);</span>
-<span class="source-line-no">2301</span><span id="line-2301">      this.table.put(put);</span>
-<span class="source-line-no">2302</span><span id="line-2302">      Delete delete = new Delete(put.getRow());</span>
-<span class="source-line-no">2303</span><span id="line-2303">      delete.addColumn(FAMILY_ZERO, getQualifier());</span>
-<span class="source-line-no">2304</span><span id="line-2304">      this.table.checkAndMutate(bytes, FAMILY_ZERO).qualifier(getQualifier()).ifEquals(bytes)</span>
-<span class="source-line-no">2305</span><span id="line-2305">        .thenDelete(delete);</span>
-<span class="source-line-no">2306</span><span id="line-2306">      return true;</span>
-<span class="source-line-no">2307</span><span id="line-2307">    }</span>
... 273840 lines suppressed ...