1 /* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with this 4 * work for additional information regarding copyright ownership. The ASF 5 * licenses this file to you under the Apache License, Version 2.0 (the 6 * "License"); you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 14 * License for the specific language governing permissions and limitations 15 * under the License. 16 */ 17 package org.apache.hadoop.hbase.util.test; 18 19 import java.util.Set; 20 21 /** 22 * A generator of random data (keys/cfs/columns/values) for load testing. 23 * Contains LoadTestKVGenerator as a matter of convenience... 24 */ 25 public abstract class LoadTestDataGenerator { 26 protected final LoadTestKVGenerator kvGenerator; 27 28 /** 29 * Initializes the object. 30 * @param minValueSize minimum size of the value generated by 31 * {@link #generateValue(byte[], byte[], byte[])}. 32 * @param maxValueSize maximum size of the value generated by 33 * {@link #generateValue(byte[], byte[], byte[])}. 34 */ 35 public LoadTestDataGenerator(int minValueSize, int maxValueSize) { 36 this.kvGenerator = new LoadTestKVGenerator(minValueSize, maxValueSize); 37 } 38 39 /** 40 * Generates a deterministic, unique hashed row key from a number. That way, the user can 41 * keep track of numbers, without messing with byte array and ensuring key distribution. 42 * @param keyBase Base number for a key, such as a loop counter. 43 */ 44 public abstract byte[] getDeterministicUniqueKey(long keyBase); 45 46 /** 47 * Gets column families for the load test table. 48 * @return The array of byte[]s representing column family names. 49 */ 50 public abstract byte[][] getColumnFamilies(); 51 52 /** 53 * Generates an applicable set of columns to be used for a particular key and family. 54 * @param rowKey The row key to generate for. 55 * @param cf The column family name to generate for. 56 * @return The array of byte[]s representing column names. 57 */ 58 public abstract byte[][] generateColumnsForCf(byte[] rowKey, byte[] cf); 59 60 /** 61 * Generates a value to be used for a particular row/cf/column. 62 * @param rowKey The row key to generate for. 63 * @param cf The column family name to generate for. 64 * @param column The column name to generate for. 65 * @return The value to use. 66 */ 67 public abstract byte[] generateValue(byte[] rowKey, byte[] cf, byte[] column); 68 69 /** 70 * Checks that columns for a rowKey and cf are valid if generated via 71 * {@link #generateColumnsForCf(byte[], byte[])} 72 * @param rowKey The row key to verify for. 73 * @param cf The column family name to verify for. 74 * @param columnSet The column set (for example, encountered by read). 75 * @return True iff valid. 76 */ 77 public abstract boolean verify(byte[] rowKey, byte[] cf, Set<byte[]> columnSet); 78 79 /** 80 * Checks that value for a rowKey/cf/column is valid if generated via 81 * {@link #generateValue(byte[], byte[], byte[])} 82 * @param rowKey The row key to verify for. 83 * @param cf The column family name to verify for. 84 * @param column The column name to verify for. 85 * @param value The value (for example, encountered by read). 86 * @return True iff valid. 87 */ 88 public abstract boolean verify(byte[] rowKey, byte[] cf, byte[] column, byte[] value); 89 }