diff --git a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsRestOperation.java b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsRestOperation.java index 9c60f7c384..3761f4ddb9 100644 --- a/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsRestOperation.java +++ b/hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsRestOperation.java @@ -21,6 +21,7 @@ import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; +import java.net.UnknownHostException; import java.util.List; import org.slf4j.Logger; @@ -33,6 +34,8 @@ import org.apache.hadoop.fs.azurebfs.constants.HttpHeaderConfigurations; import org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator.HttpException; +import static org.apache.hadoop.fs.azurebfs.contracts.services.AzureServiceErrorCode.UNKNOWN; + /** * The AbfsRestOperation for Rest AbfsClient. */ @@ -173,6 +176,15 @@ private boolean executeHttpOperation(final int retryCount) throws AzureBlobFileS LOG.debug("HttpRequestFailure: " + method + "," + url, ex); } } + + if (ex instanceof UnknownHostException) { + throw new AbfsRestOperationException( + UNKNOWN.getStatusCode(), + UNKNOWN.getErrorCode(), + String.format("Can not reach endpoint: %s, please check the account setting in configuration file", ex.getMessage()), + ex); + } + if (!client.getRetryPolicy().shouldRetry(retryCount, -1)) { throw new InvalidAbfsRestOperationException(ex); } diff --git a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAbfsClient.java b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAbfsClient.java index 0f231d83a8..ddc1dceaab 100644 --- a/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAbfsClient.java +++ b/hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAbfsClient.java @@ -18,11 +18,19 @@ package org.apache.hadoop.fs.azurebfs; +import java.util.UUID; + +import org.junit.Assert; +import org.junit.Test; + +import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.azurebfs.contracts.exceptions.AbfsRestOperationException; import org.apache.hadoop.fs.azurebfs.services.AbfsClient; import org.apache.hadoop.fs.azurebfs.services.AbfsRestOperation; -import org.junit.Assert; -import org.junit.Test; + +import static org.apache.hadoop.fs.CommonConfigurationKeysPublic.FS_DEFAULT_NAME_KEY; +import static org.apache.hadoop.fs.azurebfs.constants.TestConfigurationKeys.FS_AZURE_ACCOUNT_KEY; +import static org.apache.hadoop.test.LambdaTestUtils.intercept; /** * Test continuation token which has equal sign. @@ -46,4 +54,19 @@ public void testContinuationTokenHavingEqualSign() throws Exception { Assert.assertEquals("InvalidQueryParameterValue", ex.getErrorCode().getErrorCode()); } } + + @Test + public void verifyUnknownHost() throws Exception { + AbfsConfiguration conf = this.getConfiguration(); + String accountName = this.getAccountName(); + String fakeAccountName = "fake" + UUID.randomUUID() + accountName.substring(accountName.indexOf(".")); + + String fsDefaultFS = conf.get(FS_DEFAULT_NAME_KEY); + conf.set(FS_DEFAULT_NAME_KEY, fsDefaultFS.replace(accountName, fakeAccountName)); + conf.set(FS_AZURE_ACCOUNT_KEY + "." + fakeAccountName, this.getAccountKey()); + + intercept(AbfsRestOperationException.class, + "Can not reach endpoint: " + fakeAccountName, + () -> FileSystem.get(conf.getRawConfiguration())); + } }