HDFS-11027: libbhdfs++: Don't retry if there is an authentication failure. Contributed by Xiaowei Zhu.
Project: http://git-wip-us.apache.org/repos/asf/hadoop/repo Commit: http://git-wip-us.apache.org/repos/asf/hadoop/commit/b7d9a0f8 Tree: http://git-wip-us.apache.org/repos/asf/hadoop/tree/b7d9a0f8 Diff: http://git-wip-us.apache.org/repos/asf/hadoop/diff/b7d9a0f8 Branch: refs/heads/HDFS-8707 Commit: b7d9a0f827c0688fa1ebe6b71f0e0a4839d73ea2 Parents: 59a3926 Author: James <[email protected]> Authored: Mon Oct 24 10:47:15 2016 -0400 Committer: James Clampffer <[email protected]> Committed: Thu Mar 22 17:19:47 2018 -0400 ---------------------------------------------------------------------- .../src/main/native/libhdfspp/include/hdfspp/status.h | 3 +++ .../src/main/native/libhdfspp/lib/common/status.cc | 13 ++++++++++++- .../src/main/native/libhdfspp/lib/rpc/rpc_engine.cc | 4 +++- 3 files changed, 18 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7d9a0f8/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h index ffbb2bf..39cf8c6 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/include/hdfspp/status.h @@ -62,6 +62,9 @@ class Status { // get error code int code() const { return code_; } + // if retry can possibly recover an error + bool notWorthRetry() const; + enum Code { kOk = 0, kInvalidArgument = static_cast<unsigned>(std::errc::invalid_argument), http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7d9a0f8/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc index 540f8c1..15d304a 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/common/status.cc @@ -22,6 +22,7 @@ #include <sstream> #include <cstring> #include <map> +#include <set> namespace hdfs { @@ -49,6 +50,12 @@ const static std::map<std::string, int> kKnownServerExceptionClasses = { {kPathIsNotEmptyDirectoryException, Status::kPathIsNotEmptyDirectory} }; +// Errors that retry cannot fix. TODO: complete the list. +const static std::set<int> noRetryExceptions = { + Status::kPermissionDenied, + Status::kAuthenticationFailed, + Status::kAccessControlException +}; Status::Status(int code, const char *msg1) : code_(code) { @@ -120,7 +127,7 @@ Status Status::Exception(const char *exception_class_name, const char *error_mes } Status Status::Error(const char *error_message) { - return Status(kAuthenticationFailed, error_message); + return Exception("Exception", error_message); } Status Status::AuthenticationFailed() { @@ -147,4 +154,8 @@ std::string Status::ToString() const { return ss.str(); } +bool Status::notWorthRetry() const { + return noRetryExceptions.find(code_) != noRetryExceptions.end(); +} + } http://git-wip-us.apache.org/repos/asf/hadoop/blob/b7d9a0f8/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_engine.cc ---------------------------------------------------------------------- diff --git a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_engine.cc b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_engine.cc index 72a0c55..7c280b8 100644 --- a/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_engine.cc +++ b/hadoop-hdfs-project/hadoop-hdfs-native-client/src/main/native/libhdfspp/lib/rpc/rpc_engine.cc @@ -322,7 +322,9 @@ void RpcEngine::RpcCommsError( RetryAction retry = RetryAction::fail(""); // Default to fail - if (retry_policy()) { + if (status.notWorthRetry()) { + retry = RetryAction::fail(status.ToString().c_str()); + } else if (retry_policy()) { retry = retry_policy()->ShouldRetry(status, req->IncrementRetryCount(), req->get_failover_count(), true); } --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
