HADOOP-15446. ABFS: tune imports & javadocs; stabilise tests. Contributed by Steve Loughran and Da Zhou.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/ce03a93f Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/ce03a93f Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/ce03a93f Branch: refs/heads/HADOOP-15407 Commit: ce03a93f78c4d97ccb48a3906fcd77ad0ac756be Parents: a271fd0 Author: Thomas Marquardt <tm...@microsoft.com> Authored: Wed Aug 8 18:52:12 2018 +0000 Committer: Thomas Marquardt <tm...@microsoft.com> Committed: Mon Sep 17 19:54:01 2018 +0000 ---------------------------------------------------------------------- .../apache/hadoop/fs/RawLocalFileSystem.java | 2 +- .../src/main/resources/core-default.xml | 15 + .../src/site/markdown/filesystem/filesystem.md | 11 +- .../fs/contract/AbstractContractAppendTest.java | 57 ++-- .../fs/contract/AbstractContractConcatTest.java | 34 +-- .../AbstractContractGetFileStatusTest.java | 26 +- .../fs/contract/AbstractContractMkdirTest.java | 8 + .../hadoop/fs/contract/AbstractFSContract.java | 2 - .../hadoop/fs/contract/ContractTestUtils.java | 19 +- .../org/apache/hadoop/fs/azurebfs/Abfs.java | 4 +- .../org/apache/hadoop/fs/azurebfs/Abfss.java | 4 +- .../hadoop/fs/azurebfs/AzureBlobFileSystem.java | 98 +++--- .../fs/azurebfs/AzureBlobFileSystemStore.java | 147 ++++----- .../fs/azurebfs/SecureAzureBlobFileSystem.java | 4 +- .../azurebfs/constants/AbfsHttpConstants.java | 2 +- .../constants/HttpHeaderConfigurations.java | 2 +- .../fs/azurebfs/constants/HttpQueryParams.java | 2 +- .../ConfigurationValidationAnnotations.java | 14 +- .../diagnostics/ConfigurationValidator.java | 6 +- .../AzureBlobFileSystemException.java | 4 +- .../exceptions/InvalidUriException.java | 4 +- ...Base64StringConfigurationBasicValidator.java | 2 +- .../BooleanConfigurationBasicValidator.java | 4 +- .../ConfigurationBasicValidator.java | 2 +- .../IntegerConfigurationBasicValidator.java | 2 +- .../LongConfigurationBasicValidator.java | 4 +- .../StringConfigurationBasicValidator.java | 4 +- .../hadoop/fs/azurebfs/services/AbfsClient.java | 157 +++++----- .../fs/azurebfs/services/AbfsHttpOperation.java | 6 +- .../fs/azurebfs/services/AbfsInputStream.java | 5 +- .../fs/azurebfs/services/AbfsOutputStream.java | 125 ++++---- .../fs/azurebfs/services/AbfsRestOperation.java | 24 +- .../azurebfs/services/AbfsUriQueryBuilder.java | 6 +- .../services/ExponentialRetryPolicy.java | 2 +- .../hadoop/fs/azurebfs/services/ReadBuffer.java | 4 +- .../fs/azurebfs/services/ReadBufferManager.java | 56 ++-- .../fs/azurebfs/services/ReadBufferWorker.java | 4 +- .../azurebfs/services/SharedKeyCredentials.java | 32 +- .../hadoop-azure/src/site/markdown/abfs.md | 72 +++++ .../src/site/markdown/testing_azure.md | 76 +++++ .../ITestAzureNativeContractAppend.java | 23 ++ .../azurebfs/AbstractAbfsIntegrationTest.java | 304 +++++++++++++++++++ .../fs/azurebfs/AbstractAbfsScaleTest.java | 53 ++++ .../fs/azurebfs/DependencyInjectedTest.java | 206 ------------- .../ITestAzureBlobFileSystemAppend.java | 28 +- .../ITestAzureBlobFileSystemBackCompat.java | 16 +- .../azurebfs/ITestAzureBlobFileSystemCopy.java | 45 ++- .../ITestAzureBlobFileSystemCreate.java | 54 ++-- .../ITestAzureBlobFileSystemDelete.java | 79 +++-- .../azurebfs/ITestAzureBlobFileSystemE2E.java | 66 ++-- .../ITestAzureBlobFileSystemE2EScale.java | 80 ++--- .../ITestAzureBlobFileSystemFileStatus.java | 45 ++- .../azurebfs/ITestAzureBlobFileSystemFlush.java | 209 +++++++------ .../ITestAzureBlobFileSystemInitAndCreate.java | 17 +- .../ITestAzureBlobFileSystemListStatus.java | 123 +++++--- .../azurebfs/ITestAzureBlobFileSystemMkDir.java | 55 +--- .../azurebfs/ITestAzureBlobFileSystemOpen.java | 41 --- .../ITestAzureBlobFileSystemRandomRead.java | 48 +-- .../ITestAzureBlobFileSystemRename.java | 129 ++++---- .../ITestAzureBlobFileSystemRenameUnicode.java | 98 ++++++ .../azurebfs/ITestFileSystemInitialization.java | 47 ++- .../fs/azurebfs/ITestFileSystemProperties.java | 47 ++- .../azurebfs/ITestFileSystemRegistration.java | 78 +++-- .../fs/azurebfs/ITestWasbAbfsCompatibility.java | 166 +++++----- .../constants/TestConfigurationKeys.java | 11 +- .../contract/ABFSContractTestBinding.java | 64 ++++ .../contract/AbfsFileSystemContract.java | 65 ++++ .../DependencyInjectedContractTest.java | 63 ---- .../contract/ITestAbfsFileSystemContract.java | 54 ---- .../ITestAbfsFileSystemContractAppend.java | 14 +- .../ITestAbfsFileSystemContractConcat.java | 14 +- .../ITestAbfsFileSystemContractCreate.java | 10 +- .../ITestAbfsFileSystemContractDelete.java | 12 +- .../ITestAbfsFileSystemContractDistCp.java | 10 +- ...TestAbfsFileSystemContractGetFileStatus.java | 12 +- .../ITestAbfsFileSystemContractMkdir.java | 12 +- .../ITestAbfsFileSystemContractOpen.java | 12 +- .../ITestAbfsFileSystemContractRename.java | 12 +- ...TestAbfsFileSystemContractRootDirectory.java | 12 +- ...ITestAbfsFileSystemContractSecureDistCp.java | 10 +- .../ITestAbfsFileSystemContractSeek.java | 12 +- .../ITestAbfsFileSystemContractSetTimes.java | 12 +- .../ITestAzureBlobFileSystemBasics.java | 25 +- .../TestConfigurationValidators.java | 5 +- .../services/ITestAbfsReadWriteAndSeek.java | 91 ++++++ .../services/ITestReadWriteAndSeek.java | 78 ----- .../TestAbfsConfigurationFieldsValidation.java | 6 +- .../utils/CleanUpAbfsTestContainer.java | 6 +- .../hadoop-azure/src/test/resources/abfs.xml | 4 +- .../src/test/resources/azure-bfs-test.xml | 14 +- .../src/test/resources/log4j.properties | 32 ++ 91 files changed, 2140 insertions(+), 1641 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java index bd003ae..6e9d433 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/fs/RawLocalFileSystem.java @@ -291,7 +291,7 @@ public class RawLocalFileSystem extends FileSystem { Progressable progress) throws IOException { FileStatus status = getFileStatus(f); if (status.isDirectory()) { - throw new IOException("Cannot append to a diretory (=" + f + " )"); + throw new FileAlreadyExistsException("Cannot append to a directory: " + f); } return new FSDataOutputStream(new BufferedOutputStream( createOutputStreamWithMode(f, true, null), bufferSize), statistics, http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml index e15fab8..471dacc 100644 --- a/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml +++ b/hadoop-common-project/hadoop-common/src/main/resources/core-default.xml @@ -1639,16 +1639,31 @@ SAS keys to communicate with Azure storage. </description> </property> + <property> <name>fs.abfs.impl</name> <value>org.apache.hadoop.fs.azurebfs.AzureBlobFileSystem</value> <description>The implementation class of the Azure Blob Filesystem</description> </property> + <property> <name>fs.abfss.impl</name> <value>org.apache.hadoop.fs.azurebfs.SecureAzureBlobFileSystem</value> <description>The implementation class of the Secure Azure Blob Filesystem</description> </property> + +<property> + <name>fs.AbstractFileSystem.abfs.impl</name> + <value>org.apache.hadoop.fs.azurebfs.Abfs</value> + <description>AbstractFileSystem implementation class of abfs://</description> +</property> + +<property> + <name>fs.AbstractFileSystem.abfss.impl</name> + <value>org.apache.hadoop.fs.azurebfs.Abfss</value> + <description>AbstractFileSystem implementation class of abfss://</description> +</property> + <property> <name>fs.azure.local.sas.key.mode</name> <value>false</value> http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/filesystem.md ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/filesystem.md b/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/filesystem.md index 2637f54..28c6fbe 100644 --- a/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/filesystem.md +++ b/hadoop-common-project/hadoop-common/src/site/markdown/filesystem/filesystem.md @@ -544,15 +544,6 @@ atomic. The combined operation, including `mkdirs(parent(F))` MAY be atomic. The return value is always true—even if a new directory is not created (this is defined in HDFS). -#### Implementation Notes: Local FileSystem - -The local FileSystem does not raise an exception if `mkdirs(p)` is invoked -on a path that exists and is a file. Instead the operation returns false. - - if isFile(FS, p): - FS' = FS - result = False - ### <a name='FileSystem.create'></a> `FSDataOutputStream create(Path, ...)` @@ -641,7 +632,7 @@ Implementations without a compliant call SHOULD throw `UnsupportedOperationExcep if not exists(FS, p) : raise FileNotFoundException - if not isFile(FS, p) : raise [FileNotFoundException, IOException] + if not isFile(FS, p) : raise [FileAlreadyExistsException, FileNotFoundException, IOException] #### Postconditions http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractAppendTest.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractAppendTest.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractAppendTest.java index d61b635..0be220e 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractAppendTest.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractAppendTest.java @@ -18,7 +18,12 @@ package org.apache.hadoop.fs.contract; +import java.io.FileNotFoundException; +import java.io.IOException; + import org.apache.hadoop.fs.FSDataOutputStream; +import org.apache.hadoop.fs.FileAlreadyExistsException; +import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.junit.Test; import org.slf4j.Logger; @@ -27,6 +32,7 @@ import org.slf4j.LoggerFactory; 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.touch; +import static org.apache.hadoop.test.LambdaTestUtils.intercept; /** * Test append -if supported @@ -75,15 +81,10 @@ public abstract class AbstractContractAppendTest extends AbstractFSContractTestB @Test public void testAppendNonexistentFile() throws Throwable { - try { - FSDataOutputStream out = getFileSystem().append(target); - //got here: trouble - out.close(); - fail("expected a failure"); - } catch (Exception e) { - //expected - handleExpectedException(e); - } + //expected + handleExpectedException( + intercept(Exception.class, + () -> getFileSystem().append(target).close())); } @Test @@ -116,15 +117,9 @@ public abstract class AbstractContractAppendTest extends AbstractFSContractTestB @Test public void testAppendMissingTarget() throws Throwable { - try { - FSDataOutputStream out = getFileSystem().append(target); - //got here: trouble - out.close(); - fail("expected a failure"); - } catch (Exception e) { - //expected - handleExpectedException(e); - } + handleExpectedException( + intercept(Exception.class, + () -> getFileSystem().append(target).close())); } @Test @@ -149,4 +144,30 @@ public abstract class AbstractContractAppendTest extends AbstractFSContractTestB dataset.length); ContractTestUtils.compareByteArrays(dataset, bytes, dataset.length); } + + @Test + public void testAppendFileAfterDelete() throws Exception { + final FileSystem fs = getFileSystem(); + final Path filePath = target; + fs.create(filePath); + fs.delete(filePath, false); + intercept(FileNotFoundException.class, + () -> fs.append(filePath)); + } + + @Test + public void testAppendDirectory() throws Exception { + final FileSystem fs = getFileSystem(); + + final Path folderPath = target; + fs.mkdirs(folderPath); + IOException ex = intercept(IOException.class, + () -> fs.append(folderPath)); + if (ex instanceof FileAlreadyExistsException) { + handleExpectedException(ex); + } else { + handleRelaxedException("Append to a directory", + "FileAlreadyExistsException", ex); + } + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractConcatTest.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractConcatTest.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractConcatTest.java index 7b12086..d30e0d6 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractConcatTest.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractConcatTest.java @@ -19,15 +19,16 @@ package org.apache.hadoop.fs.contract; import org.apache.hadoop.fs.Path; + import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import static org.apache.hadoop.fs.contract.ContractTestUtils.assertFileHasLength; -import static org.apache.hadoop.fs.contract.ContractTestUtils.cleanup; 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.touch; +import static org.apache.hadoop.test.LambdaTestUtils.intercept; /** * Test concat -if supported @@ -60,25 +61,15 @@ public abstract class AbstractContractConcatTest extends AbstractFSContractTestB @Test public void testConcatEmptyFiles() throws Throwable { touch(getFileSystem(), target); - try { - getFileSystem().concat(target, new Path[0]); - fail("expected a failure"); - } catch (Exception e) { - //expected - handleExpectedException(e); - } + handleExpectedException(intercept(Exception.class, + () -> getFileSystem().concat(target, new Path[0]))); } @Test public void testConcatMissingTarget() throws Throwable { - try { - getFileSystem().concat(target, - new Path[] { zeroByteFile}); - fail("expected a failure"); - } catch (Exception e) { - //expected - handleExpectedException(e); - } + handleExpectedException( + intercept(Exception.class, + () -> getFileSystem().concat(target, new Path[]{zeroByteFile}))); } @Test @@ -98,15 +89,8 @@ public abstract class AbstractContractConcatTest extends AbstractFSContractTestB public void testConcatOnSelf() throws Throwable { byte[] block = dataset(TEST_FILE_LEN, 0, 255); createFile(getFileSystem(), target, false, block); - try { - getFileSystem().concat(target, - new Path[]{target}); - } catch (Exception e) { - //expected - handleExpectedException(e); - } + handleExpectedException(intercept(Exception.class, + () -> getFileSystem().concat(target, new Path[]{target}))); } - - } http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractGetFileStatusTest.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractGetFileStatusTest.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractGetFileStatusTest.java index 269e35e..cb706ede 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractGetFileStatusTest.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractGetFileStatusTest.java @@ -32,6 +32,7 @@ import org.apache.hadoop.fs.RemoteIterator; import org.junit.Test; import static org.apache.hadoop.fs.contract.ContractTestUtils.*; +import static org.apache.hadoop.test.LambdaTestUtils.intercept; /** * Test getFileStatus and related listing operations. @@ -275,35 +276,22 @@ public abstract class AbstractContractGetFileStatusTest extends @Test public void testLocatedStatusNoDir() throws Throwable { describe("test the LocatedStatus call on a path which is not present"); - try { - RemoteIterator<LocatedFileStatus> iterator - = getFileSystem().listLocatedStatus(path("missing")); - fail("Expected an exception, got an iterator: " + iterator); - } catch (FileNotFoundException expected) { - // expected - } + intercept(FileNotFoundException.class, + () -> getFileSystem().listLocatedStatus(path("missing"))); } @Test public void testListStatusNoDir() throws Throwable { describe("test the listStatus(path) call on a path which is not present"); - try { - getFileSystem().listStatus(path("missing")); - fail("Expected an exception"); - } catch (FileNotFoundException expected) { - // expected - } + intercept(FileNotFoundException.class, + () -> getFileSystem().listStatus(path("missing"))); } @Test public void testListStatusFilteredNoDir() throws Throwable { describe("test the listStatus(path, filter) call on a missing path"); - try { - getFileSystem().listStatus(path("missing"), ALL_PATHS); - fail("Expected an exception"); - } catch (FileNotFoundException expected) { - // expected - } + intercept(FileNotFoundException.class, + () -> getFileSystem().listStatus(path("missing"), ALL_PATHS)); } @Test http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractMkdirTest.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractMkdirTest.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractMkdirTest.java index c5a546d..de44bc2 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractMkdirTest.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractMkdirTest.java @@ -26,6 +26,7 @@ import org.junit.Test; import java.io.IOException; +import static org.apache.hadoop.fs.contract.ContractTestUtils.assertMkdirs; import static org.apache.hadoop.fs.contract.ContractTestUtils.createFile; import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset; @@ -175,4 +176,11 @@ public abstract class AbstractContractMkdirTest extends AbstractFSContractTestBa } } + @Test + public void testCreateDirWithExistingDir() throws Exception { + Path path = path("testCreateDirWithExistingDir"); + final FileSystem fs = getFileSystem(); + assertMkdirs(fs, path); + assertMkdirs(fs, path); + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractFSContract.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractFSContract.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractFSContract.java index d3dafe9..f09496a 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractFSContract.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractFSContract.java @@ -148,7 +148,6 @@ public abstract class AbstractFSContract extends Configured { * @param feature feature to query * @param defval default value * @return true if the feature is supported - * @throws IOException IO problems */ public boolean isSupported(String feature, boolean defval) { return getConf().getBoolean(getConfKey(feature), defval); @@ -160,7 +159,6 @@ public abstract class AbstractFSContract extends Configured { * @param feature feature to query * @param defval default value * @return true if the feature is supported - * @throws IOException IO problems */ public int getLimit(String feature, int defval) { return getConf().getInt(getConfKey(feature), defval); http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/ContractTestUtils.java ---------------------------------------------------------------------- diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/ContractTestUtils.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/ContractTestUtils.java index 38a6fb1..ba12048 100644 --- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/ContractTestUtils.java +++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/ContractTestUtils.java @@ -187,8 +187,11 @@ public class ContractTestUtils extends Assert { (short) 1, buffersize); } - out.write(src, 0, len); - out.close(); + try { + out.write(src, 0, len); + } finally { + out.close(); + } assertFileHasLength(fs, path, len); } @@ -1022,6 +1025,18 @@ public class ContractTestUtils extends Assert { } /** + * Execute {@link FileSystem#mkdirs(Path)}; expect {@code true} back. + * (Note: does not work for localFS if the directory already exists) + * Does not perform any validation of the created directory. + * @param fs filesystem + * @param dir directory to create + * @throws IOException IO Problem + */ + public static void assertMkdirs(FileSystem fs, Path dir) throws IOException { + assertTrue("mkdirs(" + dir + ") returned false", fs.mkdirs(dir)); + } + + /** * Test for the host being an OSX machine. * @return true if the JVM thinks that is running on OSX */ http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfs.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfs.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfs.java index 707e264..32df942 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfs.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfs.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.DelegateToFileSystem; @@ -32,7 +31,6 @@ import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes; * Azure Blob File System implementation of AbstractFileSystem. * This impl delegates to the old FileSystem */ -@InterfaceAudience.Public @InterfaceStability.Evolving public class Abfs extends DelegateToFileSystem { @@ -45,4 +43,4 @@ public class Abfs extends DelegateToFileSystem { public int getUriDefaultPort() { return -1; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfss.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfss.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfss.java index 19c0f7a..c33265c 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfss.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/Abfss.java @@ -22,7 +22,6 @@ import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.DelegateToFileSystem; @@ -32,7 +31,6 @@ import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes; * Azure Blob File System implementation of AbstractFileSystem. * This impl delegates to the old FileSystem */ -@InterfaceAudience.Public @InterfaceStability.Evolving public class Abfss extends DelegateToFileSystem { @@ -45,4 +43,4 @@ public class Abfss extends DelegateToFileSystem { public int getUriDefaultPort() { return -1; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java index cf5acbb..9f58f6b 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystem.java @@ -36,14 +36,10 @@ import java.util.concurrent.Future; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.apache.hadoop.fs.PathIOException; -import org.apache.hadoop.fs.azurebfs.contracts.exceptions.AbfsRestOperationException; import org.apache.commons.lang.ArrayUtils; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.BlockLocation; @@ -54,13 +50,15 @@ import org.apache.hadoop.fs.FileAlreadyExistsException; import org.apache.hadoop.fs.FileStatus; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; +import org.apache.hadoop.fs.PathIOException; import org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations; import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes; -import org.apache.hadoop.fs.azurebfs.contracts.services.AzureServiceErrorCode; +import org.apache.hadoop.fs.azurebfs.contracts.exceptions.AbfsRestOperationException; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.AzureBlobFileSystemException; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.FileSystemOperationUnhandledException; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidUriAuthorityException; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidUriException; +import org.apache.hadoop.fs.azurebfs.contracts.services.AzureServiceErrorCode; import org.apache.hadoop.fs.permission.FsPermission; import org.apache.hadoop.security.UserGroupInformation; import org.apache.hadoop.util.Progressable; @@ -69,8 +67,7 @@ import org.apache.hadoop.util.Progressable; * A {@link org.apache.hadoop.fs.FileSystem} for reading and writing files stored on <a * href="http://store.azure.com/">Windows Azure</a> */ -@InterfaceAudience.Public -@InterfaceStability.Stable +@InterfaceStability.Evolving public class AzureBlobFileSystem extends FileSystem { public static final Logger LOG = LoggerFactory.getLogger(AzureBlobFileSystem.class); private URI uri; @@ -88,8 +85,7 @@ public class AzureBlobFileSystem extends FileSystem { super.initialize(uri, configuration); setConf(configuration); - this.LOG.debug( - "Initializing AzureBlobFileSystem for {}", uri); + LOG.debug("Initializing AzureBlobFileSystem for {}", uri); this.uri = URI.create(uri.getScheme() + "://" + uri.getAuthority()); this.userGroupInformation = UserGroupInformation.getCurrentUser(); @@ -97,16 +93,24 @@ public class AzureBlobFileSystem extends FileSystem { this.primaryUserGroup = userGroupInformation.getPrimaryGroupName(); this.abfsStore = new AzureBlobFileSystemStore(uri, this.isSecure(), configuration, userGroupInformation); - this.LOG.debug( - "Initializing NativeAzureFileSystem for {}", uri); + LOG.debug("Initializing NativeAzureFileSystem for {}", uri); this.setWorkingDirectory(this.getHomeDirectory()); if (abfsStore.getAbfsConfiguration().getCreateRemoteFileSystemDuringInitialization()) { this.createFileSystem(); } + } - this.mkdirs(this.workingDir); + @Override + public String toString() { + final StringBuilder sb = new StringBuilder( + "AzureBlobFileSystem{"); + sb.append("uri=").append(uri); + sb.append(", user='").append(user).append('\''); + sb.append(", primaryUserGroup='").append(primaryUserGroup).append('\''); + sb.append('}'); + return sb.toString(); } public boolean isSecure() { @@ -120,8 +124,7 @@ public class AzureBlobFileSystem extends FileSystem { @Override public FSDataInputStream open(final Path path, final int bufferSize) throws IOException { - this.LOG.debug( - "AzureBlobFileSystem.open path: {} bufferSize: {}", path.toString(), bufferSize); + LOG.debug("AzureBlobFileSystem.open path: {} bufferSize: {}", path, bufferSize); try { InputStream inputStream = abfsStore.openFileForRead(makeQualified(path), statistics); @@ -135,9 +138,8 @@ public class AzureBlobFileSystem extends FileSystem { @Override public FSDataOutputStream create(final Path f, final FsPermission permission, final boolean overwrite, final int bufferSize, final short replication, final long blockSize, final Progressable progress) throws IOException { - this.LOG.debug( - "AzureBlobFileSystem.create path: {} permission: {} overwrite: {} bufferSize: {}", - f.toString(), + LOG.debug("AzureBlobFileSystem.create path: {} permission: {} overwrite: {} bufferSize: {}", + f, permission, overwrite, blockSize); @@ -196,7 +198,7 @@ public class AzureBlobFileSystem extends FileSystem { @Override public FSDataOutputStream append(final Path f, final int bufferSize, final Progressable progress) throws IOException { - this.LOG.debug( + LOG.debug( "AzureBlobFileSystem.append path: {} bufferSize: {}", f.toString(), bufferSize); @@ -211,7 +213,7 @@ public class AzureBlobFileSystem extends FileSystem { } public boolean rename(final Path src, final Path dst) throws IOException { - this.LOG.debug( + LOG.debug( "AzureBlobFileSystem.rename src: {} dst: {}", src.toString(), dst.toString()); Path parentFolder = src.getParent(); @@ -250,7 +252,7 @@ public class AzureBlobFileSystem extends FileSystem { @Override public boolean delete(final Path f, final boolean recursive) throws IOException { - this.LOG.debug( + LOG.debug( "AzureBlobFileSystem.delete path: {} recursive: {}", f.toString(), recursive); if (f.isRoot()) { @@ -273,7 +275,7 @@ public class AzureBlobFileSystem extends FileSystem { @Override public FileStatus[] listStatus(final Path f) throws IOException { - this.LOG.debug( + LOG.debug( "AzureBlobFileSystem.listStatus path: {}", f.toString()); try { @@ -287,8 +289,8 @@ public class AzureBlobFileSystem extends FileSystem { @Override public boolean mkdirs(final Path f, final FsPermission permission) throws IOException { - this.LOG.debug( - "AzureBlobFileSystem.mkdirs path: {} permissions: {}", f.toString(), permission); + LOG.debug( + "AzureBlobFileSystem.mkdirs path: {} permissions: {}", f, permission); final Path parentFolder = f.getParent(); if (parentFolder == null) { @@ -312,13 +314,13 @@ public class AzureBlobFileSystem extends FileSystem { } super.close(); - this.LOG.debug("AzureBlobFileSystem.close"); + LOG.debug("AzureBlobFileSystem.close"); this.isClosed = true; } @Override public FileStatus getFileStatus(final Path f) throws IOException { - this.LOG.debug("AzureBlobFileSystem.getFileStatus path: {}", f.toString()); + LOG.debug("AzureBlobFileSystem.getFileStatus path: {}", f); try { return abfsStore.getFileStatus(makeQualified(f)); @@ -350,7 +352,8 @@ public class AzureBlobFileSystem extends FileSystem { @Override public Path getHomeDirectory() { return makeQualified(new Path( - FileSystemConfigurations.USER_HOME_DIRECTORY_PREFIX + "/" + this.userGroupInformation.getShortUserName())); + FileSystemConfigurations.USER_HOME_DIRECTORY_PREFIX + + "/" + this.userGroupInformation.getShortUserName())); } /** @@ -360,7 +363,7 @@ public class AzureBlobFileSystem extends FileSystem { */ @Override public BlockLocation[] getFileBlockLocations(FileStatus file, - long start, long len) throws IOException { + long start, long len) { if (file == null) { return null; } @@ -403,7 +406,7 @@ public class AzureBlobFileSystem extends FileSystem { } private boolean deleteRoot() throws IOException { - this.LOG.debug("Deleting root content"); + LOG.debug("Deleting root content"); final ExecutorService executorService = Executors.newFixedThreadPool(10); @@ -441,15 +444,14 @@ public class AzureBlobFileSystem extends FileSystem { private FileStatus tryGetFileStatus(final Path f) { try { return getFileStatus(f); - } - catch (IOException ex) { - this.LOG.debug("File not found {}", f.toString()); + } catch (IOException ex) { + LOG.debug("File not found {}", f); return null; } } private void createFileSystem() throws IOException { - this.LOG.debug( + LOG.debug( "AzureBlobFileSystem.createFileSystem uri: {}", uri); try { this.abfsStore.createFilesystem(); @@ -493,7 +495,8 @@ public class AzureBlobFileSystem extends FileSystem { return false; } - if (scheme.equals(FileSystemUriSchemes.ABFS_SCHEME) || scheme.equals(FileSystemUriSchemes.ABFS_SECURE_SCHEME)) { + if (scheme.equals(FileSystemUriSchemes.ABFS_SCHEME) + || scheme.equals(FileSystemUriSchemes.ABFS_SECURE_SCHEME)) { return true; } @@ -501,34 +504,45 @@ public class AzureBlobFileSystem extends FileSystem { } @VisibleForTesting - <T> FileSystemOperation execute( + <T> FileSystemOperation<T> execute( final String scopeDescription, final Callable<T> callableFileOperation) throws IOException { return execute(scopeDescription, callableFileOperation, null); } @VisibleForTesting - <T> FileSystemOperation execute( + <T> FileSystemOperation<T> execute( final String scopeDescription, final Callable<T> callableFileOperation, T defaultResultValue) throws IOException { try { final T executionResult = callableFileOperation.call(); - return new FileSystemOperation(executionResult, null); + return new FileSystemOperation<>(executionResult, null); } catch (AbfsRestOperationException abfsRestOperationException) { - return new FileSystemOperation(defaultResultValue, abfsRestOperationException); + return new FileSystemOperation<>(defaultResultValue, abfsRestOperationException); } catch (AzureBlobFileSystemException azureBlobFileSystemException) { throw new IOException(azureBlobFileSystemException); } catch (Exception exception) { if (exception instanceof ExecutionException) { exception = (Exception) getRootCause(exception); } - final FileSystemOperationUnhandledException fileSystemOperationUnhandledException = new FileSystemOperationUnhandledException(exception); + final FileSystemOperationUnhandledException fileSystemOperationUnhandledException + = new FileSystemOperationUnhandledException(exception); throw new IOException(fileSystemOperationUnhandledException); } } + /** + * Given a path and exception, choose which IOException subclass + * to create. + * Will return if and only iff the error code is in the list of allowed + * error codes. + * @param path path of operation triggering exception; may be null + * @param exception the exception caught + * @param allowedErrorCodesList varargs list of error codes. + * @throws IOException if the exception error code is not on the allowed list. + */ private void checkException(final Path path, final AzureBlobFileSystemException exception, final AzureServiceErrorCode... allowedErrorCodesList) throws IOException { @@ -542,9 +556,11 @@ public class AzureBlobFileSystem extends FileSystem { //AbfsRestOperationException.getMessage() contains full error info including path/uri. if (statusCode == HttpURLConnection.HTTP_NOT_FOUND) { - throw new FileNotFoundException(ere.getMessage()); + throw (IOException)new FileNotFoundException(ere.getMessage()) + .initCause(exception); } else if (statusCode == HttpURLConnection.HTTP_CONFLICT) { - throw new FileAlreadyExistsException(ere.getMessage()); + throw (IOException)new FileAlreadyExistsException(ere.getMessage()) + .initCause(exception); } else { throw ere; } @@ -601,4 +617,4 @@ public class AzureBlobFileSystem extends FileSystem { AzureBlobFileSystemStore getAbfsStore() { return this.abfsStore; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystemStore.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystemStore.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystemStore.java index 134277f..8ac31ce 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystemStore.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystemStore.java @@ -103,7 +103,7 @@ public class AzureBlobFileSystemStore { private final Set<String> azureAtomicRenameDirSet; - public AzureBlobFileSystemStore(URI uri, boolean isSeure, Configuration configuration, UserGroupInformation userGroupInformation) + public AzureBlobFileSystemStore(URI uri, boolean isSecure, Configuration configuration, UserGroupInformation userGroupInformation) throws AzureBlobFileSystemException { this.uri = uri; try { @@ -113,9 +113,10 @@ public class AzureBlobFileSystemStore { } this.userGroupInformation = userGroupInformation; - this.azureAtomicRenameDirSet = new HashSet<>(Arrays.asList(abfsConfiguration.getAzureAtomicRenameDirs().split(AbfsHttpConstants.COMMA))); + this.azureAtomicRenameDirSet = new HashSet<>(Arrays.asList( + abfsConfiguration.getAzureAtomicRenameDirs().split(AbfsHttpConstants.COMMA))); - initializeClient(uri, isSeure); + initializeClient(uri, isSecure); } @VisibleForTesting @@ -134,8 +135,7 @@ public class AzureBlobFileSystemStore { } public Hashtable<String, String> getFilesystemProperties() throws AzureBlobFileSystemException { - this.LOG.debug( - "getFilesystemProperties for filesystem: {}", + LOG.debug("getFilesystemProperties for filesystem: {}", client.getFileSystem()); final Hashtable<String, String> parsedXmsProperties; @@ -148,13 +148,13 @@ public class AzureBlobFileSystemStore { return parsedXmsProperties; } - public void setFilesystemProperties(final Hashtable<String, String> properties) throws AzureBlobFileSystemException { - if (properties == null || properties.size() == 0) { + public void setFilesystemProperties(final Hashtable<String, String> properties) + throws AzureBlobFileSystemException { + if (properties == null || properties.isEmpty()) { return; } - this.LOG.debug( - "setFilesystemProperties for filesystem: {} with properties: {}", + LOG.debug("setFilesystemProperties for filesystem: {} with properties: {}", client.getFileSystem(), properties); @@ -169,10 +169,9 @@ public class AzureBlobFileSystemStore { } public Hashtable<String, String> getPathProperties(final Path path) throws AzureBlobFileSystemException { - this.LOG.debug( - "getPathProperties for filesystem: {} path: {}", + LOG.debug("getPathProperties for filesystem: {} path: {}", client.getFileSystem(), - path.toString()); + path); final Hashtable<String, String> parsedXmsProperties; final AbfsRestOperation op = client.getPathProperties(AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path)); @@ -185,10 +184,9 @@ public class AzureBlobFileSystemStore { } public void setPathProperties(final Path path, final Hashtable<String, String> properties) throws AzureBlobFileSystemException { - this.LOG.debug( - "setFilesystemProperties for filesystem: {} path: {} with properties: {}", + LOG.debug("setFilesystemProperties for filesystem: {} path: {} with properties: {}", client.getFileSystem(), - path.toString(), + path, properties); final String commaSeparatedProperties; @@ -201,26 +199,23 @@ public class AzureBlobFileSystemStore { } public void createFilesystem() throws AzureBlobFileSystemException { - this.LOG.debug( - "createFilesystem for filesystem: {}", + LOG.debug("createFilesystem for filesystem: {}", client.getFileSystem()); client.createFilesystem(); } public void deleteFilesystem() throws AzureBlobFileSystemException { - this.LOG.debug( - "deleteFilesystem for filesystem: {}", + LOG.debug("deleteFilesystem for filesystem: {}", client.getFileSystem()); client.deleteFilesystem(); } public OutputStream createFile(final Path path, final boolean overwrite) throws AzureBlobFileSystemException { - this.LOG.debug( - "createFile filesystem: {} path: {} overwrite: {}", + LOG.debug("createFile filesystem: {} path: {} overwrite: {}", client.getFileSystem(), - path.toString(), + path, overwrite); client.createPath(AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path), true, overwrite); @@ -232,23 +227,19 @@ public class AzureBlobFileSystemStore { return outputStream; } - public Void createDirectory(final Path path) throws AzureBlobFileSystemException { - this.LOG.debug( - "createDirectory filesystem: {} path: {} overwrite: {}", + public void createDirectory(final Path path) throws AzureBlobFileSystemException { + LOG.debug("createDirectory filesystem: {} path: {}", client.getFileSystem(), - path.toString()); + path); client.createPath("/" + getRelativePath(path), false, true); - - return null; } public InputStream openFileForRead(final Path path, final FileSystem.Statistics statistics) throws AzureBlobFileSystemException { - this.LOG.debug( - "openFileForRead filesystem: {} path: {}", + LOG.debug("openFileForRead filesystem: {} path: {}", client.getFileSystem(), - path.toString()); + path); final AbfsRestOperation op = client.getPathProperties(AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path)); @@ -266,16 +257,16 @@ public class AzureBlobFileSystemStore { // Add statistics for InputStream return new FSDataInputStream( - new AbfsInputStream(client, statistics, AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path), contentLength, + new AbfsInputStream(client, statistics, + AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path), contentLength, abfsConfiguration.getReadBufferSize(), abfsConfiguration.getReadAheadQueueDepth(), eTag)); } public OutputStream openFileForWrite(final Path path, final boolean overwrite) throws AzureBlobFileSystemException { - this.LOG.debug( - "openFileForWrite filesystem: {} path: {} overwrite: {}", + LOG.debug("openFileForWrite filesystem: {} path: {} overwrite: {}", client.getFileSystem(), - path.toString(), + path, overwrite); final AbfsRestOperation op = client.getPathProperties(AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path)); @@ -304,23 +295,21 @@ public class AzureBlobFileSystemStore { AzureBlobFileSystemException { if (isAtomicRenameKey(source.getName())) { - this.LOG.warn("The atomic rename feature is not supported by the ABFS scheme; however rename," + LOG.warn("The atomic rename feature is not supported by the ABFS scheme; however rename," +" create and delete operations are atomic if Namespace is enabled for your Azure Storage account."); } - this.LOG.debug( - "renameAsync filesystem: {} source: {} destination: {}", + LOG.debug("renameAsync filesystem: {} source: {} destination: {}", client.getFileSystem(), - source.toString(), - destination.toString()); + source, + destination); String continuation = null; long deadline = now() + RENAME_TIMEOUT_MILISECONDS; do { if (now() > deadline) { - LOG.debug( - "Rename {} to {} timed out.", + LOG.debug("Rename {} to {} timed out.", source, destination); @@ -334,13 +323,12 @@ public class AzureBlobFileSystemStore { } while (continuation != null && !continuation.isEmpty()); } - public void delete(final Path path, final boolean recursive) throws - AzureBlobFileSystemException { + public void delete(final Path path, final boolean recursive) + throws AzureBlobFileSystemException { - this.LOG.debug( - "delete filesystem: {} path: {} recursive: {}", + LOG.debug("delete filesystem: {} path: {} recursive: {}", client.getFileSystem(), - path.toString(), + path, String.valueOf(recursive)); String continuation = null; @@ -348,13 +336,13 @@ public class AzureBlobFileSystemStore { do { if (now() > deadline) { - this.LOG.debug( - "Delete directory {} timed out.", path); + LOG.debug("Delete directory {} timed out.", path); throw new TimeoutException("Delete directory timed out."); } - AbfsRestOperation op = client.deletePath(AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path), recursive, continuation); + AbfsRestOperation op = client.deletePath( + AbfsHttpConstants.FORWARD_SLASH + getRelativePath(path), recursive, continuation); continuation = op.getResult().getResponseHeader(HttpHeaderConfigurations.X_MS_CONTINUATION); } while (continuation != null && !continuation.isEmpty()); @@ -362,10 +350,9 @@ public class AzureBlobFileSystemStore { public FileStatus getFileStatus(final Path path) throws IOException { - this.LOG.debug( - "getFileStatus filesystem: {} path: {}", + LOG.debug("getFileStatus filesystem: {} path: {}", client.getFileSystem(), - path.toString()); + path); if (path.isRoot()) { AbfsRestOperation op = client.getFilesystemProperties(); @@ -405,10 +392,9 @@ public class AzureBlobFileSystemStore { } public FileStatus[] listStatus(final Path path) throws IOException { - this.LOG.debug( - "listStatus filesystem: {} path: {}", + LOG.debug("listStatus filesystem: {} path: {}", client.getFileSystem(), - path.toString()); + path); String relativePath = path.isRoot() ? AbfsHttpConstants.EMPTY_STRING : getRelativePath(path); String continuation = null; @@ -480,10 +466,12 @@ public class AzureBlobFileSystemStore { final String[] authorityParts = authority.split(AbfsHttpConstants.AZURE_DISTRIBUTED_FILE_SYSTEM_AUTHORITY_DELIMITER, 2); - if (authorityParts.length < 2 || "".equals(authorityParts[0])) { + if (authorityParts.length < 2 || authorityParts[0] != null + && authorityParts[0].isEmpty()) { final String errMsg = String - .format("URI '%s' has a malformed authority, expected container name. " - + "Authority takes the form "+ FileSystemUriSchemes.ABFS_SCHEME + "://[<container name>@]<account name>", + .format("'%s' has a malformed authority, expected container name. " + + "Authority takes the form " + + FileSystemUriSchemes.ABFS_SCHEME + "://[<container name>@]<account name>", uri.toString()); throw new InvalidUriException(errMsg); } @@ -499,11 +487,16 @@ public class AzureBlobFileSystemStore { try { baseUrl = new URL(url); } catch (MalformedURLException e) { - throw new InvalidUriException(String.format("URI '%s' is malformed", uri.toString())); + throw new InvalidUriException(uri.toString()); } + int dotIndex = accountName.indexOf(AbfsHttpConstants.DOT); + if (dotIndex <= 0) { + throw new InvalidUriException( + uri.toString() + " - account name is not fully qualified."); + } SharedKeyCredentials creds = - new SharedKeyCredentials(accountName.substring(0, accountName.indexOf(AbfsHttpConstants.DOT)), + new SharedKeyCredentials(accountName.substring(0, dotIndex), this.abfsConfiguration.getStorageAccountKey(accountName)); this.client = new AbfsClient(baseUrl, creds, abfsConfiguration, new ExponentialRetryPolicy()); @@ -513,7 +506,7 @@ public class AzureBlobFileSystemStore { Preconditions.checkNotNull(path, "path"); final String relativePath = path.toUri().getPath(); - if (relativePath.length() == 0) { + if (relativePath.isEmpty()) { return relativePath; } @@ -537,7 +530,8 @@ public class AzureBlobFileSystemStore { } private boolean parseIsDirectory(final String resourceType) { - return resourceType == null ? false : resourceType.equalsIgnoreCase(AbfsHttpConstants.DIRECTORY); + return resourceType != null + && resourceType.equalsIgnoreCase(AbfsHttpConstants.DIRECTORY); } private DateTime parseLastModifiedTime(final String lastModifiedTime) { @@ -628,7 +622,7 @@ public class AzureBlobFileSystemStore { } } } catch (URISyntaxException e) { - this.LOG.info("URI syntax error creating URI for {}", dir); + LOG.info("URI syntax error creating URI for {}", dir); } } @@ -658,20 +652,21 @@ public class AzureBlobFileSystemStore { */ @Override public boolean equals(Object obj) { - if (obj == this) { - return true; + if (!(obj instanceof FileStatus)) { + return false; } - if (obj == null) { + FileStatus other = (FileStatus) obj; + + if (!other.equals(this)) {// compare the path return false; } - if (this.getClass() == obj.getClass()) { - VersionedFileStatus other = (VersionedFileStatus) obj; - return this.getPath().equals(other.getPath()) && this.version.equals(other.version); + if (other instanceof VersionedFileStatus) { + return this.version.equals(((VersionedFileStatus)other).version); } - return false; + return true; } /** @@ -695,6 +690,16 @@ public class AzureBlobFileSystemStore { public String getVersion() { return this.version; } + + @Override + public String toString() { + final StringBuilder sb = new StringBuilder( + "VersionedFileStatus{"); + sb.append(super.toString()); + sb.append("; version='").append(version).append('\''); + sb.append('}'); + return sb.toString(); + } } http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/SecureAzureBlobFileSystem.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/SecureAzureBlobFileSystem.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/SecureAzureBlobFileSystem.java index a6ad829..15fe542 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/SecureAzureBlobFileSystem.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/SecureAzureBlobFileSystem.java @@ -18,7 +18,6 @@ package org.apache.hadoop.fs.azurebfs; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes; @@ -26,7 +25,6 @@ import org.apache.hadoop.fs.azurebfs.constants.FileSystemUriSchemes; * A secure {@link org.apache.hadoop.fs.FileSystem} for reading and writing files stored on <a * href="http://store.azure.com/">Windows Azure</a> */ -@InterfaceAudience.Public @InterfaceStability.Evolving public class SecureAzureBlobFileSystem extends AzureBlobFileSystem { @Override @@ -38,4 +36,4 @@ public class SecureAzureBlobFileSystem extends AzureBlobFileSystem { public String getScheme() { return FileSystemUriSchemes.ABFS_SECURE_SCHEME; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/AbfsHttpConstants.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/AbfsHttpConstants.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/AbfsHttpConstants.java index 2ec4db0..f80bc60 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/AbfsHttpConstants.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/AbfsHttpConstants.java @@ -22,7 +22,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; /** - * Responsible to keep all constant keys used in abfs rest client here + * Responsible to keep all constant keys used in abfs rest client here. */ @InterfaceAudience.Public @InterfaceStability.Evolving http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpHeaderConfigurations.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpHeaderConfigurations.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpHeaderConfigurations.java index 9b7f9bc..4603b5f 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpHeaderConfigurations.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpHeaderConfigurations.java @@ -21,7 +21,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; /** - * Responsible to keep all abfs http headers here + * Responsible to keep all abfs http headers here. */ @InterfaceAudience.Public @InterfaceStability.Evolving http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpQueryParams.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpQueryParams.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpQueryParams.java index a9f7d33..f58d33a 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpQueryParams.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/HttpQueryParams.java @@ -21,7 +21,7 @@ import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; /** - * Responsible to keep all Http Query params here + * Responsible to keep all Http Query params here. */ @InterfaceAudience.Public @InterfaceStability.Evolving http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/annotations/ConfigurationValidationAnnotations.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/annotations/ConfigurationValidationAnnotations.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/annotations/ConfigurationValidationAnnotations.java index 462ebbc..82c571a 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/annotations/ConfigurationValidationAnnotations.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/annotations/ConfigurationValidationAnnotations.java @@ -25,12 +25,12 @@ import java.lang.annotation.Target; import org.apache.hadoop.classification.InterfaceStability; /** - * Definitions of Annotations for all types of the validators + * Definitions of Annotations for all types of the validators. */ @InterfaceStability.Evolving public class ConfigurationValidationAnnotations { /** - * Describes the requirements when validating the annotated int field + * Describes the requirements when validating the annotated int field. */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @@ -47,7 +47,7 @@ public class ConfigurationValidationAnnotations { } /** - * Describes the requirements when validating the annotated long field + * Describes the requirements when validating the annotated long field. */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @@ -64,7 +64,7 @@ public class ConfigurationValidationAnnotations { } /** - * Describes the requirements when validating the annotated String field + * Describes the requirements when validating the annotated String field. */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @@ -77,7 +77,7 @@ public class ConfigurationValidationAnnotations { } /** - * Describes the requirements when validating the annotated String field + * Describes the requirements when validating the annotated String field. */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @@ -90,7 +90,7 @@ public class ConfigurationValidationAnnotations { } /** - * Describes the requirements when validating the annotated boolean field + * Describes the requirements when validating the annotated boolean field. */ @Target({ ElementType.FIELD }) @Retention(RetentionPolicy.RUNTIME) @@ -101,4 +101,4 @@ public class ConfigurationValidationAnnotations { boolean ThrowIfInvalid() default false; } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/diagnostics/ConfigurationValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/diagnostics/ConfigurationValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/diagnostics/ConfigurationValidator.java index 796f785..d61229e 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/diagnostics/ConfigurationValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/diagnostics/ConfigurationValidator.java @@ -18,19 +18,17 @@ package org.apache.hadoop.fs.azurebfs.contracts.diagnostics; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationValueException; /** * ConfigurationValidator to validate the value of a configuration key - * @param <T> the type of the validator and the validated value + * @param <T> the type of the validator and the validated value. */ -@InterfaceAudience.Public @InterfaceStability.Evolving public interface ConfigurationValidator<T> { /** - * Validates the configValue + * Validates the configValue. * @return validated value of type T */ T validate(String configValue) throws InvalidConfigurationValueException; http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/AzureBlobFileSystemException.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/AzureBlobFileSystemException.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/AzureBlobFileSystemException.java index f31c680..9b1bead 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/AzureBlobFileSystemException.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/AzureBlobFileSystemException.java @@ -40,7 +40,7 @@ public abstract class AzureBlobFileSystemException extends IOException { @Override public String toString() { if (this.getMessage() == null && this.getCause() == null) { - return ""; + return "AzureBlobFileSystemException"; } if (this.getCause() == null) { @@ -53,4 +53,4 @@ public abstract class AzureBlobFileSystemException extends IOException { return this.getMessage() + this.getCause().toString(); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/InvalidUriException.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/InvalidUriException.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/InvalidUriException.java index a84495a..4fa0150 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/InvalidUriException.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/contracts/exceptions/InvalidUriException.java @@ -28,6 +28,6 @@ import org.apache.hadoop.classification.InterfaceStability; @InterfaceStability.Evolving public final class InvalidUriException extends AzureBlobFileSystemException { public InvalidUriException(String url) { - super(String.format("%s is invalid.", url)); + super(String.format("Invalid URI %s", url)); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/Base64StringConfigurationBasicValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/Base64StringConfigurationBasicValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/Base64StringConfigurationBasicValidator.java index 69288c5..6bb997b 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/Base64StringConfigurationBasicValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/Base64StringConfigurationBasicValidator.java @@ -26,7 +26,7 @@ import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationVa import org.apache.commons.codec.binary.Base64; /** -* String Base64 configuration value Validator +* String Base64 configuration value Validator. */ @InterfaceAudience.Public @InterfaceStability.Evolving http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/BooleanConfigurationBasicValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/BooleanConfigurationBasicValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/BooleanConfigurationBasicValidator.java index c9927ff..b16abdd 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/BooleanConfigurationBasicValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/BooleanConfigurationBasicValidator.java @@ -23,7 +23,7 @@ import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationValueException; /** - * Boolean configuration value validator + * Boolean configuration value validator. */ @InterfaceAudience.Public @InterfaceStability.Evolving @@ -47,4 +47,4 @@ public class BooleanConfigurationBasicValidator extends ConfigurationBasicValida throw new InvalidConfigurationValueException(getConfigKey()); } -} \ No newline at end of file +} http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/ConfigurationBasicValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/ConfigurationBasicValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/ConfigurationBasicValidator.java index 7da809c..8555a29 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/ConfigurationBasicValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/ConfigurationBasicValidator.java @@ -38,7 +38,7 @@ abstract class ConfigurationBasicValidator<T> implements ConfigurationValidator /** * This method handles the base case where the configValue is null, based on the throwIfInvalid it either throws or returns the defaultVal, - * otherwise it returns null indicating that the configValue needs to be validated further + * otherwise it returns null indicating that the configValue needs to be validated further. * @param configValue the configuration value set by the user * @return the defaultVal in case the configValue is null and not required to be set, null in case the configValue not null * @throws InvalidConfigurationValueException in case the configValue is null and required to be set http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/IntegerConfigurationBasicValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/IntegerConfigurationBasicValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/IntegerConfigurationBasicValidator.java index ec38cd8..26c7d2f 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/IntegerConfigurationBasicValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/IntegerConfigurationBasicValidator.java @@ -24,7 +24,7 @@ import org.apache.hadoop.fs.azurebfs.contracts.diagnostics.ConfigurationValidato import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationValueException; /** - * Integer configuration value Validator + * Integer configuration value Validator. */ @InterfaceAudience.Public @InterfaceStability.Evolving http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/LongConfigurationBasicValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/LongConfigurationBasicValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/LongConfigurationBasicValidator.java index 559dbc0..32ac14c 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/LongConfigurationBasicValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/LongConfigurationBasicValidator.java @@ -17,15 +17,13 @@ */ package org.apache.hadoop.fs.azurebfs.diagnostics; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.fs.azurebfs.contracts.diagnostics.ConfigurationValidator; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationValueException; /** - * Long configuration value Validator + * Long configuration value Validator. */ -@InterfaceAudience.Public @InterfaceStability.Evolving public class LongConfigurationBasicValidator extends ConfigurationBasicValidator<Long> implements ConfigurationValidator { private final long min; http://git-wip-us.apache.org/repos/asf/hadoop/blob/ce03a93f/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/StringConfigurationBasicValidator.java ---------------------------------------------------------------------- diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/StringConfigurationBasicValidator.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/StringConfigurationBasicValidator.java index d6f9c59..0d344d1 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/StringConfigurationBasicValidator.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/diagnostics/StringConfigurationBasicValidator.java @@ -18,15 +18,13 @@ package org.apache.hadoop.fs.azurebfs.diagnostics; -import org.apache.hadoop.classification.InterfaceAudience; import org.apache.hadoop.classification.InterfaceStability; import org.apache.hadoop.fs.azurebfs.contracts.diagnostics.ConfigurationValidator; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.InvalidConfigurationValueException; /** - * String configuration value Validator + * String configuration value Validator. */ -@InterfaceAudience.Public @InterfaceStability.Evolving public class StringConfigurationBasicValidator extends ConfigurationBasicValidator<String> implements ConfigurationValidator{ --------------------------------------------------------------------- To unsubscribe, e-mail: common-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: common-commits-h...@hadoop.apache.org