You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gr...@apache.org on 2019/07/15 18:50:27 UTC
[mesos] 07/14: Killed all tasks on the agent when draining.
This is an automated email from the ASF dual-hosted git repository.
grag pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/mesos.git
commit e1c7985e96d84693f3e41d3a50da5f5ea11b6cd8
Author: Greg Mann <gr...@mesosphere.io>
AuthorDate: Mon Jul 15 10:25:51 2019 -0700
Killed all tasks on the agent when draining.
This patch updates the agent's `DrainSlaveMessage` handler
to kill all tasks on the agent when the message is received.
Review: https://reviews.apache.org/r/70903/
---
include/mesos/type_utils.hpp | 6 +++++
src/slave/slave.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 68 insertions(+)
diff --git a/include/mesos/type_utils.hpp b/include/mesos/type_utils.hpp
index 2fd8a62..98a2995 100644
--- a/include/mesos/type_utils.hpp
+++ b/include/mesos/type_utils.hpp
@@ -338,6 +338,12 @@ inline bool operator<(const ContainerID& left, const ContainerID& right)
}
+inline bool operator<(const DurationInfo& left, const DurationInfo& right)
+{
+ return left.nanoseconds() < right.nanoseconds();
+}
+
+
inline bool operator<(const ExecutorID& left, const ExecutorID& right)
{
return left.value() < right.value();
diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp
index 741c1f6..19b4769 100644
--- a/src/slave/slave.cpp
+++ b/src/slave/slave.cpp
@@ -999,6 +999,68 @@ void Slave::drain(
<< "Failed to checkpoint DrainConfig";
drainConfig = drainSlaveMessage.config();
+
+ const Option<DurationInfo> maxGracePeriod =
+ drainConfig->has_max_grace_period()
+ ? drainConfig->max_grace_period()
+ : Option<DurationInfo>::none();
+
+ auto calculateKillPolicy =
+ [&](const Option<KillPolicy>& killPolicy) -> Option<KillPolicy> {
+ if (maxGracePeriod.isNone()) {
+ return None();
+ }
+
+ KillPolicy killPolicyOverride;
+ killPolicyOverride.mutable_grace_period()->CopyFrom(maxGracePeriod.get());
+
+ // Task kill policy is not set or unknown.
+ if (killPolicy.isNone() || !killPolicy->has_grace_period()) {
+ return killPolicyOverride;
+ }
+
+ // Task kill policy is greater than the override.
+ if (maxGracePeriod.get() < killPolicy->grace_period()) {
+ return killPolicyOverride;
+ }
+
+ return None();
+ };
+
+ // Frameworks may be removed within `kill()` or `killPendingTask()` below,
+ // so we must copy them and their members before looping.
+ foreachvalue (Framework* framework, utils::copy(frameworks)) {
+ typedef hashmap<TaskID, TaskInfo> TaskMap;
+ foreachvalue (const TaskMap& tasks, utils::copy(framework->pendingTasks)) {
+ foreachvalue (const TaskInfo& task, tasks) {
+ killPendingTask(framework->id(), framework, task.task_id());
+ }
+ }
+
+ foreachvalue (Executor* executor, utils::copy(framework->executors)) {
+ foreachvalue (Task* task, executor->launchedTasks) {
+ kill(framework->id(),
+ framework,
+ executor,
+ task->task_id(),
+ calculateKillPolicy(
+ task->has_kill_policy()
+ ? task->kill_policy()
+ : Option<KillPolicy>::none()));
+ }
+
+ foreachvalue (const TaskInfo& task, utils::copy(executor->queuedTasks)) {
+ kill(framework->id(),
+ framework,
+ executor,
+ task.task_id(),
+ calculateKillPolicy(
+ task.has_kill_policy()
+ ? task.kill_policy()
+ : Option<KillPolicy>::none()));
+ }
+ }
+ }
}