You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@mesos.apache.org by "Guangya Liu (JIRA)" <ji...@apache.org> on 2016/07/28 15:41:20 UTC
[jira] [Commented] (MESOS-5921) `validate` is a bit heavy to check
negative scalar resource
[ https://issues.apache.org/jira/browse/MESOS-5921?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15397700#comment-15397700 ]
Guangya Liu commented on MESOS-5921:
------------------------------------
[~bmahler], did some checking for this and seems we can keep the current logic of of {{Resources::subtract}} using {{Resources::validate}} as this function can return very quickly when encounter negative scalar resources. What do you think? Thanks.
{code}
Option<Error> Resources::validate(const Resource& resource)
{
if (resource.name().empty()) {
return Error("Empty resource name");
}
if (!Value::Type_IsValid(resource.type())) {
return Error("Invalid resource type");
}
if (resource.type() == Value::SCALAR) {
if (!resource.has_scalar() ||
resource.has_ranges() ||
resource.has_set()) {
return Error("Invalid scalar resource");
}
if (resource.scalar().value() < 0) {
return Error("Invalid scalar resource: value < 0"); <<<<<< Return here if the scalar resource is negative and thus will not do other checking.
}
} else if (resource.type() == Value::RANGES) {
......
} else if (resource.type() == Value::SET) {
......
} else {
// Resource doesn't support TEXT or other value types.
return Error("Unsupported resource type");
}
......
}
{code}
I also did some test with following code diff and found that the performance was almost not changed for operating 1000 port resources.
Code diff.
{code}
--- a/include/mesos/resources.hpp
+++ b/include/mesos/resources.hpp
@@ -396,6 +396,9 @@ private:
// ensure this is warranted.
bool _contains(const Resource& that) const;
+ // Check if the resource is a negative scalar resource.
+ bool isNegative(const Resource& r) const;
+
// Similar to the public 'find', but only for a single Resource
// object. The target resource may span multiple roles, so this
// returns Resources.
diff --git a/src/common/resources.cpp b/src/common/resources.cpp
index 2878ace..b1259b9 100644
--- a/src/common/resources.cpp
+++ b/src/common/resources.cpp
@@ -1296,6 +1296,17 @@ bool Resources::_contains(const Resource& that) const
}
+bool Resources::isNegative(const Resource& r) const
+{
+ if (r.type() == Value::SCALAR &&
+ r.scalar().value() < 0) {
+ return true;
+ }
+
+ return false;
+}
+
+
Option<Resources> Resources::find(const Resource& target) const
{
Resources found;
@@ -1442,10 +1453,8 @@ void Resources::subtract(const Resource& that)
if (internal::subtractable(*resource, that)) {
*resource -= that;
- // Remove the resource if it becomes invalid or zero. We need
- // to do the validation because we want to strip negative
- // scalar Resource object.
- if (validate(*resource).isSome() || isEmpty(*resource)) {
+ // Remove the resource if it becomes negative or empty.
+ if (isNegative(*resource) || isEmpty(*resource)) {
// As `resources` is not ordered, and erasing an element
// from the middle using `DeleteSubrange` is expensive, we
// swap with the last element and then shrink the
{code}
Before fix:
{code}
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from ResourcesOperators/Resources_BENCHMARK_Test
[ RUN ] ResourcesOperators/Resources_BENCHMARK_Test.Arithmetic/2
Took 2.730778secs to perform 1000 'total += r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 20.703045secs to perform 1000 'total.contains(r)' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 3.530712secs to perform 1000 'total -= r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 2.92716secs to perform 1000 'total = total + r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 3.489936secs to perform 1000 'total = total - r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 122368us to perform 1000 'r.nonRevocable()' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
[ OK ] ResourcesOperators/Resources_BENCHMARK_Test.Arithmetic/2 (33508 ms)
[----------] 1 test from ResourcesOperators/Resources_BENCHMARK_Test (33508 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (33525 ms total)
[ PASSED ] 1 test.
{code}
After fix:
{code}
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from ResourcesOperators/Resources_BENCHMARK_Test
[ RUN ] ResourcesOperators/Resources_BENCHMARK_Test.Arithmetic/2
Took 2.657057secs to perform 1000 'total += r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 20.493614secs to perform 1000 'total.contains(r)' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 3.420194secs to perform 1000 'total -= r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 2.855921secs to perform 1000 'total = total + r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 3.463858secs to perform 1000 'total = total - r' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
Took 128458us to perform 1000 'r.nonRevocable()' operations on ports(*):[1-2, 4-5, 7-8, 10-11, 13-14, 16-17, 1...
[ OK ] ResourcesOperators/Resources_BENCHMARK_Test.Arithmetic/2 (33023 ms)
[----------] 1 test from ResourcesOperators/Resources_BENCHMARK_Test (33023 ms total)
[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (33041 ms total)
[ PASSED ] 1 test.
{code}
> `validate` is a bit heavy to check negative scalar resource
> -----------------------------------------------------------
>
> Key: MESOS-5921
> URL: https://issues.apache.org/jira/browse/MESOS-5921
> Project: Mesos
> Issue Type: Bug
> Reporter: Guangya Liu
> Assignee: Guangya Liu
>
> When subtract resources finished, we need to call {{Resources::validate}} to check if the scalar resource is negative so as to remove this resource if it is negative. This is a bit heavy as the {{Resources::validate}} did many validation stuffs, such as checking type, validating role, checking resource name etc, all of them are not necessary.
> We should introduce a new helper function {{isNegative}} to check if the resource is a negative scalar resource.
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)