You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by jo...@apache.org on 2015/09/14 19:58:57 UTC
[13/16] mesos git commit: Maintenance Primitives: Added
updateInverseOffer to Allocator.
Maintenance Primitives: Added updateInverseOffer to Allocator.
Review: https://reviews.apache.org/r/37280
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/42f9ce5d
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/42f9ce5d
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/42f9ce5d
Branch: refs/heads/master
Commit: 42f9ce5d61bf3e2c48d6a3de86d2e3e5cd3f6b57
Parents: 6c568ba
Author: Joris Van Remoortere <jo...@gmail.com>
Authored: Sun Aug 30 14:23:51 2015 -0400
Committer: Joris Van Remoortere <jo...@gmail.com>
Committed: Mon Sep 14 13:58:37 2015 -0400
----------------------------------------------------------------------
include/mesos/master/allocator.hpp | 10 +++++
src/master/allocator/mesos/allocator.hpp | 25 ++++++++++++
src/master/allocator/mesos/hierarchical.hpp | 50 ++++++++++++++++++++++++
src/tests/mesos.hpp | 16 ++++++++
4 files changed, 101 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/42f9ce5d/include/mesos/master/allocator.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/master/allocator.hpp b/include/mesos/master/allocator.hpp
index 18d31ef..fb09e2a 100644
--- a/include/mesos/master/allocator.hpp
+++ b/include/mesos/master/allocator.hpp
@@ -149,6 +149,16 @@ public:
const SlaveID& slaveId,
const Option<Unavailability>& unavailability) = 0;
+ // Informs the allocator that the inverse offer has been responded to or
+ // revoked. If `status` is not set then the inverse offer was not responded
+ // to, possibly because the offer timed out or was rescinded. This might
+ // require the implementation of the function to remove any inverse offers
+ // that are outstanding.
+ virtual void updateInverseOffer(
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const Option<InverseOfferStatus>& status) = 0;
+
// Informs the Allocator to recover resources that are considered
// used by the framework.
virtual void recoverResources(
http://git-wip-us.apache.org/repos/asf/mesos/blob/42f9ce5d/src/master/allocator/mesos/allocator.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/allocator.hpp b/src/master/allocator/mesos/allocator.hpp
index 124dd3d..171548b 100644
--- a/src/master/allocator/mesos/allocator.hpp
+++ b/src/master/allocator/mesos/allocator.hpp
@@ -116,6 +116,11 @@ public:
const SlaveID& slaveId,
const Option<Unavailability>& unavailability);
+ void updateInverseOffer(
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const Option<mesos::master::InverseOfferStatus>& status);
+
void recoverResources(
const FrameworkID& frameworkId,
const SlaveID& slaveId,
@@ -215,6 +220,11 @@ public:
const SlaveID& slaveId,
const Option<Unavailability>& unavailability) = 0;
+ virtual void updateInverseOffer(
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const Option<mesos::master::InverseOfferStatus>& status) = 0;
+
virtual void recoverResources(
const FrameworkID& frameworkId,
const SlaveID& slaveId,
@@ -467,6 +477,21 @@ inline void MesosAllocator<AllocatorProcess>::updateUnavailability(
template <typename AllocatorProcess>
+inline void MesosAllocator<AllocatorProcess>::updateInverseOffer(
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const Option<mesos::master::InverseOfferStatus>& status)
+{
+ return process::dispatch(
+ process,
+ &MesosAllocatorProcess::updateInverseOffer,
+ slaveId,
+ frameworkId,
+ status);
+}
+
+
+template <typename AllocatorProcess>
inline void MesosAllocator<AllocatorProcess>::recoverResources(
const FrameworkID& frameworkId,
const SlaveID& slaveId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/42f9ce5d/src/master/allocator/mesos/hierarchical.hpp
----------------------------------------------------------------------
diff --git a/src/master/allocator/mesos/hierarchical.hpp b/src/master/allocator/mesos/hierarchical.hpp
index 8ae7475..8e3ec9c 100644
--- a/src/master/allocator/mesos/hierarchical.hpp
+++ b/src/master/allocator/mesos/hierarchical.hpp
@@ -154,6 +154,11 @@ public:
const SlaveID& slaveId,
const Option<Unavailability>& unavailability);
+ void updateInverseOffer(
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const Option<mesos::master::InverseOfferStatus>& status);
+
void recoverResources(
const FrameworkID& frameworkId,
const SlaveID& slaveId,
@@ -861,6 +866,51 @@ HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::updateUnavailability(
template <class RoleSorter, class FrameworkSorter>
void
+HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::updateInverseOffer(
+ const SlaveID& slaveId,
+ const FrameworkID& frameworkId,
+ const Option<mesos::master::InverseOfferStatus>& status)
+{
+ CHECK(initialized);
+ CHECK(frameworks.contains(frameworkId));
+ CHECK(slaves.contains(slaveId));
+ CHECK(slaves[slaveId].maintenance.isSome());
+
+ // NOTE: We currently implement maintenance in the allocator to be able to
+ // leverage state and features such as the FrameworkSorter and Filters.
+
+ // We use a reference by alias because we intend to modify the
+ // `maintenance` and to improve readability.
+ typename Slave::Maintenance& maintenance = slaves[slaveId].maintenance.get();
+
+ // Only handle inverse offers that we currently have outstanding. If it is not
+ // currently outstanding this means it is old and can be safely ignored.
+ if (maintenance.offersOutstanding.contains(frameworkId)) {
+
+ // We always remove the outstanding offer so that we will send a new offer
+ // out the next time we schedule inverse offers.
+ maintenance.offersOutstanding.erase(frameworkId);
+
+ // If the response is `Some`, this means the framework responded. Otherwise
+ // if it is `None` the inverse offer timed out or was rescinded.
+ if (status.isSome()) {
+ // For now we don't allow frameworks to respond with `UNKNOWN`. The caller
+ // should guard against this. This goes against the pattern of not
+ // checking external invariants; however, the allocator and master are
+ // currently so tightly coupled that this check is valuable.
+ CHECK_NE(
+ status.get().status(),
+ mesos::master::InverseOfferStatus::UNKNOWN);
+
+ // If the framework responded, we update our state to match.
+ maintenance.statuses[frameworkId].CopyFrom(status.get());
+ }
+ }
+}
+
+
+template <class RoleSorter, class FrameworkSorter>
+void
HierarchicalAllocatorProcess<RoleSorter, FrameworkSorter>::recoverResources(
const FrameworkID& frameworkId,
const SlaveID& slaveId,
http://git-wip-us.apache.org/repos/asf/mesos/blob/42f9ce5d/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index 858618f..3db97ac 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -1359,6 +1359,12 @@ ACTION_P(InvokeUpdateUnavailability, allocator)
}
+ACTION_P(InvokeUpdateInverseOffer, allocator)
+{
+ return allocator->real->updateInverseOffer(arg0, arg1, arg2);
+}
+
+
ACTION_P(InvokeRecoverResources, allocator)
{
allocator->real->recoverResources(arg0, arg1, arg2, arg3);
@@ -1487,6 +1493,11 @@ public:
EXPECT_CALL(*this, updateUnavailability(_, _))
.WillRepeatedly(DoDefault());
+ ON_CALL(*this, updateInverseOffer(_, _, _))
+ .WillByDefault(InvokeUpdateInverseOffer(this));
+ EXPECT_CALL(*this, updateInverseOffer(_, _, _))
+ .WillRepeatedly(DoDefault());
+
ON_CALL(*this, recoverResources(_, _, _, _))
.WillByDefault(InvokeRecoverResources(this));
EXPECT_CALL(*this, recoverResources(_, _, _, _))
@@ -1568,6 +1579,11 @@ public:
const SlaveID&,
const Option<Unavailability>&));
+ MOCK_METHOD3(updateInverseOffer, void(
+ const SlaveID&,
+ const FrameworkID&,
+ const Option<mesos::master::InverseOfferStatus>&));
+
MOCK_METHOD4(recoverResources, void(
const FrameworkID&,
const SlaveID&,