Repository: mesos Updated Branches: refs/heads/master 6bd9b65b9 -> 0a6b820d1
Fixed a deadlock introduced by the libprocess authentication code. Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/0a6b820d Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/0a6b820d Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/0a6b820d Branch: refs/heads/master Commit: 0a6b820d1502af8aeefff7524d1d0ce9ad8af69c Parents: 6bd9b65 Author: Benjamin Mahler <[email protected]> Authored: Sat Dec 12 10:27:14 2015 -0800 Committer: Benjamin Mahler <[email protected]> Committed: Sat Dec 12 10:27:14 2015 -0800 ---------------------------------------------------------------------- 3rdparty/libprocess/src/process.cpp | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/0a6b820d/3rdparty/libprocess/src/process.cpp ---------------------------------------------------------------------- diff --git a/3rdparty/libprocess/src/process.cpp b/3rdparty/libprocess/src/process.cpp index 43c83e3..af3cefb 100644 --- a/3rdparty/libprocess/src/process.cpp +++ b/3rdparty/libprocess/src/process.cpp @@ -197,6 +197,9 @@ public: // passed on to the route handlers. Future<Option<AuthenticationResult>> authenticate(const Request& request); +protected: + void initialize() override; + private: // Starts "waiting" on the next available future response. void next(); @@ -236,7 +239,7 @@ private: // the authentication router does expose ordered completion // of its Futures (it doesn't have the knowledge of sockets // necessary to do it in a per-connection manner). - Sequence authentications; + Owned<Sequence> authentications; }; @@ -1077,6 +1080,16 @@ HttpProxy::~HttpProxy() } +void HttpProxy::initialize() +{ + // We have to construct the sequence outside of the HttpProxy + // constructor in order to prevent a deadlock between the + // SocketManager and the ProcessManager (see the comment in + // SocketManager::proxy). + authentications.reset(new Sequence()); +} + + void HttpProxy::enqueue(const Response& response, const Request& request) { handle(Future<Response>(response), request); @@ -1104,7 +1117,7 @@ Future<Option<AuthenticationResult>> HttpProxy::authenticate( Future<Option<AuthenticationResult>> authentication = authentication_router->authenticate(request); - return authentications.add<Option<AuthenticationResult>>( + return authentications->add<Option<AuthenticationResult>>( [=]() { return authentication; }); }
