You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2014/10/07 03:25:17 UTC

git commit: Fixed ~Authenticator() to discard the promise.

Repository: mesos
Updated Branches:
  refs/heads/master 58da2a86e -> a62dc9dd3


Fixed ~Authenticator() to discard the promise.

Review: https://reviews.apache.org/r/26389


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/a62dc9dd
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/a62dc9dd
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/a62dc9dd

Branch: refs/heads/master
Commit: a62dc9dd3900758f1ac4932856227fe3707325de
Parents: 58da2a8
Author: Vinod Kone <vi...@gmail.com>
Authored: Sat Oct 4 15:16:18 2014 -0700
Committer: Vinod Kone <vi...@gmail.com>
Committed: Mon Oct 6 18:24:30 2014 -0700

----------------------------------------------------------------------
 src/sasl/authenticatee.hpp |  5 ++++
 src/sasl/authenticator.hpp |  5 ++++
 src/tests/sasl_tests.cpp   | 57 +++++++++++++++++++++++++++++++++++++++++
 3 files changed, 67 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/a62dc9dd/src/sasl/authenticatee.hpp
----------------------------------------------------------------------
diff --git a/src/sasl/authenticatee.hpp b/src/sasl/authenticatee.hpp
index dd68704..ec2c841 100644
--- a/src/sasl/authenticatee.hpp
+++ b/src/sasl/authenticatee.hpp
@@ -95,6 +95,11 @@ public:
     free(secret);
   }
 
+  virtual void finalize()
+  {
+    discarded(); // Fail the promise.
+  }
+
   process::Future<bool> authenticate(const process::UPID& pid)
   {
     static process::Once* initialize = new process::Once();

http://git-wip-us.apache.org/repos/asf/mesos/blob/a62dc9dd/src/sasl/authenticator.hpp
----------------------------------------------------------------------
diff --git a/src/sasl/authenticator.hpp b/src/sasl/authenticator.hpp
index 35ab794..a3ae2a5 100644
--- a/src/sasl/authenticator.hpp
+++ b/src/sasl/authenticator.hpp
@@ -85,6 +85,11 @@ public:
     }
   }
 
+  virtual void finalize()
+  {
+    discarded(); // Fail the promise.
+  }
+
   process::Future<Option<std::string> > authenticate()
   {
     static process::Once* initialize = new process::Once();

http://git-wip-us.apache.org/repos/asf/mesos/blob/a62dc9dd/src/tests/sasl_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/sasl_tests.cpp b/src/tests/sasl_tests.cpp
index 59e1c95..30556fa 100644
--- a/src/tests/sasl_tests.cpp
+++ b/src/tests/sasl_tests.cpp
@@ -29,6 +29,10 @@
 #include "sasl/authenticatee.hpp"
 #include "sasl/authenticator.hpp"
 
+#include "tests/mesos.hpp"
+
+using namespace mesos::internal::tests;
+
 using namespace process;
 
 using std::map;
@@ -147,6 +151,59 @@ TEST(SASL, failed2)
   terminate(pid);
 }
 
+
+// This test verifies that the pending future returned by
+// 'Authenticator::authenticate()' is properly failed when the Authenticator is
+// destructed in the middle of authentication.
+TEST(SASL, AuthenticatorDestructionRace)
+{
+  // Set up secrets.
+  map<string, string> secrets;
+  secrets["benh"] = "secret";
+  sasl::secrets::load(secrets);
+
+  // Launch a dummy process (somebody to send the AuthenticateMessage).
+  UPID pid = spawn(new ProcessBase(), true);
+
+  Credential credential;
+  credential.set_principal("benh");
+  credential.set_secret("secret");
+
+  Authenticatee authenticatee(credential, UPID());
+
+  Future<Message> message =
+    FUTURE_MESSAGE(Eq(AuthenticateMessage().GetTypeName()), _, _);
+
+  Future<bool> client = authenticatee.authenticate(pid);
+
+  AWAIT_READY(message);
+
+  Authenticator* authenticator = new Authenticator(message.get().from);
+
+  // Drop the AuthenticationStepMessage from authenticator to keep
+  // the authentication from getting completed.
+  Future<AuthenticationStepMessage> authenticationStepMessage =
+    DROP_PROTOBUF(AuthenticationStepMessage(), _, _);
+
+  Future<Option<string> > principal = authenticator->authenticate();
+
+  AWAIT_READY(authenticationStepMessage);
+
+  // At this point 'AuthenticatorProcess::authenticate()' has been
+  // executed and its promise associated with the promise returned
+  // by 'Authenticator::authenticate()'.
+  // Authentication should be pending.
+  ASSERT_TRUE(principal.isPending());
+
+  // Now delete the authenticator.
+  delete authenticator;
+
+  // The future should be failed at this point.
+  AWAIT_FAILED(principal);
+
+  terminate(pid);
+}
+
 } // namespace sasl {
 } // namespace internal {
 } // namespace mesos {