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 <g...@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())); + } + } + } }