static boolean checkTable(Admin admin, TestOptions opts) throws IOException {
    final TableName tableName = TableName.valueOf(opts.tableName);
    final boolean exists = admin.tableExists(tableName);
    final boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")
      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");
    final boolean isDeleteCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("delete");
    final boolean needsData = isReadCmd || isDeleteCmd;
    if (!exists && needsData) {
      throw new IllegalStateException(
        "Must specify an existing table for read/delete commands. Run a write command first.");
    }
    TableDescriptor desc = exists ? admin.getDescriptor(TableName.valueOf(opts.tableName)) : null;
    final byte[][] splits = getSplits(opts);

    // recreate the table when user has requested presplit or when existing
    // {RegionSplitPolicy,replica count} does not match requested, or when the
    // number of column families does not match requested.
    final boolean regionCountChanged =
      exists && opts.presplitRegions != DEFAULT_OPTS.presplitRegions
        && opts.presplitRegions != admin.getRegions(tableName).size();
    final boolean splitPolicyChanged =
      exists && !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy);
    final boolean regionReplicationChanged = exists && desc.getRegionReplication() != opts.replicas;
    final boolean columnFamilyCountChanged = exists && desc.getColumnFamilyCount() != opts.families;

    boolean needsDelete = regionCountChanged || splitPolicyChanged || regionReplicationChanged
      || columnFamilyCountChanged;

    if (needsDelete) {
      final List<String> errors = new ArrayList<>();
      if (columnFamilyCountChanged) {
        final String error = String.format("--families=%d, but found %d column families",
          opts.families, desc.getColumnFamilyCount());
        if (needsData) {
          // We can't proceed the test in this case
          throw new IllegalStateException(
            "Cannot proceed the test. Run a write command first: " + error);
        }
        errors.add(error);
      }
      if (regionCountChanged) {
        errors.add(String.format("--presplit=%d, but found %d regions", opts.presplitRegions,
          admin.getRegions(tableName).size()));
      }
      if (splitPolicyChanged) {
        errors.add(String.format("--splitPolicy=%s, but current policy is %s", opts.splitPolicy,
          desc.getRegionSplitPolicyClassName()));
      }
      if (regionReplicationChanged) {
        errors.add(String.format("--replicas=%d, but found %d replicas", opts.replicas,
          desc.getRegionReplication()));
      }
      final String reason =
        errors.stream().map(s -> '[' + s + ']').collect(Collectors.joining(", "));

      if (needsData) {
        LOG.warn("Unexpected or incorrect options provided for {}. "
          + "Please verify whether the detected inconsistencies are expected or ignorable: {}. "
          + "The test will proceed, but the results may not be reliable.", opts.cmdName, reason);
        needsDelete = false;
      } else {
        LOG.info("Table will be recreated: " + reason);
      }
    }

    // remove an existing table
    if (needsDelete) {
      if (admin.isTableEnabled(tableName)) {
        admin.disableTable(tableName);
      }
      admin.deleteTable(tableName);
    }

    // table creation is necessary
    if (!exists || needsDelete) {
      desc = getTableDescriptor(opts);
      if (splits != null) {
        if (LOG.isDebugEnabled()) {
          for (int i = 0; i < splits.length; i++) {
            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));
          }
        }
      }
      if (splits != null) {
        admin.createTable(desc, splits);
      } else {
        admin.createTable(desc);
      }
      LOG.info("Table " + desc + " created");
    }
    return admin.tableExists(tableName);
  }
configuration parameter name that contains the PE impl
hbase-diagnostics/src/main/java/org/apache/hadoop/hbase/PerformanceEvaluation.java