public LongSupplier get()

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();
        };
      }
    }