Revert "HADOOP-15843. s3guard bucket-info command to not print a stack trace on bucket-not-found."
This reverts commit c4a00d1ad3
.
This commit is contained in:
parent
f2fb6536dc
commit
920a89627d
|
@ -69,7 +69,6 @@ import static org.apache.hadoop.service.launcher.LauncherExitCodes.*;
|
||||||
* CLI to manage S3Guard Metadata Store.
|
* CLI to manage S3Guard Metadata Store.
|
||||||
*/
|
*/
|
||||||
public abstract class S3GuardTool extends Configured implements Tool {
|
public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
|
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(S3GuardTool.class);
|
private static final Logger LOG = LoggerFactory.getLogger(S3GuardTool.class);
|
||||||
|
|
||||||
private static final String NAME = "s3guard";
|
private static final String NAME = "s3guard";
|
||||||
|
@ -96,9 +95,6 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
private static final String DATA_IN_S3_IS_PRESERVED
|
private static final String DATA_IN_S3_IS_PRESERVED
|
||||||
= "(all data in S3 is preserved)";
|
= "(all data in S3 is preserved)";
|
||||||
|
|
||||||
public static final String E_NO_METASTORE_OR_FILESYSTEM
|
|
||||||
= "No metastore or filesystem specified";
|
|
||||||
|
|
||||||
public abstract String getUsage();
|
public abstract String getUsage();
|
||||||
|
|
||||||
// Exit codes
|
// Exit codes
|
||||||
|
@ -279,8 +275,12 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
if (getStore() != null) {
|
if (getStore() != null) {
|
||||||
return getStore();
|
return getStore();
|
||||||
}
|
}
|
||||||
final boolean hasFileSystem = filesystem != null;
|
Configuration conf;
|
||||||
final Configuration conf = hasFileSystem ? filesystem.getConf() : getConf();
|
if (filesystem == null) {
|
||||||
|
conf = getConf();
|
||||||
|
} else {
|
||||||
|
conf = filesystem.getConf();
|
||||||
|
}
|
||||||
String metaURI = getCommandFormat().getOptValue(META_FLAG);
|
String metaURI = getCommandFormat().getOptValue(META_FLAG);
|
||||||
if (metaURI != null && !metaURI.isEmpty()) {
|
if (metaURI != null && !metaURI.isEmpty()) {
|
||||||
URI uri = URI.create(metaURI);
|
URI uri = URI.create(metaURI);
|
||||||
|
@ -302,13 +302,6 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
String.format("Metadata store %s is not supported", uri));
|
String.format("Metadata store %s is not supported", uri));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!hasFileSystem) {
|
|
||||||
// command didn't declare a metadata store URI or a bucket.
|
|
||||||
// to avoid problems related to picking up a shared table for actions
|
|
||||||
// line init and destroy (HADOOP-15843), this is rejected
|
|
||||||
printHelp(this);
|
|
||||||
throw usageError(E_NO_METASTORE_OR_FILESYSTEM);
|
|
||||||
}
|
|
||||||
// CLI does not specify metadata store URI, it uses default metadata store
|
// CLI does not specify metadata store URI, it uses default metadata store
|
||||||
// DynamoDB instead.
|
// DynamoDB instead.
|
||||||
setStore(new DynamoDBMetadataStore());
|
setStore(new DynamoDBMetadataStore());
|
||||||
|
@ -317,10 +310,10 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasFileSystem) {
|
if (filesystem == null) {
|
||||||
getStore().initialize(filesystem);
|
|
||||||
} else {
|
|
||||||
getStore().initialize(conf);
|
getStore().initialize(conf);
|
||||||
|
} else {
|
||||||
|
getStore().initialize(filesystem);
|
||||||
}
|
}
|
||||||
LOG.info("Metadata store {} is initialized.", getStore());
|
LOG.info("Metadata store {} is initialized.", getStore());
|
||||||
return getStore();
|
return getStore();
|
||||||
|
@ -1463,13 +1456,13 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
return uri;
|
return uri;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static void printHelp(S3GuardTool tool) {
|
private static void printHelp() {
|
||||||
if (tool == null) {
|
if (command == null) {
|
||||||
errorln("Usage: hadoop " + USAGE);
|
errorln("Usage: hadoop " + USAGE);
|
||||||
errorln("\tperform S3Guard metadata store " +
|
errorln("\tperform S3Guard metadata store " +
|
||||||
"administrative commands.");
|
"administrative commands.");
|
||||||
} else {
|
} else {
|
||||||
errorln("Usage: hadoop " + tool.getUsage());
|
errorln("Usage: hadoop " + command.getUsage());
|
||||||
}
|
}
|
||||||
errorln();
|
errorln();
|
||||||
errorln(COMMON_USAGE);
|
errorln(COMMON_USAGE);
|
||||||
|
@ -1511,6 +1504,7 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle store not found by converting to an exit exception
|
* Handle store not found by converting to an exit exception
|
||||||
* with specific error code.
|
* with specific error code.
|
||||||
|
@ -1572,18 +1566,6 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
String.format(format, args));
|
String.format(format, args));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build the exception to raise on a usage error
|
|
||||||
* @param format string format
|
|
||||||
* @param args optional arguments for the string
|
|
||||||
* @return a new exception to throw
|
|
||||||
*/
|
|
||||||
protected static ExitUtil.ExitException usageError(
|
|
||||||
String format, Object...args) {
|
|
||||||
return new ExitUtil.ExitException(E_USAGE, String.format(format, args));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Execute the command with the given arguments.
|
* Execute the command with the given arguments.
|
||||||
*
|
*
|
||||||
|
@ -1599,8 +1581,8 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
String[] otherArgs = new GenericOptionsParser(conf, args)
|
String[] otherArgs = new GenericOptionsParser(conf, args)
|
||||||
.getRemainingArgs();
|
.getRemainingArgs();
|
||||||
if (otherArgs.length == 0) {
|
if (otherArgs.length == 0) {
|
||||||
printHelp(null);
|
printHelp();
|
||||||
throw usageError("No arguments provided");
|
throw new ExitUtil.ExitException(E_USAGE, "No arguments provided");
|
||||||
}
|
}
|
||||||
final String subCommand = otherArgs[0];
|
final String subCommand = otherArgs[0];
|
||||||
LOG.debug("Executing command {}", subCommand);
|
LOG.debug("Executing command {}", subCommand);
|
||||||
|
@ -1635,7 +1617,7 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
command = new SelectTool(conf);
|
command = new SelectTool(conf);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printHelp(null);
|
printHelp();
|
||||||
throw new ExitUtil.ExitException(E_USAGE,
|
throw new ExitUtil.ExitException(E_USAGE,
|
||||||
"Unknown command " + subCommand);
|
"Unknown command " + subCommand);
|
||||||
}
|
}
|
||||||
|
@ -1652,17 +1634,11 @@ public abstract class S3GuardTool extends Configured implements Tool {
|
||||||
exit(ret, "");
|
exit(ret, "");
|
||||||
} catch (CommandFormat.UnknownOptionException e) {
|
} catch (CommandFormat.UnknownOptionException e) {
|
||||||
errorln(e.getMessage());
|
errorln(e.getMessage());
|
||||||
printHelp(command);
|
printHelp();
|
||||||
exit(E_USAGE, e.getMessage());
|
exit(E_USAGE, e.getMessage());
|
||||||
} catch (ExitUtil.ExitException e) {
|
} catch (ExitUtil.ExitException e) {
|
||||||
// explicitly raised exit code
|
// explicitly raised exit code
|
||||||
exit(e.getExitCode(), e.toString());
|
exit(e.getExitCode(), e.toString());
|
||||||
} catch (FileNotFoundException e) {
|
|
||||||
// bucket doesn't exist or similar.
|
|
||||||
// skip the stack trace and choose the return code of 44, "404"
|
|
||||||
errorln(e.toString());
|
|
||||||
LOG.debug("Not found:", e);
|
|
||||||
exit(EXIT_NOT_FOUND, e.toString());
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace(System.err);
|
e.printStackTrace(System.err);
|
||||||
exit(ERROR, e.toString());
|
exit(ERROR, e.toString());
|
||||||
|
|
|
@ -1006,20 +1006,6 @@ There's are limit on how often you can change the capacity of an DynamoDB table;
|
||||||
if you call set-capacity too often, it fails. Wait until the after the time indicated
|
if you call set-capacity too often, it fails. Wait until the after the time indicated
|
||||||
and try again.
|
and try again.
|
||||||
|
|
||||||
### Error `Invalid region specified`
|
|
||||||
|
|
||||||
```
|
|
||||||
java.io.IOException: Invalid region specified "iceland-2":
|
|
||||||
Region can be configured with fs.s3a.s3guard.ddb.region:
|
|
||||||
us-gov-west-1, us-east-1, us-east-2, us-west-1, us-west-2,
|
|
||||||
eu-west-1, eu-west-2, eu-west-3, eu-central-1, ap-south-1,
|
|
||||||
ap-southeast-1, ap-southeast-2, ap-northeast-1, ap-northeast-2,
|
|
||||||
sa-east-1, cn-north-1, cn-northwest-1, ca-central-1
|
|
||||||
at org.apache.hadoop.fs.s3a.s3guard.DynamoDBClientFactory$DefaultDynamoDBClientFactory.getRegion
|
|
||||||
at org.apache.hadoop.fs.s3a.s3guard.DynamoDBClientFactory$DefaultDynamoDBClientFactory.createDynamoDBClient
|
|
||||||
```
|
|
||||||
|
|
||||||
The region specified in `fs.s3a.s3guard.ddb.region` is invalid.
|
|
||||||
|
|
||||||
## Other Topics
|
## Other Topics
|
||||||
|
|
||||||
|
|
|
@ -52,15 +52,12 @@ import org.apache.hadoop.util.ExitUtil;
|
||||||
import org.apache.hadoop.util.StringUtils;
|
import org.apache.hadoop.util.StringUtils;
|
||||||
|
|
||||||
import static org.apache.hadoop.fs.s3a.Constants.METADATASTORE_AUTHORITATIVE;
|
import static org.apache.hadoop.fs.s3a.Constants.METADATASTORE_AUTHORITATIVE;
|
||||||
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_DDB_REGION_KEY;
|
|
||||||
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_DDB_TABLE_CREATE_KEY;
|
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_DDB_TABLE_CREATE_KEY;
|
||||||
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_DDB_TABLE_NAME_KEY;
|
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_DDB_TABLE_NAME_KEY;
|
||||||
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_METASTORE_NULL;
|
import static org.apache.hadoop.fs.s3a.Constants.S3GUARD_METASTORE_NULL;
|
||||||
import static org.apache.hadoop.fs.s3a.Constants.S3_METADATA_STORE_IMPL;
|
import static org.apache.hadoop.fs.s3a.Constants.S3_METADATA_STORE_IMPL;
|
||||||
import static org.apache.hadoop.fs.s3a.S3AUtils.clearBucketOption;
|
import static org.apache.hadoop.fs.s3a.S3AUtils.clearBucketOption;
|
||||||
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.E_BAD_STATE;
|
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.E_BAD_STATE;
|
||||||
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.E_NO_METASTORE_OR_FILESYSTEM;
|
|
||||||
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.E_USAGE;
|
|
||||||
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.SUCCESS;
|
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardTool.SUCCESS;
|
||||||
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardToolTestHelper.exec;
|
import static org.apache.hadoop.fs.s3a.s3guard.S3GuardToolTestHelper.exec;
|
||||||
import static org.apache.hadoop.test.LambdaTestUtils.intercept;
|
import static org.apache.hadoop.test.LambdaTestUtils.intercept;
|
||||||
|
@ -349,68 +346,28 @@ public abstract class AbstractS3GuardToolTestBase extends AbstractS3ATestBase {
|
||||||
@Test
|
@Test
|
||||||
public void testSetCapacityFailFastIfNotGuarded() throws Exception{
|
public void testSetCapacityFailFastIfNotGuarded() throws Exception{
|
||||||
Configuration conf = getConfiguration();
|
Configuration conf = getConfiguration();
|
||||||
bindToNonexistentTable(conf);
|
conf.set(S3GUARD_DDB_TABLE_NAME_KEY, UUID.randomUUID().toString());
|
||||||
String bucket = rawFs.getBucket();
|
conf.set(S3GUARD_DDB_TABLE_CREATE_KEY, Boolean.FALSE.toString());
|
||||||
clearBucketOption(conf, bucket, S3_METADATA_STORE_IMPL);
|
|
||||||
clearBucketOption(conf, bucket, S3GUARD_DDB_TABLE_NAME_KEY);
|
|
||||||
clearBucketOption(conf, bucket, S3GUARD_DDB_TABLE_CREATE_KEY);
|
|
||||||
conf.set(S3_METADATA_STORE_IMPL, S3GUARD_METASTORE_NULL);
|
conf.set(S3_METADATA_STORE_IMPL, S3GUARD_METASTORE_NULL);
|
||||||
|
|
||||||
S3GuardTool.SetCapacity cmdR = new S3GuardTool.SetCapacity(conf);
|
S3GuardTool.SetCapacity cmdR = new S3GuardTool.SetCapacity(conf);
|
||||||
String[] argsR = new String[]{
|
String[] argsR = new String[]{cmdR.getName(),
|
||||||
cmdR.getName(),
|
"s3a://" + getFileSystem().getBucket()};
|
||||||
"s3a://" + getFileSystem().getBucket()
|
|
||||||
};
|
|
||||||
|
|
||||||
intercept(IllegalStateException.class, "unguarded",
|
intercept(IllegalStateException.class, "unguarded",
|
||||||
() -> cmdR.run(argsR));
|
() -> run(argsR));
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Binds the configuration to a nonexistent table.
|
|
||||||
* @param conf
|
|
||||||
*/
|
|
||||||
protected void bindToNonexistentTable(final Configuration conf) {
|
|
||||||
conf.set(S3GUARD_DDB_TABLE_NAME_KEY, UUID.randomUUID().toString());
|
|
||||||
conf.setBoolean(S3GUARD_DDB_TABLE_CREATE_KEY, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testDestroyNoBucket() throws Throwable {
|
public void testDestroyNoBucket() throws Throwable {
|
||||||
describe("Destroy a bucket which doesn't exist");
|
|
||||||
|
|
||||||
Configuration conf = getConfiguration();
|
|
||||||
// set a table as a safety check in case the test goes wrong
|
|
||||||
// and deletes it.
|
|
||||||
bindToNonexistentTable(conf);
|
|
||||||
|
|
||||||
S3GuardTool.Destroy cmdR = new S3GuardTool.Destroy(conf);
|
|
||||||
String[] argsR = new String[]{
|
|
||||||
S3GuardTool.Destroy.NAME,
|
|
||||||
S3A_THIS_BUCKET_DOES_NOT_EXIST
|
|
||||||
};
|
|
||||||
intercept(FileNotFoundException.class,
|
intercept(FileNotFoundException.class,
|
||||||
() -> cmdR.run(argsR));
|
new Callable<Integer>() {
|
||||||
}
|
@Override
|
||||||
|
public Integer call() throws Exception {
|
||||||
@Test
|
return run(S3GuardTool.Destroy.NAME,
|
||||||
public void testDestroyNoArgs() throws Throwable {
|
S3A_THIS_BUCKET_DOES_NOT_EXIST);
|
||||||
describe("Destroy a bucket which doesn't exist");
|
}
|
||||||
|
});
|
||||||
Configuration conf = getConfiguration();
|
|
||||||
// set a table as a safety check in case the test goes wrong
|
|
||||||
// and deletes it.
|
|
||||||
conf.set(S3GUARD_DDB_TABLE_NAME_KEY, UUID.randomUUID().toString());
|
|
||||||
conf.set(S3GUARD_DDB_REGION_KEY, "us-gov-west-1");
|
|
||||||
conf.setBoolean(S3GUARD_DDB_TABLE_CREATE_KEY, false);
|
|
||||||
|
|
||||||
S3GuardTool.Destroy cmdR = new S3GuardTool.Destroy(conf);
|
|
||||||
|
|
||||||
assertExitCode(E_USAGE,
|
|
||||||
intercept(ExitUtil.ExitException.class,
|
|
||||||
E_NO_METASTORE_OR_FILESYSTEM,
|
|
||||||
() -> cmdR.run(new String[]{})));
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -425,24 +382,11 @@ public abstract class AbstractS3GuardToolTestBase extends AbstractS3ATestBase {
|
||||||
exec(cmd, S3GuardTool.BucketInfo.MAGIC_FLAG, name);
|
exec(cmd, S3GuardTool.BucketInfo.MAGIC_FLAG, name);
|
||||||
} else {
|
} else {
|
||||||
// if the FS isn't magic, expect the probe to fail
|
// if the FS isn't magic, expect the probe to fail
|
||||||
assertExitCode(E_BAD_STATE,
|
ExitUtil.ExitException e = intercept(ExitUtil.ExitException.class,
|
||||||
intercept(ExitUtil.ExitException.class,
|
() -> exec(cmd, S3GuardTool.BucketInfo.MAGIC_FLAG, name));
|
||||||
() -> exec(cmd, S3GuardTool.BucketInfo.MAGIC_FLAG, name)));
|
if (e.getExitCode() != E_BAD_STATE) {
|
||||||
}
|
throw e;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Assert that an exit exception had a specific error code.
|
|
||||||
* @param expectedErrorCode expected code.
|
|
||||||
* @param e exit exception
|
|
||||||
* @throws AssertionError with the exit exception nested inside
|
|
||||||
*/
|
|
||||||
protected void assertExitCode(final int expectedErrorCode,
|
|
||||||
final ExitUtil.ExitException e) {
|
|
||||||
if (e.getExitCode() != expectedErrorCode) {
|
|
||||||
throw new AssertionError("Expected error code " + expectedErrorCode
|
|
||||||
+ " in " + e,
|
|
||||||
e);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue