public void visit()

in src/main/java/org/apache/accumulo/testing/randomwalk/sequential/BatchVerify.java [42:126]


  public void visit(State state, RandWalkEnv env, Properties props) throws Exception {

    long numWrites = state.getLong("numWrites");
    int maxVerify = Integer.parseInt(props.getProperty("maxVerify", "2000"));
    long numVerify = env.getRandom().nextInt(maxVerify - 1) + 1;

    if (numVerify > (numWrites / 4)) {
      numVerify = numWrites / 4;
    }

    AccumuloClient client = env.getAccumuloClient();

    try (BatchScanner scanner =
        client.createBatchScanner(state.getString("seqTableName"), new Authorizations(), 2)) {
      int count = 0;
      List<Range> ranges = new ArrayList<>();
      while (count < numVerify) {
        long rangeStart = env.getRandom().nextInt((int) numWrites);
        long rangeEnd = rangeStart + 99;
        if (rangeEnd > (numWrites - 1)) {
          rangeEnd = numWrites - 1;
        }
        count += rangeEnd - rangeStart + 1;
        ranges.add(new Range(new Text(String.format("%010d", rangeStart)),
            new Text(String.format("%010d", rangeEnd))));
      }

      ranges = Range.mergeOverlapping(ranges);
      if (ranges.size() > 1) {
        Collections.sort(ranges);
      }

      if (count == 0 || ranges.size() == 0)
        return;

      log.debug(
          String.format("scanning %d rows in the following %d ranges:", count, ranges.size()));
      for (Range r : ranges) {
        log.debug(r.toString());
      }

      scanner.setRanges(ranges);

      List<Key> keys = scanner.stream().map(Entry::getKey).sorted().collect(Collectors.toList());

      log.debug("scan returned " + keys.size() + " rows. now verifying...");

      Iterator<Key> iterator = keys.iterator();
      int curKey = Integer.parseInt(iterator.next().getRow().toString());
      boolean done = false;
      for (Range r : ranges) {
        int start = Integer.parseInt(r.getStartKey().getRow().toString());
        int end = Integer
            .parseInt(String.copyValueOf(r.getEndKey().getRow().toString().toCharArray(), 0, 10));
        for (int i = start; i <= end; i++) {

          if (done) {
            log.error("missing key " + i);
            break;
          }

          while (curKey < i) {
            log.error("extra key " + curKey);
            if (!iterator.hasNext()) {
              done = true;
              break;
            }
            curKey = Integer.parseInt(iterator.next().getRow().toString());
          }

          if (curKey > i) {
            log.error("missing key " + i);
          }

          if (iterator.hasNext()) {
            curKey = Integer.parseInt(iterator.next().getRow().toString());
          } else {
            done = true;
          }
        }
      }

      log.debug("verify is now complete");
    }
  }