private Get[] readKey(long[] keysToRead) {
      Random rand = ThreadLocalRandom.current();
      Get[] gets = new Get[keysToRead.length];
      int i = 0;
      for (long keyToRead : keysToRead) {
        try {
          gets[i] = createGet(keyToRead);
          if (keysToRead.length == 1) {
            queryKey(gets[i], rand.nextInt(100) < verifyPercent, keyToRead);
          }
          i++;
        } catch (IOException e) {
          numReadFailures.addAndGet(1);
          LOG.debug("[" + readerId + "] FAILED read, key = " + (keyToRead + "")
            + ", time from start: " + (EnvironmentEdgeManager.currentTime() - startTimeMs) + " ms");
          if (printExceptionTrace) {
            LOG.warn(e.toString(), e);
            printExceptionTrace = false;
          }
        }
      }
      if (keysToRead.length > 1) {
        try {
          queryKey(gets, rand.nextInt(100) < verifyPercent, keysToRead);
        } catch (IOException e) {
          numReadFailures.addAndGet(gets.length);
          for (long keyToRead : keysToRead) {
            LOG.debug(
              "[" + readerId + "] FAILED read, key = " + (keyToRead + "") + ", time from start: "
                + (EnvironmentEdgeManager.currentTime() - startTimeMs) + " ms");
          }
          if (printExceptionTrace) {
            LOG.warn(e.toString(), e);
            printExceptionTrace = false;
          }
        }
      }
      return gets;
    }
Should only be used for the concurrent writer/reader workload. The maximum key we are allowed
to read, subject to the "key window" constraint.
hbase-diagnostics/src/main/java/org/apache/hadoop/hbase/util/MultiThreadedReader.java