| <!DOCTYPE HTML> |
| <html lang="en"> |
| <head> |
| <!-- Generated by javadoc (17) --> |
| <title>Source code</title> |
| <meta name="viewport" content="width=device-width, initial-scale=1"> |
| <meta name="description" content="source: package: org.apache.hadoop.hbase, class: PerformanceEvaluation, class: RandomScanWithRange100Test"> |
| <meta name="generator" content="javadoc/SourceToHTMLConverter"> |
| <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style"> |
| </head> |
| <body class="source-page"> |
| <main role="main"> |
| <div class="source-container"> |
| <pre><span class="source-line-no">001</span><span id="line-1">/*</span> |
| <span class="source-line-no">002</span><span id="line-2"> * Licensed to the Apache Software Foundation (ASF) under one</span> |
| <span class="source-line-no">003</span><span id="line-3"> * or more contributor license agreements. See the NOTICE file</span> |
| <span class="source-line-no">004</span><span id="line-4"> * distributed with this work for additional information</span> |
| <span class="source-line-no">005</span><span id="line-5"> * regarding copyright ownership. The ASF licenses this file</span> |
| <span class="source-line-no">006</span><span id="line-6"> * to you under the Apache License, Version 2.0 (the</span> |
| <span class="source-line-no">007</span><span id="line-7"> * "License"); you may not use this file except in compliance</span> |
| <span class="source-line-no">008</span><span id="line-8"> * with the License. You may obtain a copy of the License at</span> |
| <span class="source-line-no">009</span><span id="line-9"> *</span> |
| <span class="source-line-no">010</span><span id="line-10"> * http://www.apache.org/licenses/LICENSE-2.0</span> |
| <span class="source-line-no">011</span><span id="line-11"> *</span> |
| <span class="source-line-no">012</span><span id="line-12"> * Unless required by applicable law or agreed to in writing, software</span> |
| <span class="source-line-no">013</span><span id="line-13"> * distributed under the License is distributed on an "AS IS" BASIS,</span> |
| <span class="source-line-no">014</span><span id="line-14"> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.</span> |
| <span class="source-line-no">015</span><span id="line-15"> * See the License for the specific language governing permissions and</span> |
| <span class="source-line-no">016</span><span id="line-16"> * limitations under the License.</span> |
| <span class="source-line-no">017</span><span id="line-17"> */</span> |
| <span class="source-line-no">018</span><span id="line-18">package org.apache.hadoop.hbase;</span> |
| <span class="source-line-no">019</span><span id="line-19"></span> |
| <span class="source-line-no">020</span><span id="line-20">import com.codahale.metrics.Histogram;</span> |
| <span class="source-line-no">021</span><span id="line-21">import com.codahale.metrics.UniformReservoir;</span> |
| <span class="source-line-no">022</span><span id="line-22">import io.opentelemetry.api.trace.Span;</span> |
| <span class="source-line-no">023</span><span id="line-23">import io.opentelemetry.context.Scope;</span> |
| <span class="source-line-no">024</span><span id="line-24">import java.io.IOException;</span> |
| <span class="source-line-no">025</span><span id="line-25">import java.io.PrintStream;</span> |
| <span class="source-line-no">026</span><span id="line-26">import java.lang.reflect.Constructor;</span> |
| <span class="source-line-no">027</span><span id="line-27">import java.math.BigDecimal;</span> |
| <span class="source-line-no">028</span><span id="line-28">import java.math.MathContext;</span> |
| <span class="source-line-no">029</span><span id="line-29">import java.text.DecimalFormat;</span> |
| <span class="source-line-no">030</span><span id="line-30">import java.text.SimpleDateFormat;</span> |
| <span class="source-line-no">031</span><span id="line-31">import java.util.ArrayList;</span> |
| <span class="source-line-no">032</span><span id="line-32">import java.util.Arrays;</span> |
| <span class="source-line-no">033</span><span id="line-33">import java.util.Date;</span> |
| <span class="source-line-no">034</span><span id="line-34">import java.util.LinkedList;</span> |
| <span class="source-line-no">035</span><span id="line-35">import java.util.List;</span> |
| <span class="source-line-no">036</span><span id="line-36">import java.util.Locale;</span> |
| <span class="source-line-no">037</span><span id="line-37">import java.util.Map;</span> |
| <span class="source-line-no">038</span><span id="line-38">import java.util.NoSuchElementException;</span> |
| <span class="source-line-no">039</span><span id="line-39">import java.util.Properties;</span> |
| <span class="source-line-no">040</span><span id="line-40">import java.util.Queue;</span> |
| <span class="source-line-no">041</span><span id="line-41">import java.util.Random;</span> |
| <span class="source-line-no">042</span><span id="line-42">import java.util.TreeMap;</span> |
| <span class="source-line-no">043</span><span id="line-43">import java.util.concurrent.Callable;</span> |
| <span class="source-line-no">044</span><span id="line-44">import java.util.concurrent.ExecutionException;</span> |
| <span class="source-line-no">045</span><span id="line-45">import java.util.concurrent.ExecutorService;</span> |
| <span class="source-line-no">046</span><span id="line-46">import java.util.concurrent.Executors;</span> |
| <span class="source-line-no">047</span><span id="line-47">import java.util.concurrent.Future;</span> |
| <span class="source-line-no">048</span><span id="line-48">import java.util.concurrent.ThreadLocalRandom;</span> |
| <span class="source-line-no">049</span><span id="line-49">import org.apache.commons.lang3.StringUtils;</span> |
| <span class="source-line-no">050</span><span id="line-50">import org.apache.hadoop.conf.Configuration;</span> |
| <span class="source-line-no">051</span><span id="line-51">import org.apache.hadoop.conf.Configured;</span> |
| <span class="source-line-no">052</span><span id="line-52">import org.apache.hadoop.fs.FileSystem;</span> |
| <span class="source-line-no">053</span><span id="line-53">import org.apache.hadoop.fs.Path;</span> |
| <span class="source-line-no">054</span><span id="line-54">import org.apache.hadoop.hbase.client.Admin;</span> |
| <span class="source-line-no">055</span><span id="line-55">import org.apache.hadoop.hbase.client.Append;</span> |
| <span class="source-line-no">056</span><span id="line-56">import org.apache.hadoop.hbase.client.AsyncConnection;</span> |
| <span class="source-line-no">057</span><span id="line-57">import org.apache.hadoop.hbase.client.AsyncTable;</span> |
| <span class="source-line-no">058</span><span id="line-58">import org.apache.hadoop.hbase.client.BufferedMutator;</span> |
| <span class="source-line-no">059</span><span id="line-59">import org.apache.hadoop.hbase.client.BufferedMutatorParams;</span> |
| <span class="source-line-no">060</span><span id="line-60">import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;</span> |
| <span class="source-line-no">061</span><span id="line-61">import org.apache.hadoop.hbase.client.Connection;</span> |
| <span class="source-line-no">062</span><span id="line-62">import org.apache.hadoop.hbase.client.ConnectionFactory;</span> |
| <span class="source-line-no">063</span><span id="line-63">import org.apache.hadoop.hbase.client.Consistency;</span> |
| <span class="source-line-no">064</span><span id="line-64">import org.apache.hadoop.hbase.client.Delete;</span> |
| <span class="source-line-no">065</span><span id="line-65">import org.apache.hadoop.hbase.client.Durability;</span> |
| <span class="source-line-no">066</span><span id="line-66">import org.apache.hadoop.hbase.client.Get;</span> |
| <span class="source-line-no">067</span><span id="line-67">import org.apache.hadoop.hbase.client.Increment;</span> |
| <span class="source-line-no">068</span><span id="line-68">import org.apache.hadoop.hbase.client.Put;</span> |
| <span class="source-line-no">069</span><span id="line-69">import org.apache.hadoop.hbase.client.RegionInfo;</span> |
| <span class="source-line-no">070</span><span id="line-70">import org.apache.hadoop.hbase.client.RegionInfoBuilder;</span> |
| <span class="source-line-no">071</span><span id="line-71">import org.apache.hadoop.hbase.client.RegionLocator;</span> |
| <span class="source-line-no">072</span><span id="line-72">import org.apache.hadoop.hbase.client.Result;</span> |
| <span class="source-line-no">073</span><span id="line-73">import org.apache.hadoop.hbase.client.ResultScanner;</span> |
| <span class="source-line-no">074</span><span id="line-74">import org.apache.hadoop.hbase.client.RowMutations;</span> |
| <span class="source-line-no">075</span><span id="line-75">import org.apache.hadoop.hbase.client.Scan;</span> |
| <span class="source-line-no">076</span><span id="line-76">import org.apache.hadoop.hbase.client.Table;</span> |
| <span class="source-line-no">077</span><span id="line-77">import org.apache.hadoop.hbase.client.TableDescriptor;</span> |
| <span class="source-line-no">078</span><span id="line-78">import org.apache.hadoop.hbase.client.TableDescriptorBuilder;</span> |
| <span class="source-line-no">079</span><span id="line-79">import org.apache.hadoop.hbase.client.metrics.ScanMetrics;</span> |
| <span class="source-line-no">080</span><span id="line-80">import org.apache.hadoop.hbase.filter.BinaryComparator;</span> |
| <span class="source-line-no">081</span><span id="line-81">import org.apache.hadoop.hbase.filter.Filter;</span> |
| <span class="source-line-no">082</span><span id="line-82">import org.apache.hadoop.hbase.filter.FilterAllFilter;</span> |
| <span class="source-line-no">083</span><span id="line-83">import org.apache.hadoop.hbase.filter.FilterList;</span> |
| <span class="source-line-no">084</span><span id="line-84">import org.apache.hadoop.hbase.filter.PageFilter;</span> |
| <span class="source-line-no">085</span><span id="line-85">import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;</span> |
| <span class="source-line-no">086</span><span id="line-86">import org.apache.hadoop.hbase.filter.WhileMatchFilter;</span> |
| <span class="source-line-no">087</span><span id="line-87">import org.apache.hadoop.hbase.io.compress.Compression;</span> |
| <span class="source-line-no">088</span><span id="line-88">import org.apache.hadoop.hbase.io.encoding.DataBlockEncoding;</span> |
| <span class="source-line-no">089</span><span id="line-89">import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil;</span> |
| <span class="source-line-no">090</span><span id="line-90">import org.apache.hadoop.hbase.regionserver.BloomType;</span> |
| <span class="source-line-no">091</span><span id="line-91">import org.apache.hadoop.hbase.regionserver.CompactingMemStore;</span> |
| <span class="source-line-no">092</span><span id="line-92">import org.apache.hadoop.hbase.trace.TraceUtil;</span> |
| <span class="source-line-no">093</span><span id="line-93">import org.apache.hadoop.hbase.util.ByteArrayHashKey;</span> |
| <span class="source-line-no">094</span><span id="line-94">import org.apache.hadoop.hbase.util.Bytes;</span> |
| <span class="source-line-no">095</span><span id="line-95">import org.apache.hadoop.hbase.util.EnvironmentEdgeManager;</span> |
| <span class="source-line-no">096</span><span id="line-96">import org.apache.hadoop.hbase.util.GsonUtil;</span> |
| <span class="source-line-no">097</span><span id="line-97">import org.apache.hadoop.hbase.util.Hash;</span> |
| <span class="source-line-no">098</span><span id="line-98">import org.apache.hadoop.hbase.util.MurmurHash;</span> |
| <span class="source-line-no">099</span><span id="line-99">import org.apache.hadoop.hbase.util.Pair;</span> |
| <span class="source-line-no">100</span><span id="line-100">import org.apache.hadoop.hbase.util.RandomDistribution;</span> |
| <span class="source-line-no">101</span><span id="line-101">import org.apache.hadoop.hbase.util.YammerHistogramUtils;</span> |
| <span class="source-line-no">102</span><span id="line-102">import org.apache.hadoop.io.LongWritable;</span> |
| <span class="source-line-no">103</span><span id="line-103">import org.apache.hadoop.io.Text;</span> |
| <span class="source-line-no">104</span><span id="line-104">import org.apache.hadoop.mapreduce.Job;</span> |
| <span class="source-line-no">105</span><span id="line-105">import org.apache.hadoop.mapreduce.Mapper;</span> |
| <span class="source-line-no">106</span><span id="line-106">import org.apache.hadoop.mapreduce.lib.input.NLineInputFormat;</span> |
| <span class="source-line-no">107</span><span id="line-107">import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;</span> |
| <span class="source-line-no">108</span><span id="line-108">import org.apache.hadoop.mapreduce.lib.reduce.LongSumReducer;</span> |
| <span class="source-line-no">109</span><span id="line-109">import org.apache.hadoop.util.Tool;</span> |
| <span class="source-line-no">110</span><span id="line-110">import org.apache.hadoop.util.ToolRunner;</span> |
| <span class="source-line-no">111</span><span id="line-111">import org.apache.yetus.audience.InterfaceAudience;</span> |
| <span class="source-line-no">112</span><span id="line-112">import org.slf4j.Logger;</span> |
| <span class="source-line-no">113</span><span id="line-113">import org.slf4j.LoggerFactory;</span> |
| <span class="source-line-no">114</span><span id="line-114"></span> |
| <span class="source-line-no">115</span><span id="line-115">import org.apache.hbase.thirdparty.com.google.common.base.MoreObjects;</span> |
| <span class="source-line-no">116</span><span id="line-116">import org.apache.hbase.thirdparty.com.google.common.util.concurrent.ThreadFactoryBuilder;</span> |
| <span class="source-line-no">117</span><span id="line-117">import org.apache.hbase.thirdparty.com.google.gson.Gson;</span> |
| <span class="source-line-no">118</span><span id="line-118"></span> |
| <span class="source-line-no">119</span><span id="line-119">/**</span> |
| <span class="source-line-no">120</span><span id="line-120"> * Script used evaluating HBase performance and scalability. Runs a HBase client that steps through</span> |
| <span class="source-line-no">121</span><span id="line-121"> * one of a set of hardcoded tests or 'experiments' (e.g. a random reads test, a random writes test,</span> |
| <span class="source-line-no">122</span><span id="line-122"> * etc.). Pass on the command-line which test to run and how many clients are participating in this</span> |
| <span class="source-line-no">123</span><span id="line-123"> * experiment. Run {@code PerformanceEvaluation --help} to obtain usage.</span> |
| <span class="source-line-no">124</span><span id="line-124"> * <p></span> |
| <span class="source-line-no">125</span><span id="line-125"> * This class sets up and runs the evaluation programs described in Section 7, <i>Performance</span> |
| <span class="source-line-no">126</span><span id="line-126"> * Evaluation</i>, of the <a href="http://labs.google.com/papers/bigtable.html">Bigtable</a> paper,</span> |
| <span class="source-line-no">127</span><span id="line-127"> * pages 8-10.</span> |
| <span class="source-line-no">128</span><span id="line-128"> * <p></span> |
| <span class="source-line-no">129</span><span id="line-129"> * By default, runs as a mapreduce job where each mapper runs a single test client. Can also run as</span> |
| <span class="source-line-no">130</span><span id="line-130"> * a non-mapreduce, multithreaded application by specifying {@code --nomapred}. Each client does</span> |
| <span class="source-line-no">131</span><span id="line-131"> * about 1GB of data, unless specified otherwise.</span> |
| <span class="source-line-no">132</span><span id="line-132"> */</span> |
| <span class="source-line-no">133</span><span id="line-133">@InterfaceAudience.LimitedPrivate(HBaseInterfaceAudience.TOOLS)</span> |
| <span class="source-line-no">134</span><span id="line-134">public class PerformanceEvaluation extends Configured implements Tool {</span> |
| <span class="source-line-no">135</span><span id="line-135"> static final String RANDOM_SEEK_SCAN = "randomSeekScan";</span> |
| <span class="source-line-no">136</span><span id="line-136"> static final String RANDOM_READ = "randomRead";</span> |
| <span class="source-line-no">137</span><span id="line-137"> static final String PE_COMMAND_SHORTNAME = "pe";</span> |
| <span class="source-line-no">138</span><span id="line-138"> private static final Logger LOG = LoggerFactory.getLogger(PerformanceEvaluation.class.getName());</span> |
| <span class="source-line-no">139</span><span id="line-139"> private static final Gson GSON = GsonUtil.createGson().create();</span> |
| <span class="source-line-no">140</span><span id="line-140"></span> |
| <span class="source-line-no">141</span><span id="line-141"> public static final String TABLE_NAME = "TestTable";</span> |
| <span class="source-line-no">142</span><span id="line-142"> public static final String FAMILY_NAME_BASE = "info";</span> |
| <span class="source-line-no">143</span><span id="line-143"> public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");</span> |
| <span class="source-line-no">144</span><span id="line-144"> public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);</span> |
| <span class="source-line-no">145</span><span id="line-145"> public static final int DEFAULT_VALUE_LENGTH = 1000;</span> |
| <span class="source-line-no">146</span><span id="line-146"> public static final int ROW_LENGTH = 26;</span> |
| <span class="source-line-no">147</span><span id="line-147"></span> |
| <span class="source-line-no">148</span><span id="line-148"> private static final int ONE_GB = 1024 * 1024 * 1000;</span> |
| <span class="source-line-no">149</span><span id="line-149"> private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;</span> |
| <span class="source-line-no">150</span><span id="line-150"> // TODO : should we make this configurable</span> |
| <span class="source-line-no">151</span><span id="line-151"> private static final int TAG_LENGTH = 256;</span> |
| <span class="source-line-no">152</span><span id="line-152"> private static final DecimalFormat FMT = new DecimalFormat("0.##");</span> |
| <span class="source-line-no">153</span><span id="line-153"> private static final MathContext CXT = MathContext.DECIMAL64;</span> |
| <span class="source-line-no">154</span><span id="line-154"> private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);</span> |
| <span class="source-line-no">155</span><span id="line-155"> private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);</span> |
| <span class="source-line-no">156</span><span id="line-156"> private static final TestOptions DEFAULT_OPTS = new TestOptions();</span> |
| <span class="source-line-no">157</span><span id="line-157"></span> |
| <span class="source-line-no">158</span><span id="line-158"> private static Map<String, CmdDescriptor> COMMANDS = new TreeMap<>();</span> |
| <span class="source-line-no">159</span><span id="line-159"> private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");</span> |
| <span class="source-line-no">160</span><span id="line-160"></span> |
| <span class="source-line-no">161</span><span id="line-161"> static {</span> |
| <span class="source-line-no">162</span><span id="line-162"> addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",</span> |
| <span class="source-line-no">163</span><span id="line-163"> "Run async random read test");</span> |
| <span class="source-line-no">164</span><span id="line-164"> addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",</span> |
| <span class="source-line-no">165</span><span id="line-165"> "Run async random write test");</span> |
| <span class="source-line-no">166</span><span id="line-166"> addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",</span> |
| <span class="source-line-no">167</span><span id="line-167"> "Run async sequential read test");</span> |
| <span class="source-line-no">168</span><span id="line-168"> addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",</span> |
| <span class="source-line-no">169</span><span id="line-169"> "Run async sequential write test");</span> |
| <span class="source-line-no">170</span><span id="line-170"> addCommandDescriptor(AsyncScanTest.class, "asyncScan", "Run async scan test (read every row)");</span> |
| <span class="source-line-no">171</span><span id="line-171"> addCommandDescriptor(RandomReadTest.class, RANDOM_READ, "Run random read test");</span> |
| <span class="source-line-no">172</span><span id="line-172"> addCommandDescriptor(MetaRandomReadTest.class, "metaRandomRead", "Run getRegionLocation test");</span> |
| <span class="source-line-no">173</span><span id="line-173"> addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,</span> |
| <span class="source-line-no">174</span><span id="line-174"> "Run random seek and scan 100 test");</span> |
| <span class="source-line-no">175</span><span id="line-175"> addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",</span> |
| <span class="source-line-no">176</span><span id="line-176"> "Run random seek scan with both start and stop row (max 10 rows)");</span> |
| <span class="source-line-no">177</span><span id="line-177"> addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",</span> |
| <span class="source-line-no">178</span><span id="line-178"> "Run random seek scan with both start and stop row (max 100 rows)");</span> |
| <span class="source-line-no">179</span><span id="line-179"> addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",</span> |
| <span class="source-line-no">180</span><span id="line-180"> "Run random seek scan with both start and stop row (max 1000 rows)");</span> |
| <span class="source-line-no">181</span><span id="line-181"> addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",</span> |
| <span class="source-line-no">182</span><span id="line-182"> "Run random seek scan with both start and stop row (max 10000 rows)");</span> |
| <span class="source-line-no">183</span><span id="line-183"> addCommandDescriptor(RandomWriteTest.class, "randomWrite", "Run random write test");</span> |
| <span class="source-line-no">184</span><span id="line-184"> addCommandDescriptor(RandomDeleteTest.class, "randomDelete", "Run random delete test");</span> |
| <span class="source-line-no">185</span><span id="line-185"> addCommandDescriptor(SequentialReadTest.class, "sequentialRead", "Run sequential read test");</span> |
| <span class="source-line-no">186</span><span id="line-186"> addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite", "Run sequential write test");</span> |
| <span class="source-line-no">187</span><span id="line-187"> addCommandDescriptor(SequentialDeleteTest.class, "sequentialDelete",</span> |
| <span class="source-line-no">188</span><span id="line-188"> "Run sequential delete test");</span> |
| <span class="source-line-no">189</span><span id="line-189"> addCommandDescriptor(MetaWriteTest.class, "metaWrite",</span> |
| <span class="source-line-no">190</span><span id="line-190"> "Populate meta table;used with 1 thread; to be cleaned up by cleanMeta");</span> |
| <span class="source-line-no">191</span><span id="line-191"> addCommandDescriptor(ScanTest.class, "scan", "Run scan test (read every row)");</span> |
| <span class="source-line-no">192</span><span id="line-192"> addCommandDescriptor(ReverseScanTest.class, "reverseScan",</span> |
| <span class="source-line-no">193</span><span id="line-193"> "Run reverse scan test (read every row)");</span> |
| <span class="source-line-no">194</span><span id="line-194"> addCommandDescriptor(FilteredScanTest.class, "filterScan",</span> |
| <span class="source-line-no">195</span><span id="line-195"> "Run scan test using a filter to find a specific row based on it's value "</span> |
| <span class="source-line-no">196</span><span id="line-196"> + "(make sure to use --rows=20)");</span> |
| <span class="source-line-no">197</span><span id="line-197"> addCommandDescriptor(IncrementTest.class, "increment",</span> |
| <span class="source-line-no">198</span><span id="line-198"> "Increment on each row; clients overlap on keyspace so some concurrent operations");</span> |
| <span class="source-line-no">199</span><span id="line-199"> addCommandDescriptor(AppendTest.class, "append",</span> |
| <span class="source-line-no">200</span><span id="line-200"> "Append on each row; clients overlap on keyspace so some concurrent operations");</span> |
| <span class="source-line-no">201</span><span id="line-201"> addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",</span> |
| <span class="source-line-no">202</span><span id="line-202"> "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");</span> |
| <span class="source-line-no">203</span><span id="line-203"> addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",</span> |
| <span class="source-line-no">204</span><span id="line-204"> "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");</span> |
| <span class="source-line-no">205</span><span id="line-205"> addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",</span> |
| <span class="source-line-no">206</span><span id="line-206"> "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");</span> |
| <span class="source-line-no">207</span><span id="line-207"> addCommandDescriptor(CleanMetaTest.class, "cleanMeta",</span> |
| <span class="source-line-no">208</span><span id="line-208"> "Remove fake region entries on meta table inserted by metaWrite; used with 1 thread");</span> |
| <span class="source-line-no">209</span><span id="line-209"> }</span> |
| <span class="source-line-no">210</span><span id="line-210"></span> |
| <span class="source-line-no">211</span><span id="line-211"> /**</span> |
| <span class="source-line-no">212</span><span id="line-212"> * Enum for map metrics. Keep it out here rather than inside in the Map inner-class so we can find</span> |
| <span class="source-line-no">213</span><span id="line-213"> * associated properties.</span> |
| <span class="source-line-no">214</span><span id="line-214"> */</span> |
| <span class="source-line-no">215</span><span id="line-215"> protected static enum Counter {</span> |
| <span class="source-line-no">216</span><span id="line-216"> /** elapsed time */</span> |
| <span class="source-line-no">217</span><span id="line-217"> ELAPSED_TIME,</span> |
| <span class="source-line-no">218</span><span id="line-218"> /** number of rows */</span> |
| <span class="source-line-no">219</span><span id="line-219"> ROWS</span> |
| <span class="source-line-no">220</span><span id="line-220"> }</span> |
| <span class="source-line-no">221</span><span id="line-221"></span> |
| <span class="source-line-no">222</span><span id="line-222"> protected static class RunResult implements Comparable<RunResult> {</span> |
| <span class="source-line-no">223</span><span id="line-223"> public RunResult(long duration, Histogram hist) {</span> |
| <span class="source-line-no">224</span><span id="line-224"> this.duration = duration;</span> |
| <span class="source-line-no">225</span><span id="line-225"> this.hist = hist;</span> |
| <span class="source-line-no">226</span><span id="line-226"> numbOfReplyOverThreshold = 0;</span> |
| <span class="source-line-no">227</span><span id="line-227"> numOfReplyFromReplica = 0;</span> |
| <span class="source-line-no">228</span><span id="line-228"> }</span> |
| <span class="source-line-no">229</span><span id="line-229"></span> |
| <span class="source-line-no">230</span><span id="line-230"> public RunResult(long duration, long numbOfReplyOverThreshold, long numOfReplyFromReplica,</span> |
| <span class="source-line-no">231</span><span id="line-231"> Histogram hist) {</span> |
| <span class="source-line-no">232</span><span id="line-232"> this.duration = duration;</span> |
| <span class="source-line-no">233</span><span id="line-233"> this.hist = hist;</span> |
| <span class="source-line-no">234</span><span id="line-234"> this.numbOfReplyOverThreshold = numbOfReplyOverThreshold;</span> |
| <span class="source-line-no">235</span><span id="line-235"> this.numOfReplyFromReplica = numOfReplyFromReplica;</span> |
| <span class="source-line-no">236</span><span id="line-236"> }</span> |
| <span class="source-line-no">237</span><span id="line-237"></span> |
| <span class="source-line-no">238</span><span id="line-238"> public final long duration;</span> |
| <span class="source-line-no">239</span><span id="line-239"> public final Histogram hist;</span> |
| <span class="source-line-no">240</span><span id="line-240"> public final long numbOfReplyOverThreshold;</span> |
| <span class="source-line-no">241</span><span id="line-241"> public final long numOfReplyFromReplica;</span> |
| <span class="source-line-no">242</span><span id="line-242"></span> |
| <span class="source-line-no">243</span><span id="line-243"> @Override</span> |
| <span class="source-line-no">244</span><span id="line-244"> public String toString() {</span> |
| <span class="source-line-no">245</span><span id="line-245"> return Long.toString(duration);</span> |
| <span class="source-line-no">246</span><span id="line-246"> }</span> |
| <span class="source-line-no">247</span><span id="line-247"></span> |
| <span class="source-line-no">248</span><span id="line-248"> @Override</span> |
| <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<? extends TestBase> 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<LongWritable, Text, LongWritable, LongWritable> {</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<? extends Test> 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<? extends PerformanceEvaluation> 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 <Type> Class<? extends Type> forName(String className, Class<Type> 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 && (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 && opts.presplitRegions != DEFAULT_OPTS.presplitRegions</span> |
| <span class="source-line-no">371</span><span id="line-371"> && opts.presplitRegions != admin.getRegions(tableName).size())</span> |
| <span class="source-line-no">372</span><span id="line-372"> || (!isReadCmd && desc != null</span> |
| <span class="source-line-no">373</span><span id="line-373"> && !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))</span> |
| <span class="source-line-no">374</span><span id="line-374"> || (!(isReadCmd || isDeleteCmd) && desc != null</span> |
| <span class="source-line-no">375</span><span id="line-375"> && desc.getRegionReplication() != opts.replicas)</span> |
| <span class="source-line-no">376</span><span id="line-376"> || (desc != null && 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 < 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 < 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 && !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 < 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">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">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<? extends TestBase> 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<RunResult>[] 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 < 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 < 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<RunResult>() {</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 > 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 < 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 > 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 < 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<? extends TestBase> 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">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">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">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<Integer, String> m = new TreeMap<>();</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 < 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<Integer, String> 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<? extends TestBase> 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<? extends TestBase> 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">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<? extends TestBase> 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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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">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<String, Long> 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 && bytesInResults.longValue() > 0) {</span> |
| <span class="source-line-no">1265</span><span id="line-1265"> this.bytesInResultsHistogram.update(bytesInResults.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 && bytesInRemoteResults.longValue() > 0) {</span> |
| <span class="source-line-no">1269</span><span id="line-1269"> this.bytesInRemoteResultsHistogram.update(bytesInRemoteResults.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 > 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 > 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() > 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() > 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() > 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() > 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() > 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">1356</span><span id="line-1356"> }</span> |
| <span class="source-line-no">1357</span><span id="line-1357"> if (bytesInResultsHistogram.getCount() > 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">1360</span><span id="line-1360"> }</span> |
| <span class="source-line-no">1361</span><span id="line-1361"> if (bytesInRemoteResultsHistogram.getCount() > 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">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">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 < opts.cycles; ii++) {</span> |
| <span class="source-line-no">1402</span><span id="line-1402"> if (opts.cycles > 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 < 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) > 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 > 0) && (latency / 1000 >= 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 && i > 0 && (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">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">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">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<?> 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">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<Get> 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 > 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<>(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 > 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 < 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 < 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 > 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 -> 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 <V> V propagate(Callable<V> 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">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 && this.gets.size() > 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">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">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<?> asyncTable;</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 < 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 < 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 < 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 < 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<Put> 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 > 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<>(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">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 < 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 < 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 < 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 > 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 -> 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">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 < 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 < 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<byte[], byte[]> 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 < 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 < 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<byte[], byte[]> 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<byte[], byte[]> 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<>(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<byte[], byte[]> 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">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<byte[], byte[]> getStartAndStopRow() {</span> |
| <span class="source-line-no">1924</span><span id="line-1924"> return generateStartAndStopRows(100);</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">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<byte[], byte[]> getStartAndStopRow() {</span> |
| <span class="source-line-no">1935</span><span id="line-1935"> return generateStartAndStopRows(1000);</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">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<byte[], byte[]> getStartAndStopRow() {</span> |
| <span class="source-line-no">1946</span><span id="line-1946"> return generateStartAndStopRows(10000);</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<Get> 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 > 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<>(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 > 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 < 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 < 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 > 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 > 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 > 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 && this.gets.size() > 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">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">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 > 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">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 < 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 < 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">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 < 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 < 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"> * <p></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">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">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 < 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 < 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">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">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">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 < 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 < 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<Put> 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 > 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<>(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">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 < 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 < 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 < 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 > 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">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 < 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<RegionInfo> regionInfos = new ArrayList<RegionInfo>();</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">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 < 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 >= 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 < (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 < 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<? extends TestBase> 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<? extends AsyncTest> newCmd = (Class<? extends AsyncTest>) cmd;</span> |
| <span class="source-line-no">2609</span><span id="line-2609"> Constructor<? extends AsyncTest> 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<? extends Test> newCmd = (Class<? extends Test>) cmd;</span> |
| <span class="source-line-no">2614</span><span id="line-2614"> Constructor<? extends Test> 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<? extends TestBase> 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 && message.length() > 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(" <OPTIONS> [-D<property=value>]* <command|class> <nclients>");</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">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 <= value <= 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<String> 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 <= 1.0f) throw new IllegalStateException("Size must be > 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">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 && opts.multiPut > 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 && opts.connCount > 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">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 && 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"> && (opts.getCmdName().equals(RANDOM_READ) || opts.getCmdName().equals(RANDOM_SEEK_SCAN)))</span> |
| <span class="source-line-no">3145</span><span id="line-3145"> && opts.size != DEFAULT_OPTS.size && 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 < 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">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<String> argv = new LinkedList<>();</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 <= 0) {</span> |
| <span class="source-line-no">3188</span><span id="line-3188"> throw new IllegalArgumentException("Number of clients must be > 0");</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<? extends TestBase> 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">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">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<? extends Test> 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<? extends Test>) 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">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<? extends TestBase> 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> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| </pre> |
| </div> |
| </main> |
| </body> |
| </html> |