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;
 }

Reply via email to