HADOOP-13188 S3A file-create should throw error rather than overwrite directories. Contributed by Steve Loughran

This commit is contained in:
Steve Loughran 2016-07-25 15:48:32 +01:00
parent be9e46b42d
commit 86ae218893
2 changed files with 17 additions and 7 deletions

View File

@ -588,9 +588,24 @@ public class S3AFileSystem extends FileSystem {
boolean overwrite, int bufferSize, short replication, long blockSize,
Progressable progress) throws IOException {
String key = pathToKey(f);
S3AFileStatus status = null;
try {
// get the status or throw an FNFE
status = getFileStatus(f);
// if the thread reaches here, there is something at the path
if (status.isDirectory()) {
// path references a directory: automatic error
throw new FileAlreadyExistsException(f + " is a directory");
}
if (!overwrite) {
// path references a file and overwrite is disabled
throw new FileAlreadyExistsException(f + " already exists");
}
LOG.debug("Overwriting file {}", f);
} catch (FileNotFoundException e) {
// this means the file is not found
if (!overwrite && exists(f)) {
throw new FileAlreadyExistsException(f + " already exists");
}
instrumentation.fileCreated();
if (getConf().getBoolean(FAST_UPLOAD, DEFAULT_FAST_UPLOAD)) {

View File

@ -30,9 +30,4 @@ public class TestS3AContractCreate extends AbstractContractCreateTest {
return new S3AContract(conf);
}
@Override
public void testOverwriteEmptyDirectory() throws Throwable {
ContractTestUtils.skip(
"blobstores can't distinguish empty directories from files");
}
}