HADOOP-15662. Better exception handling of DNS errors.
authorDa Zhou <da.zhou@microsoft.com>
Thu, 10 Jan 2019 12:02:58 +0000 (12:02 +0000)
committerSteve Loughran <stevel@apache.org>
Thu, 10 Jan 2019 12:02:58 +0000 (12:02 +0000)
Contributed by Da Zhou.

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/AbfsRestOperation.java
hadoop-tools/hadoop-azure/src/test/java/org/apache/hadoop/fs/azurebfs/ITestAbfsClient.java

index 9c60f7c..3761f4d 100644 (file)
@@ -21,6 +21,7 @@ package org.apache.hadoop.fs.azurebfs.services;
 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.contracts.exceptions.InvalidAbfsRestOperati
 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 @@ public class AbfsRestOperation {
           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);
       }
index 0f231d8..ddc1dce 100644 (file)
 
 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 final class ITestAbfsClient extends AbstractAbfsIntegrationTest {
       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()));
+  }
 }