HADOOP-13483. File create should throw error rather than overwrite directories. Contributed by Genmao Yu.
This commit is contained in:
parent
4d84c814fc
commit
bd2d97adee
|
@ -63,6 +63,8 @@ import com.aliyun.oss.model.ObjectMetadata;
|
|||
import com.aliyun.oss.model.PartETag;
|
||||
import com.aliyun.oss.model.UploadPartCopyRequest;
|
||||
import com.aliyun.oss.model.UploadPartCopyResult;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
/**
|
||||
* Implementation of {@link FileSystem} for <a href="https://oss.aliyun.com">
|
||||
|
@ -70,6 +72,8 @@ import com.aliyun.oss.model.UploadPartCopyResult;
|
|||
*/
|
||||
public class AliyunOSSFileSystem extends FileSystem {
|
||||
|
||||
private static final Logger LOG =
|
||||
LoggerFactory.getLogger(AliyunOSSFileSystem.class);
|
||||
private URI uri;
|
||||
private Path workingDir;
|
||||
private OSSClient ossClient;
|
||||
|
@ -101,10 +105,25 @@ public class AliyunOSSFileSystem extends FileSystem {
|
|||
boolean overwrite, int bufferSize, short replication, long blockSize,
|
||||
Progressable progress) throws IOException {
|
||||
String key = pathToKey(path);
|
||||
FileStatus status = null;
|
||||
|
||||
if (!overwrite && exists(path)) {
|
||||
try {
|
||||
// get the status or throw a FNFE
|
||||
status = getFileStatus(path);
|
||||
|
||||
// if the thread reaches here, there is something at the path
|
||||
if (status.isDirectory()) {
|
||||
// path references a directory
|
||||
throw new FileAlreadyExistsException(path + " is a directory");
|
||||
}
|
||||
if (!overwrite) {
|
||||
// path references a file and overwrite is disabled
|
||||
throw new FileAlreadyExistsException(path + " already exists");
|
||||
}
|
||||
LOG.debug("Overwriting file {}", path);
|
||||
} catch (FileNotFoundException e) {
|
||||
// this means the file is not found
|
||||
}
|
||||
|
||||
return new FSDataOutputStream(new AliyunOSSOutputStream(getConf(),
|
||||
ossClient, bucketName, key, progress, statistics,
|
||||
|
@ -540,7 +559,7 @@ public class AliyunOSSFileSystem extends FileSystem {
|
|||
/**
|
||||
* Used to create an empty file that represents an empty directory.
|
||||
*
|
||||
* @param bucketName the bucket this directory belongs to
|
||||
* @param bucket the bucket this directory belongs to
|
||||
* @param objectName directory path
|
||||
* @return true if directory successfully created
|
||||
* @throws IOException
|
||||
|
|
|
@ -21,7 +21,6 @@ package org.apache.hadoop.fs.aliyun.oss.contract;
|
|||
import org.apache.hadoop.conf.Configuration;
|
||||
import org.apache.hadoop.fs.contract.AbstractContractCreateTest;
|
||||
import org.apache.hadoop.fs.contract.AbstractFSContract;
|
||||
import org.apache.hadoop.fs.contract.ContractTestUtils;
|
||||
|
||||
/**
|
||||
* OSS contract creating tests.
|
||||
|
@ -33,9 +32,4 @@ public class TestOSSContractCreate extends AbstractContractCreateTest {
|
|||
return new OSSContract(conf);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void testOverwriteEmptyDirectory() throws Throwable {
|
||||
ContractTestUtils.skip(
|
||||
"blobstores can't distinguish empty directories from files");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue