Introduced an allocator helper function to track used resources. This patch introduces a helper to track allocated resources. It encapsulates all needed updates to the various sorters for reusability.
Review: https://reviews.apache.org/r/64136/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/8c0f8a40 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/8c0f8a40 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/8c0f8a40 Branch: refs/heads/master Commit: 8c0f8a40b13fba93b881da02c4b33a7d1c9f01ee Parents: 42c14e1 Author: Benjamin Bannier <[email protected]> Authored: Thu Nov 30 17:03:45 2017 +0100 Committer: Benjamin Bannier <[email protected]> Committed: Thu Nov 30 18:33:58 2017 +0100 ---------------------------------------------------------------------- src/master/allocator/mesos/hierarchical.cpp | 93 +++++++++++------------- src/master/allocator/mesos/hierarchical.hpp | 5 ++ 2 files changed, 49 insertions(+), 49 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/8c0f8a40/src/master/allocator/mesos/hierarchical.cpp ---------------------------------------------------------------------- diff --git a/src/master/allocator/mesos/hierarchical.cpp b/src/master/allocator/mesos/hierarchical.cpp index 5ce9cea..6b0be6a 100644 --- a/src/master/allocator/mesos/hierarchical.cpp +++ b/src/master/allocator/mesos/hierarchical.cpp @@ -287,20 +287,7 @@ void HierarchicalAllocatorProcess::addFramework( continue; } - hashmap<string, Resources> allocations = resources.allocations(); - - foreachpair (const string& role, const Resources& allocation, allocations) { - roleSorter->allocated(role, slaveId, allocation); - frameworkSorters.at(role)->add(slaveId, allocation); - frameworkSorters.at(role)->allocated( - frameworkId.value(), slaveId, allocation); - - if (quotas.contains(role)) { - // See comment at `quotaRoleSorter` declaration - // regarding non-revocable. - quotaRoleSorter->allocated(role, slaveId, allocation.nonRevocable()); - } - } + trackAllocatedResources(slaveId, {{frameworkId, resources}}); } LOG(INFO) << "Added framework " << frameworkId; @@ -523,41 +510,7 @@ void HierarchicalAllocatorProcess::addSlave( // See comment at `quotaRoleSorter` declaration regarding non-revocable. quotaRoleSorter->add(slaveId, total.nonRevocable()); - // Update the allocation for each framework. - foreachpair (const FrameworkID& frameworkId, - const Resources& used_, - used) { - if (!frameworks.contains(frameworkId)) { - continue; - } - - foreachpair (const string& role, - const Resources& allocated, - used_.allocations()) { - // The framework has resources allocated to this role but it may - // or may not be subscribed to the role. Either way, we need to - // track the framework under the role. - if (!isFrameworkTrackedUnderRole(frameworkId, role)) { - trackFrameworkUnderRole(frameworkId, role); - } - - // TODO(bmahler): Validate that the reserved resources have the - // framework's role. - CHECK(roleSorter->contains(role)); - CHECK(frameworkSorters.contains(role)); - CHECK(frameworkSorters.at(role)->contains(frameworkId.value())); - - roleSorter->allocated(role, slaveId, allocated); - frameworkSorters.at(role)->add(slaveId, allocated); - frameworkSorters.at(role)->allocated( - frameworkId.value(), slaveId, allocated); - - if (quotas.contains(role)) { - // See comment at `quotaRoleSorter` declaration regarding non-revocable. - quotaRoleSorter->allocated(role, slaveId, allocated.nonRevocable()); - } - } - } + trackAllocatedResources(slaveId, used); slaves[slaveId] = Slave(); @@ -2419,6 +2372,48 @@ bool HierarchicalAllocatorProcess::isRemoteSlave(const Slave& slave) const return masterRegion != slaveRegion; } + +void HierarchicalAllocatorProcess::trackAllocatedResources( + const SlaveID& slaveId, + const hashmap<FrameworkID, Resources>& used) +{ + // Update the allocation for each framework. + foreachpair (const FrameworkID& frameworkId, + const Resources& used_, + used) { + if (!frameworks.contains(frameworkId)) { + continue; + } + + foreachpair (const string& role, + const Resources& allocated, + used_.allocations()) { + // The framework has resources allocated to this role but it may + // or may not be subscribed to the role. Either way, we need to + // track the framework under the role. + if (!isFrameworkTrackedUnderRole(frameworkId, role)) { + trackFrameworkUnderRole(frameworkId, role); + } + + // TODO(bmahler): Validate that the reserved resources have the + // framework's role. + CHECK(roleSorter->contains(role)); + CHECK(frameworkSorters.contains(role)); + CHECK(frameworkSorters.at(role)->contains(frameworkId.value())); + + roleSorter->allocated(role, slaveId, allocated); + frameworkSorters.at(role)->add(slaveId, allocated); + frameworkSorters.at(role)->allocated( + frameworkId.value(), slaveId, allocated); + + if (quotas.contains(role)) { + // See comment at `quotaRoleSorter` declaration regarding non-revocable. + quotaRoleSorter->allocated(role, slaveId, allocated.nonRevocable()); + } + } + } +} + } // namespace internal { } // namespace allocator { } // namespace master { http://git-wip-us.apache.org/repos/asf/mesos/blob/8c0f8a40/src/master/allocator/mesos/hierarchical.hpp ---------------------------------------------------------------------- diff --git a/src/master/allocator/mesos/hierarchical.hpp b/src/master/allocator/mesos/hierarchical.hpp index 2c4832b..fd604c9 100644 --- a/src/master/allocator/mesos/hierarchical.hpp +++ b/src/master/allocator/mesos/hierarchical.hpp @@ -541,6 +541,11 @@ private: // different region than the master. This can only be the case if // the agent and the master are both configured with a fault domain. bool isRemoteSlave(const Slave& slave) const; + + // Helper to track used resources on an agent. + void trackAllocatedResources( + const SlaveID& slaveId, + const hashmap<FrameworkID, Resources>& used); };
