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 18 package org.apache.hadoop.hbase.util; 19 20 import java.util.Set; 21 22 /** 23 * A generator of random data (keys/cfs/columns/values) for load testing. 24 * Contains LoadTestKVGenerator as a matter of convenience... 25 */ 26 public abstract class LoadTestDataGenerator { 27 protected final LoadTestKVGenerator kvGenerator; 28 29 /** 30 * Initializes the object. 31 * @param minValueSize minimum size of the value generated by 32 * {@link #generateValue(byte[], byte[], byte[])}. 33 * @param maxValueSize maximum size of the value generated by 34 * {@link #generateValue(byte[], byte[], byte[])}. 35 */ 36 public LoadTestDataGenerator(int minValueSize, int maxValueSize) { 37 this.kvGenerator = new LoadTestKVGenerator(minValueSize, maxValueSize); 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 }