HADOOP-11918. Listing an empty s3a root directory throws FileNotFound. Contributed by Lei (Eddy) Xu.

(cherry picked from commit 7fe521b1dd)
This commit is contained in:
cnauroth 2015-09-25 22:33:53 -07:00
parent 82d4c05b2d
commit 85c0cb0075
3 changed files with 20 additions and 0 deletions

View File

@ -582,6 +582,9 @@ Release 2.8.0 - UNRELEASED
HADOOP-12252. LocalDirAllocator should not throw NPE with empty string HADOOP-12252. LocalDirAllocator should not throw NPE with empty string
configuration. (Zhihai Xu) configuration. (Zhihai Xu)
HADOOP-11918. Listing an empty s3a root directory throws FileNotFound.
(Lei (Eddy) Xu via cnauroth)
OPTIMIZATIONS OPTIMIZATIONS
HADOOP-12051. ProtobufRpcEngine.invoke() should use Exception.toString() HADOOP-12051. ProtobufRpcEngine.invoke() should use Exception.toString()

View File

@ -25,6 +25,7 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import java.io.IOException; import java.io.IOException;
import org.apache.hadoop.fs.FileStatus;
import static org.apache.hadoop.fs.contract.ContractTestUtils.createFile; import static org.apache.hadoop.fs.contract.ContractTestUtils.createFile;
import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset; import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset;
@ -120,4 +121,17 @@ public abstract class AbstractContractRootDirectoryTest extends AbstractFSContra
assertIsDirectory(root); assertIsDirectory(root);
} }
@Test
public void testListEmptyRootDirectory() throws IOException {
//extra sanity checks here to avoid support calls about complete loss of data
skipIfUnsupported(TEST_ROOT_TESTS_ENABLED);
FileSystem fs = getFileSystem();
Path root = new Path("/");
FileStatus[] statuses = fs.listStatus(root);
for (FileStatus status : statuses) {
ContractTestUtils.assertDeleted(fs, status.getPath(), true);
}
assertEquals("listStatus on empty root-directory returned a non-empty list",
0, fs.listStatus(root).length);
}
} }

View File

@ -983,6 +983,9 @@ public class S3AFileSystem extends FileSystem {
return new S3AFileStatus(true, false, return new S3AFileStatus(true, false,
f.makeQualified(uri, workingDir)); f.makeQualified(uri, workingDir));
} else if (key.isEmpty()) {
LOG.debug("Found root directory");
return new S3AFileStatus(true, true, f.makeQualified(uri, workingDir));
} }
} catch (AmazonServiceException e) { } catch (AmazonServiceException e) {
if (e.getStatusCode() != 404) { if (e.getStatusCode() != 404) {