Return-Path: X-Original-To: apmail-mesos-commits-archive@www.apache.org Delivered-To: apmail-mesos-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9E69910653 for ; Wed, 22 Jan 2014 23:59:47 +0000 (UTC) Received: (qmail 7953 invoked by uid 500); 22 Jan 2014 23:59:47 -0000 Delivered-To: apmail-mesos-commits-archive@mesos.apache.org Received: (qmail 7858 invoked by uid 500); 22 Jan 2014 23:59:46 -0000 Mailing-List: contact commits-help@mesos.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@mesos.apache.org Delivered-To: mailing list commits@mesos.apache.org Received: (qmail 7824 invoked by uid 99); 22 Jan 2014 23:59:45 -0000 Received: from tyr.zones.apache.org (HELO tyr.zones.apache.org) (140.211.11.114) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 22 Jan 2014 23:59:44 +0000 Received: by tyr.zones.apache.org (Postfix, from userid 65534) id A0B068AC08A; Wed, 22 Jan 2014 23:59:44 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: vinodkone@apache.org To: commits@mesos.apache.org Date: Wed, 22 Jan 2014 23:59:47 -0000 Message-Id: <591b80fdda8a4d6aa1f9c5564b2d23dd@git.apache.org> In-Reply-To: <57f81842e9cb43eca0307377df72b705@git.apache.org> References: <57f81842e9cb43eca0307377df72b705@git.apache.org> X-Mailer: ASF-Git Admin Mailer Subject: [4/4] git commit: Updated detector to understand old (unlabelled) and new (labelled) master znode formats. Updated detector to understand old (unlabelled) and new (labelled) master znode formats. Review: https://reviews.apache.org/r/17172 Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/4382a0f6 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/4382a0f6 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/4382a0f6 Branch: refs/heads/master Commit: 4382a0f63c29145bc540e6abb1f9f289fb8b1311 Parents: 326172e Author: Vinod Kone Authored: Tue Jan 21 20:11:25 2014 -0800 Committer: Vinod Kone Committed: Wed Jan 22 15:51:12 2014 -0800 ---------------------------------------------------------------------- include/mesos/mesos.proto | 1 + src/master/constants.cpp | 3 +++ src/master/constants.hpp | 5 +++++ src/master/detector.cpp | 41 +++++++++++++++++++++++++++++++++++------ src/zookeeper/detector.cpp | 2 +- src/zookeeper/group.cpp | 4 ++-- src/zookeeper/group.hpp | 9 +++++++-- 7 files changed, 54 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/include/mesos/mesos.proto ---------------------------------------------------------------------- diff --git a/include/mesos/mesos.proto b/include/mesos/mesos.proto index 655f867..1503e73 100644 --- a/include/mesos/mesos.proto +++ b/include/mesos/mesos.proto @@ -160,6 +160,7 @@ message MasterInfo { required string id = 1; required uint32 ip = 2; required uint32 port = 3 [default = 5050]; + optional string pid = 4; } http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/src/master/constants.cpp ---------------------------------------------------------------------- diff --git a/src/master/constants.cpp b/src/master/constants.cpp index 0b7c9f7..8a48bbb 100644 --- a/src/master/constants.cpp +++ b/src/master/constants.cpp @@ -16,6 +16,8 @@ * limitations under the License. */ +#include + #include #include "master/constants.hpp" @@ -33,6 +35,7 @@ const uint32_t MAX_COMPLETED_FRAMEWORKS = 50; const uint32_t MAX_COMPLETED_TASKS_PER_FRAMEWORK = 1000; const Duration WHITELIST_WATCH_INTERVAL = Seconds(5); const uint32_t TASK_LIMIT = 100; +const std::string MASTER_INFO_LABEL = "info"; } // namespace mesos { } // namespace internal { http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/src/master/constants.hpp ---------------------------------------------------------------------- diff --git a/src/master/constants.hpp b/src/master/constants.hpp index 8498c9b..cdaaad0 100644 --- a/src/master/constants.hpp +++ b/src/master/constants.hpp @@ -21,6 +21,8 @@ #include +#include + #include namespace mesos { @@ -65,6 +67,9 @@ extern const Duration WHITELIST_WATCH_INTERVAL; // Default number of tasks (limit) for /master/tasks.json endpoint extern const uint32_t TASK_LIMIT; +// Label used by the Leader Contender and Detector. +extern const std::string MASTER_INFO_LABEL; + } // namespace mesos { } // namespace internal { } // namespace master { http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/src/master/detector.cpp ---------------------------------------------------------------------- diff --git a/src/master/detector.cpp b/src/master/detector.cpp index cf337cf..2b169c5 100644 --- a/src/master/detector.cpp +++ b/src/master/detector.cpp @@ -29,8 +29,11 @@ #include #include +#include "master/constants.hpp" #include "master/detector.hpp" +#include "messages/messages.hpp" + #include "zookeeper/detector.hpp" #include "zookeeper/group.hpp" #include "zookeeper/url.hpp" @@ -46,7 +49,6 @@ namespace internal { const Duration MASTER_DETECTOR_ZK_SESSION_TIMEOUT = Seconds(10); - class StandaloneMasterDetectorProcess : public Process { @@ -81,7 +83,7 @@ private: void detected(const Future >& leader); // Invoked when we have fetched the data associated with the leader. - void fetched(const Future& data); + void fetched(const Group::Membership& membership, const Future& data); Owned group; LeaderDetector detector; @@ -294,7 +296,7 @@ void ZooKeeperMasterDetectorProcess::detected( } else { // Fetch the data associated with the leader. group->data(_leader.get().get()) - .onAny(defer(self(), &Self::fetched, lambda::_1)); + .onAny(defer(self(), &Self::fetched, _leader.get().get(), lambda::_1)); } // Keep trying to detect leadership changes. @@ -303,7 +305,9 @@ void ZooKeeperMasterDetectorProcess::detected( } -void ZooKeeperMasterDetectorProcess::fetched(const Future& data) +void ZooKeeperMasterDetectorProcess::fetched( + const Group::Membership& membership, + const Future& data) { CHECK(!data.isDiscarded()); @@ -317,8 +321,33 @@ void ZooKeeperMasterDetectorProcess::fetched(const Future& data) return; } - // Cache the master for subsequent requests. - leader = UPID(data.get()); + // Parse the data based on the membership label and cache the + // leader for subsequent requests. + Option label = membership.label(); + if (label.isNone()) { + leader = UPID(data.get()); + } else if (label.isSome() && label.get() == master::MASTER_INFO_LABEL) { + MasterInfo info; + if (!info.ParseFromString(data.get())) { + leader = None(); + foreach (Promise >* promise, promises) { + promise->fail("Failed to parse data into MasterInfo"); + delete promise; + } + promises.clear(); + return; + } + leader = UPID(info.pid()); + } else { + leader = None(); + foreach (Promise >* promise, promises) { + promise->fail("Failed to parse data of unknown label " + label.get()); + delete promise; + } + promises.clear(); + return; + } + LOG(INFO) << "A new leading master (UPID=" << leader.get() << ") is detected"; foreach (Promise >* promise, promises) { http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/src/zookeeper/detector.cpp ---------------------------------------------------------------------- diff --git a/src/zookeeper/detector.cpp b/src/zookeeper/detector.cpp index 2759a2f..e186e51 100644 --- a/src/zookeeper/detector.cpp +++ b/src/zookeeper/detector.cpp @@ -133,7 +133,7 @@ void LeaderDetectorProcess::watched(const Future >& membe if (current != leader) { LOG(INFO) << "Detected a new leader: " << (current.isSome() - ? "'(id='" + stringify(current.get().id()) + "')" + ? "(id='" + stringify(current.get().id()) + "')" : "None"); foreach (Promise >* promise, promises) { http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/src/zookeeper/group.cpp ---------------------------------------------------------------------- diff --git a/src/zookeeper/group.cpp b/src/zookeeper/group.cpp index a50da22..ecb6c00 100644 --- a/src/zookeeper/group.cpp +++ b/src/zookeeper/group.cpp @@ -898,8 +898,8 @@ string GroupProcess::zkBasename(const Group::Membership& membership) Try sequence = strings::format("%.*d", 10, membership.sequence); CHECK_SOME(sequence); - return membership.label.isSome() - ? (membership.label.get() + "_" + sequence.get()) + return membership.label_.isSome() + ? (membership.label_.get() + "_" + sequence.get()) : sequence.get(); } http://git-wip-us.apache.org/repos/asf/mesos/blob/4382a0f6/src/zookeeper/group.hpp ---------------------------------------------------------------------- diff --git a/src/zookeeper/group.hpp b/src/zookeeper/group.hpp index 1ce1519..e51ebb2 100644 --- a/src/zookeeper/group.hpp +++ b/src/zookeeper/group.hpp @@ -74,6 +74,11 @@ public: return sequence; } + Option label() const + { + return label_; + } + // Returns a future that is only satisfied once this membership // has been cancelled. In which case, the value of the future is // true if you own this membership and cancelled it by invoking @@ -91,10 +96,10 @@ public: Membership(int32_t _sequence, const Option& _label, const process::Future& cancelled) - : sequence(_sequence), label(_label), cancelled_(cancelled) {} + : sequence(_sequence), label_(_label), cancelled_(cancelled) {} const int32_t sequence; - const Option label; + const Option label_; process::Future cancelled_; };