You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by bm...@apache.org on 2018/05/03 00:01:08 UTC
[12/20] mesos git commit: Added a utility to shrink scalar resource
while keeping its meta-data.
Added a utility to shrink scalar resource while keeping its meta-data.
This is particularly useful when performing fine-grained allocation
of resources by "chopping off" some of the resources when possible.
Note that some resources, e.g. MOUNT volumes, cannot be shrunk.
Review: https://reviews.apache.org/r/64798/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/3f7b7f95
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/3f7b7f95
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/3f7b7f95
Branch: refs/heads/1.4.x
Commit: 3f7b7f95de18c01996a507fd8b20bdacd6ca9787
Parents: 2324ec8
Author: Meng Zhu <mz...@mesosphere.io>
Authored: Fri Dec 22 13:49:27 2017 -0800
Committer: Benjamin Mahler <bm...@apache.org>
Committed: Wed May 2 16:44:18 2018 -0700
----------------------------------------------------------------------
include/mesos/resources.hpp | 7 +++++++
include/mesos/v1/resources.hpp | 7 +++++++
src/common/resources.cpp | 23 +++++++++++++++++++++++
src/v1/resources.cpp | 23 +++++++++++++++++++++++
4 files changed, 60 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/3f7b7f95/include/mesos/resources.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/resources.hpp b/include/mesos/resources.hpp
index 9f95949..688093f 100644
--- a/include/mesos/resources.hpp
+++ b/include/mesos/resources.hpp
@@ -310,6 +310,13 @@ public:
// This must be called only when the resource is reserved!
static const std::string& reservationRole(const Resource& resource);
+ // Shrinks a scalar type `resource` to the target size.
+ // Returns true if the resource was shrunk to the target size,
+ // or the resource is already within the target size.
+ // Returns false otherwise (i.e. the resource is indivisible.
+ // E.g. MOUNT volume).
+ static bool shrink(Resource* resource, const Value::Scalar& target);
+
// Returns the summed up Resources given a hashmap<Key, Resources>.
//
// NOTE: While scalar resources such as "cpus" sum correctly,
http://git-wip-us.apache.org/repos/asf/mesos/blob/3f7b7f95/include/mesos/v1/resources.hpp
----------------------------------------------------------------------
diff --git a/include/mesos/v1/resources.hpp b/include/mesos/v1/resources.hpp
index a621685..94125f8 100644
--- a/include/mesos/v1/resources.hpp
+++ b/include/mesos/v1/resources.hpp
@@ -310,6 +310,13 @@ public:
// This must be called only when the resource is reserved!
static const std::string& reservationRole(const Resource& resource);
+ // Shrinks a scalar type `resource` to the target size.
+ // Returns true if the resource was shrunk to the target size,
+ // or the resource is already within the target size.
+ // Returns false otherwise (i.e. the resource is indivisible.
+ // E.g. MOUNT volume).
+ static bool shrink(Resource* resource, const Value::Scalar& target);
+
// Returns the summed up Resources given a hashmap<Key, Resources>.
//
// NOTE: While scalar resources such as "cpus" sum correctly,
http://git-wip-us.apache.org/repos/asf/mesos/blob/3f7b7f95/src/common/resources.cpp
----------------------------------------------------------------------
diff --git a/src/common/resources.cpp b/src/common/resources.cpp
index 8d43889..b31e8a7 100644
--- a/src/common/resources.cpp
+++ b/src/common/resources.cpp
@@ -1150,6 +1150,29 @@ const string& Resources::reservationRole(const Resource& resource)
return resource.reservations().rbegin()->role();
}
+
+bool Resources::shrink(Resource* resource, const Value::Scalar& target)
+{
+ if (resource->scalar() <= target) {
+ return true; // Already within target.
+ }
+
+ Resource copy = *resource;
+ copy.mutable_scalar()->CopyFrom(target);
+
+ // Some resources (e.g. MOUNT disk) are indivisible. We use
+ // a containement check to verify this. Specifically, if a
+ // contains a smaller version of itself, then it can safely
+ // be chopped into a smaller amount.
+ if (Resources(*resource).contains(copy)) {
+ resource->CopyFrom(copy);
+ return true;
+ }
+
+ return false;
+}
+
+
/////////////////////////////////////////////////
// Public member functions.
/////////////////////////////////////////////////
http://git-wip-us.apache.org/repos/asf/mesos/blob/3f7b7f95/src/v1/resources.cpp
----------------------------------------------------------------------
diff --git a/src/v1/resources.cpp b/src/v1/resources.cpp
index 508f3f8..781fef6 100644
--- a/src/v1/resources.cpp
+++ b/src/v1/resources.cpp
@@ -1181,6 +1181,29 @@ const string& Resources::reservationRole(const Resource& resource)
return resource.reservations().rbegin()->role();
}
+
+bool Resources::shrink(Resource* resource, const Value::Scalar& target)
+{
+ if (resource->scalar() <= target) {
+ return true; // Already within target.
+ }
+
+ Resource copy = *resource;
+ copy.mutable_scalar()->CopyFrom(target);
+
+ // Some resources (e.g. MOUNT disk) are indivisible. We use
+ // a containement check to verify this. Specifically, if a
+ // contains a smaller version of itself, then it can safely
+ // be chopped into a smaller amount.
+ if (Resources(*resource).contains(copy)) {
+ resource->CopyFrom(copy);
+ return true;
+ }
+
+ return false;
+}
+
+
/////////////////////////////////////////////////
// Public member functions.
/////////////////////////////////////////////////