Allowed removing non-terminal offer operations. During reconcilation we might be required to remove non-terminal offer operations from bookkeeping.
Review: https://reviews.apache.org/r/63842/ Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/0deabd3f Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/0deabd3f Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/0deabd3f Branch: refs/heads/master Commit: 0deabd3fda4485135e334ea045215dea69ebbb09 Parents: 567f250 Author: Benjamin Bannier <[email protected]> Authored: Thu Nov 30 17:03:27 2017 +0100 Committer: Benjamin Bannier <[email protected]> Committed: Thu Nov 30 18:33:58 2017 +0100 ---------------------------------------------------------------------- src/master/master.cpp | 23 ++++++++++++++++++----- src/master/master.hpp | 3 --- src/slave/slave.cpp | 3 --- 3 files changed, 18 insertions(+), 11 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/0deabd3f/src/master/master.cpp ---------------------------------------------------------------------- diff --git a/src/master/master.cpp b/src/master/master.cpp index 3470db9..16978c0 100644 --- a/src/master/master.cpp +++ b/src/master/master.cpp @@ -9817,9 +9817,6 @@ void Master::removeOfferOperation(OfferOperation* operation) { CHECK_NOTNULL(operation); - CHECK(protobuf::isTerminalState(operation->latest_status().state())) - << operation->latest_status().state(); - // Remove from framework. Framework* framework = operation->has_framework_id() ? getFramework(operation->framework_id()) @@ -9838,6 +9835,20 @@ void Master::removeOfferOperation(OfferOperation* operation) slave->removeOfferOperation(operation); + // If the operation was not speculated and is not terminal we + // need to also recover its used resources in the allocator. + if (!protobuf::isSpeculativeOperation(operation->info()) && + !protobuf::isTerminalState(operation->latest_status().state())) { + Try<Resources> consumed = protobuf::getConsumedResources(operation->info()); + CHECK_SOME(consumed); + + allocator->recoverResources( + operation->framework_id(), + operation->slave_id(), + consumed.get(), + None()); + } + delete operation; } @@ -10921,8 +10932,10 @@ void Slave::removeOfferOperation(OfferOperation* operation) << "Unknown offer operation (uuid: " << uuid->toString() << ")" << " to agent " << *this; - CHECK(protobuf::isTerminalState(operation->latest_status().state())) - << operation->latest_status().state(); + if (!protobuf::isSpeculativeOperation(operation->info()) && + !protobuf::isTerminalState(operation->latest_status().state())) { + recoverResources(operation); + } offerOperations.erase(uuid.get()); } http://git-wip-us.apache.org/repos/asf/mesos/blob/0deabd3f/src/master/master.hpp ---------------------------------------------------------------------- diff --git a/src/master/master.hpp b/src/master/master.hpp index 00fc421..1425080 100644 --- a/src/master/master.hpp +++ b/src/master/master.hpp @@ -2624,9 +2624,6 @@ struct Framework << "' (uuid: " << uuid->toString() << ") " << "of framework " << operation->framework_id(); - CHECK(protobuf::isTerminalState(operation->latest_status().state())) - << operation->latest_status().state(); - offerOperations.erase(uuid.get()); } http://git-wip-us.apache.org/repos/asf/mesos/blob/0deabd3f/src/slave/slave.cpp ---------------------------------------------------------------------- diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp index 554a2da..a415894 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -7046,9 +7046,6 @@ void Slave::removeOfferOperation(OfferOperation* operation) CHECK(offerOperations.contains(uuid.get())) << "Unknown offer operation (uuid: " << uuid->toString() << ")"; - CHECK(protobuf::isTerminalState(operation->latest_status().state())) - << operation->latest_status().state(); - offerOperations.erase(uuid.get()); delete operation; }
