This is an automated email from the ASF dual-hosted git repository. bbannier pushed a commit to branch 1.6.x in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 7e4d380c11c20f4b9e20b06f6b6c67a4657af24b Author: Benjamin Bannier <[email protected]> AuthorDate: Thu Jan 23 14:19:57 2020 +0100 Remembered whether an executor was agent-generated. This patch adds code to pass on whether was generated in the agent from the point where the executor is generated to the point where we create an actual `slave::Executor` instance. This allows us to persist this information in the executor state. Review: https://reviews.apache.org/r/72035/ --- src/slave/slave.cpp | 49 +++++++++++++++++++++++++++--------------------- src/slave/slave.hpp | 14 ++++++++++---- src/tests/mock_slave.cpp | 8 +++++--- src/tests/mock_slave.hpp | 8 +++++--- 4 files changed, 48 insertions(+), 31 deletions(-) diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp index f195627..15a72a2 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -1944,13 +1944,16 @@ void Slave::runTask( const ExecutorInfo executorInfo = getExecutorInfo(frameworkInfo, task); + bool executorGeneratedForCommandTask = !task.has_executor(); + run(frameworkInfo, executorInfo, task, None(), resourceVersionUuids, pid, - launchExecutor); + launchExecutor, + executorGeneratedForCommandTask); } @@ -1961,7 +1964,8 @@ void Slave::run( Option<TaskGroupInfo> taskGroup, const vector<ResourceVersionUUID>& resourceVersionUuids, const UPID& pid, - const Option<bool>& launchExecutor) + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask) { CHECK_NE(task.isSome(), taskGroup.isSome()) << "Either task or task group should be set but not both"; @@ -2279,7 +2283,8 @@ void Slave::run( task, taskGroup, resourceVersionUuids, - launchExecutor)) + launchExecutor, + executorGeneratedForCommandTask)) .onFailed(defer(self(), [=](const string& failure) { Framework* _framework = getFramework(frameworkId); if (_framework == nullptr) { @@ -2509,7 +2514,8 @@ void Slave::__run( const Option<TaskInfo>& task, const Option<TaskGroupInfo>& taskGroup, const vector<ResourceVersionUUID>& resourceVersionUuids, - const Option<bool>& launchExecutor) + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask) { CHECK_NE(task.isSome(), taskGroup.isSome()) << "Either task or task group should be set but not both"; @@ -2931,7 +2937,8 @@ void Slave::__run( // or we are in the legacy case of launching one if there wasn't // one already. Either way, let's launch executor now. if (executor == nullptr) { - Try<Executor*> added = framework->addExecutor(executorInfo); + Try<Executor*> added = + framework->addExecutor(executorInfo, executorGeneratedForCommandTask); if (added.isError()) { CHECK(framework->getExecutor(executorId) == nullptr); @@ -3599,13 +3606,17 @@ void Slave::runTaskGroup( return; } + // Executors for task groups are injected by the master, not the agent. + constexpr bool executorGeneratedForCommandTask = false; + run(frameworkInfo, executorInfo, None(), taskGroupInfo, resourceVersionUuids, UPID(), - launchExecutor); + launchExecutor, + executorGeneratedForCommandTask); } @@ -8921,7 +8932,9 @@ void Framework::checkpointFramework() const } -Try<Executor*> Framework::addExecutor(const ExecutorInfo& executorInfo) +Try<Executor*> Framework::addExecutor( + const ExecutorInfo& executorInfo, + bool isGeneratedForCommandTask) { // Verify that Resource.AllocationInfo is set, if coming // from a MULTI_ROLE master this will be set, otherwise @@ -8977,7 +8990,8 @@ Try<Executor*> Framework::addExecutor(const ExecutorInfo& executorInfo) containerId, directory.get(), user, - info.checkpoint()); + info.checkpoint(), + isGeneratedForCommandTask); if (executor->checkpoint) { executor->checkpointExecutor(); @@ -9172,7 +9186,8 @@ void Framework::recoverExecutor( latest, directory, info.user(), - info.checkpoint()); + info.checkpoint(), + state.generatedForCommandTask); // Recover the libprocess PID if possible for PID based executors. if (run->http.isSome()) { @@ -9504,7 +9519,8 @@ Executor::Executor( const ContainerID& _containerId, const string& _directory, const Option<string>& _user, - bool _checkpoint) + bool _checkpoint, + bool isGeneratedForCommandTask) : state(REGISTERING), slave(_slave), id(_info.executor_id()), @@ -9515,7 +9531,8 @@ Executor::Executor( user(_user), checkpoint(_checkpoint), http(None()), - pid(None()) + pid(None()), + isGeneratedForCommandTask_(isGeneratedForCommandTask) { CHECK_NOTNULL(slave); @@ -9532,16 +9549,6 @@ Executor::Executor( completedTasks = boost::circular_buffer<shared_ptr<Task>>(MAX_COMPLETED_TASKS_PER_EXECUTOR); - - // TODO(jieyu): The way we determine if an executor is generated for - // a command task (either command or docker executor) is really - // hacky. We rely on the fact that docker executor launch command is - // set in the docker containerizer so that this check is still valid - // in the slave. - // TODO(bbannier): Initialize this field with a value passed to constructor. - isGeneratedForCommandTask_ = - strings::endsWith(info.command().value(), MESOS_EXECUTOR) && - strings::startsWith(info.name(), "Command Executor"); } diff --git a/src/slave/slave.hpp b/src/slave/slave.hpp index f503c70..961bf67 100644 --- a/src/slave/slave.hpp +++ b/src/slave/slave.hpp @@ -168,7 +168,8 @@ public: Option<TaskGroupInfo> taskGroup, const std::vector<ResourceVersionUUID>& resourceVersionUuids, const process::UPID& pid, - const Option<bool>& launchExecutor); + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask); // Made 'virtual' for Slave mocking. // @@ -192,7 +193,8 @@ public: const Option<TaskInfo>& task, const Option<TaskGroupInfo>& taskGroup, const std::vector<ResourceVersionUUID>& resourceVersionUuids, - const Option<bool>& launchExecutor); + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask); // This is called when the resource limits of the container have // been updated for the given tasks and task groups. If the update is @@ -888,7 +890,8 @@ public: const ContainerID& containerId, const std::string& directory, const Option<std::string>& user, - bool checkpoint); + bool checkpoint, + bool isGeneratedForCommandTask); ~Executor(); @@ -1085,7 +1088,10 @@ public: const FrameworkID id() const { return info.id(); } - Try<Executor*> addExecutor(const ExecutorInfo& executorInfo); + Try<Executor*> addExecutor( + const ExecutorInfo& executorInfo, + bool isGeneratedForCommandTask); + Executor* getExecutor(const ExecutorID& executorId) const; Executor* getExecutor(const TaskID& taskId) const; diff --git a/src/tests/mock_slave.cpp b/src/tests/mock_slave.cpp index 41bce32..6a1928f 100644 --- a/src/tests/mock_slave.cpp +++ b/src/tests/mock_slave.cpp @@ -130,7 +130,7 @@ MockSlave::MockSlave( .WillRepeatedly(Invoke(this, &MockSlave::unmocked_runTask)); EXPECT_CALL(*this, _run(_, _, _, _, _, _)) .WillRepeatedly(Invoke(this, &MockSlave::unmocked__run)); - EXPECT_CALL(*this, __run(_, _, _, _, _, _)) + EXPECT_CALL(*this, __run(_, _, _, _, _, _, _)) .WillRepeatedly(Invoke(this, &MockSlave::unmocked___run)); EXPECT_CALL(*this, runTaskGroup(_, _, _, _, _, _)) .WillRepeatedly(Invoke(this, &MockSlave::unmocked_runTaskGroup)); @@ -215,7 +215,8 @@ void MockSlave::unmocked___run( const Option<TaskInfo>& task, const Option<TaskGroupInfo>& taskGroup, const std::vector<ResourceVersionUUID>& resourceVersionUuids, - const Option<bool>& launchExecutor) + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask) { slave::Slave::__run( frameworkInfo, @@ -223,7 +224,8 @@ void MockSlave::unmocked___run( task, taskGroup, resourceVersionUuids, - launchExecutor); + launchExecutor, + executorGeneratedForCommandTask); } diff --git a/src/tests/mock_slave.hpp b/src/tests/mock_slave.hpp index bb0327a..1f2b117 100644 --- a/src/tests/mock_slave.hpp +++ b/src/tests/mock_slave.hpp @@ -151,13 +151,14 @@ public: const std::vector<ResourceVersionUUID>& resourceVersionUuids, const Option<bool>& launchExecutor); - MOCK_METHOD6(__run, void( + MOCK_METHOD7(__run, void( const FrameworkInfo& frameworkInfo, const ExecutorInfo& executorInfo, const Option<TaskInfo>& task, const Option<TaskGroupInfo>& taskGroup, const std::vector<ResourceVersionUUID>& resourceVersionUuids, - const Option<bool>& launchExecutor)); + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask)); void unmocked___run( const FrameworkInfo& frameworkInfo, @@ -165,7 +166,8 @@ public: const Option<TaskInfo>& task, const Option<TaskGroupInfo>& taskGroup, const std::vector<ResourceVersionUUID>& resourceVersionUuids, - const Option<bool>& launchExecutor); + const Option<bool>& launchExecutor, + bool executorGeneratedForCommandTask); MOCK_METHOD6(runTaskGroup, void( const process::UPID& from,
