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 271e7bb00b
commit b757eff30c
2 changed files with 17 additions and 7 deletions

View File

@ -598,9 +598,24 @@ public FSDataOutputStream create(Path f, FsPermission permission,
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 @@ protected AbstractFSContract createContract(Configuration conf) {
return new S3AContract(conf);
}
@Override
public void testOverwriteEmptyDirectory() throws Throwable {
ContractTestUtils.skip(
"blobstores can't distinguish empty directories from files");
}
}