HADOOP-13188 S3A file-create should throw error rather than overwrite directories. Contributed by Steve Loughran
This commit is contained in:
parent
be9e46b42d
commit
86ae218893
@ -588,10 +588,25 @@ 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 (!overwrite && exists(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
|
||||
|
||||
}
|
||||
instrumentation.fileCreated();
|
||||
if (getConf().getBoolean(FAST_UPLOAD, DEFAULT_FAST_UPLOAD)) {
|
||||
return new FSDataOutputStream(
|
||||
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user