HADOOP-13406 S3AFileSystem: Consider reusing filestatus in delete() and mkdirs(). Contributed by Rajesh Balamohan

This commit is contained in:
Steve Loughran 2016-07-25 14:40:55 +01:00
parent 7052ca8804
commit be9e46b42d

View File

@ -739,7 +739,7 @@ private boolean innerRename(Path src, Path dst) throws IOException,
} else {
copyFile(srcKey, dstKey, srcStatus.getLen());
}
delete(src, false);
innerDelete(srcStatus, false);
} else {
LOG.debug("rename: renaming directory {} to {}", src, dst);
@ -1065,16 +1065,20 @@ private void removeKeys(List<DeleteObjectsRequest.KeyVersion> keysToDelete,
*/
public boolean delete(Path f, boolean recursive) throws IOException {
try {
return innerDelete(f, recursive);
return innerDelete(getFileStatus(f), recursive);
} catch (FileNotFoundException e) {
LOG.debug("Couldn't delete {} - does not exist", f);
instrumentation.errorIgnored();
return false;
} catch (AmazonClientException e) {
throw translateException("delete", f, e);
}
}
/**
* Delete a path. See {@link #delete(Path, boolean)}.
* Delete an object. See {@link #delete(Path, boolean)}.
*
* @param f the path to delete.
* @param status fileStatus object
* @param recursive if path is a directory and set to
* true, the directory is deleted else throws an exception. In
* case of a file the recursive can be set to either true or false.
@ -1082,17 +1086,10 @@ public boolean delete(Path f, boolean recursive) throws IOException {
* @throws IOException due to inability to delete a directory or file.
* @throws AmazonClientException on failures inside the AWS SDK
*/
private boolean innerDelete(Path f, boolean recursive) throws IOException,
AmazonClientException {
private boolean innerDelete(S3AFileStatus status, boolean recursive)
throws IOException, AmazonClientException {
Path f = status.getPath();
LOG.debug("Delete path {} - recursive {}", f , recursive);
S3AFileStatus status;
try {
status = getFileStatus(f);
} catch (FileNotFoundException e) {
LOG.debug("Couldn't delete {} - does not exist", f);
instrumentation.errorIgnored();
return false;
}
String key = pathToKey(f);
@ -1318,8 +1315,9 @@ private boolean innerMkdirs(Path f, FsPermission permission)
throws IOException, FileAlreadyExistsException, AmazonClientException {
LOG.debug("Making directory: {}", f);
incrementStatistic(INVOCATION_MKDIRS);
FileStatus fileStatus;
try {
FileStatus fileStatus = getFileStatus(f);
fileStatus = getFileStatus(f);
if (fileStatus.isDirectory()) {
return true;
@ -1327,10 +1325,10 @@ private boolean innerMkdirs(Path f, FsPermission permission)
throw new FileAlreadyExistsException("Path is a file: " + f);
}
} catch (FileNotFoundException e) {
Path fPart = f;
Path fPart = f.getParent();
do {
try {
FileStatus fileStatus = getFileStatus(fPart);
fileStatus = getFileStatus(fPart);
if (fileStatus.isDirectory()) {
break;
}