in src/main/java/org/apache/accumulo/testing/continuous/ContinuousIngest.java [133:174]
public LongSupplier get() {
var splits = splitSupplier.get();
if (splits.size() < maxTablets) {
// There are less tablets so generate within the entire range
return new MinMaxRandomGeneratorFactory(minRow, maxRow, random).get();
} else {
long prev = minRow;
List<LongSupplier> allGenerators = new ArrayList<>(splits.size() + 1);
for (var split : splits) {
// splits are derived from inspecting rfile indexes and rfile indexes can shorten rows
// introducing non-hex chars so need to handle non-hex chars in the splits
// TODO this handling may not be correct, but it will not introduce errors but may cause
// writing a small amount of data to an extra tablet.
byte[] bytes = split.copyBytes();
int len = bytes.length;
int last = bytes.length - 1;
if (bytes[last] < '0') {
len = last;
} else if (bytes[last] > '9' && bytes[last] < 'a') {
bytes[last] = '9';
} else if (bytes[last] > 'f') {
bytes[last] = 'f';
}
var splitStr = new String(bytes, 0, len, UTF_8);
var splitNum = Long.parseLong(splitStr, 16) << (64 - splitStr.length() * 4);
allGenerators.add(new MinMaxRandomGeneratorFactory(prev, splitNum, random).get());
prev = splitNum;
}
allGenerators.add(new MinMaxRandomGeneratorFactory(prev, maxRow, random).get());
Collections.shuffle(allGenerators, random);
var generators = List.copyOf(allGenerators.subList(0, maxTablets));
return () -> {
// pick a generator for random tablet
var generator = generators.get(random.nextInt(generators.size()));
// pick a random long that falls within that tablet
return generator.getAsLong();
};
}
}