HBASE-26971 SnapshotInfo --snapshot param is marked as required even when trying to list all snapshots (#4366)

Signed-off-by: Josh Elser <elserj@apache.org>
This commit is contained in:
Wellington Ramos Chevreuil 2022-04-25 12:30:07 +01:00 committed by GitHub
parent f5b10e0115
commit af13c6d4c6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 43 additions and 8 deletions

View File

@ -27,6 +27,7 @@ import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Properties;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
@ -43,6 +44,12 @@ import org.apache.hadoop.hbase.io.WALLink;
import org.apache.hadoop.hbase.util.AbstractHBaseTool; import org.apache.hadoop.hbase.util.AbstractHBaseTool;
import org.apache.hadoop.hbase.util.CommonFSUtils; import org.apache.hadoop.hbase.util.CommonFSUtils;
import org.apache.hadoop.util.StringUtils; import org.apache.hadoop.util.StringUtils;
import org.apache.hbase.thirdparty.org.apache.commons.cli.AlreadySelectedException;
import org.apache.hbase.thirdparty.org.apache.commons.cli.CommandLineParser;
import org.apache.hbase.thirdparty.org.apache.commons.cli.DefaultParser;
import org.apache.hbase.thirdparty.org.apache.commons.cli.MissingOptionException;
import org.apache.hbase.thirdparty.org.apache.commons.cli.Options;
import org.apache.hbase.thirdparty.org.apache.commons.cli.ParseException;
import org.apache.yetus.audience.InterfaceAudience; import org.apache.yetus.audience.InterfaceAudience;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -68,17 +75,25 @@ public final class SnapshotInfo extends AbstractHBaseTool {
private static final Logger LOG = LoggerFactory.getLogger(SnapshotInfo.class); private static final Logger LOG = LoggerFactory.getLogger(SnapshotInfo.class);
static final class Options { static final class Options {
static final Option SNAPSHOT = new Option(null, "snapshot", true, "Snapshot to examine."); static final Option SNAPSHOT = new Option(null, "snapshot", true,
"The name of the snapshot to be detailed.");
static final Option REMOTE_DIR = new Option(null, "remote-dir", true, static final Option REMOTE_DIR = new Option(null, "remote-dir", true,
"Root directory that contains the snapshots."); "A custom root directory where snapshots are stored. "
+ "Use it together with the --snapshot option.");
static final Option LIST_SNAPSHOTS = new Option(null, "list-snapshots", false, static final Option LIST_SNAPSHOTS = new Option(null, "list-snapshots", false,
"List all the available snapshots and exit."); "List all the available snapshots and exit.");
static final Option FILES = new Option(null, "files", false, "Files and logs list."); static final Option FILES = new Option(null, "files", false,
static final Option STATS = new Option(null, "stats", false, "Files and logs stats."); "The list of files retained by the specified snapshot. "
+ "Use it together with the --snapshot option.");
static final Option STATS = new Option(null, "stats", false,
"Additional information about the specified snapshot. "
+ "Use it together with the --snapshot option.");
static final Option SCHEMA = new Option(null, "schema", false, static final Option SCHEMA = new Option(null, "schema", false,
"Describe the snapshotted table."); "Show the descriptor of the table for the specified snapshot. "
+ "Use it together with the --snapshot option.");
static final Option SIZE_IN_BYTES = new Option(null, "size-in-bytes", false, static final Option SIZE_IN_BYTES = new Option(null, "size-in-bytes", false,
"Print the size of the files in bytes."); "Print the size of the files in bytes. "
+ "Use it together with the --snapshot and --files options.");
} }
/** /**
@ -396,7 +411,9 @@ public final class SnapshotInfo extends AbstractHBaseTool {
} }
printInfo(); printInfo();
if (showSchema) printSchema(); if (showSchema) {
printSchema();
}
printFiles(showFiles, showStats); printFiles(showFiles, showStats);
return 0; return 0;
@ -516,7 +533,7 @@ public final class SnapshotInfo extends AbstractHBaseTool {
@Override @Override
protected void addOptions() { protected void addOptions() {
addRequiredOption(Options.SNAPSHOT); addOption(Options.SNAPSHOT);
addOption(Options.REMOTE_DIR); addOption(Options.REMOTE_DIR);
addOption(Options.LIST_SNAPSHOTS); addOption(Options.LIST_SNAPSHOTS);
addOption(Options.FILES); addOption(Options.FILES);
@ -525,6 +542,24 @@ public final class SnapshotInfo extends AbstractHBaseTool {
addOption(Options.SIZE_IN_BYTES); addOption(Options.SIZE_IN_BYTES);
} }
@Override
protected CommandLineParser newParser() {
// Commons-CLI lacks the capability to handle combinations of options, so we do it ourselves
// Validate in parse() to get helpful error messages instead of exploding in processOptions()
return new DefaultParser() {
@Override
public CommandLine parse(org.apache.hbase.thirdparty.org.apache.commons.cli.Options opts, String[] args, Properties props, boolean stop)
throws ParseException {
CommandLine cl = super.parse(opts, args, props, stop);
if(!cmd.hasOption(Options.LIST_SNAPSHOTS) && !cmd.hasOption(Options.SNAPSHOT)) {
throw new ParseException("Missing required snapshot option!");
}
return cl;
}
};
}
@Override @Override
protected void processOptions(CommandLine cmd) { protected void processOptions(CommandLine cmd) {
snapshotName = cmd.getOptionValue(Options.SNAPSHOT.getLongOpt()); snapshotName = cmd.getOptionValue(Options.SNAPSHOT.getLongOpt());