This is an automated email from the ASF dual-hosted git repository. bbannier pushed a commit to branch 1.8.x in repository https://gitbox.apache.org/repos/asf/mesos.git
commit a66419bbab2cea8c7cf1b7663cd6f776f4095530 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 48fbaa9..0deb547 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -1954,13 +1954,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); } @@ -1971,7 +1974,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"; @@ -2289,7 +2293,8 @@ void Slave::run( task, taskGroup, resourceVersionUuids, - launchExecutor)) + launchExecutor, + executorGeneratedForCommandTask)) .onFailed(defer(self(), [=](const string& failure) { Framework* _framework = getFramework(frameworkId); if (_framework == nullptr) { @@ -2519,7 +2524,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"; @@ -2941,7 +2947,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); @@ -3606,13 +3613,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); } @@ -9657,7 +9668,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 @@ -9713,7 +9726,8 @@ Try<Executor*> Framework::addExecutor(const ExecutorInfo& executorInfo) containerId, directory.get(), user, - info.checkpoint()); + info.checkpoint(), + isGeneratedForCommandTask); if (executor->checkpoint) { executor->checkpointExecutor(); @@ -9908,7 +9922,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()) { @@ -10252,7 +10267,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()), @@ -10263,7 +10279,8 @@ Executor::Executor( user(_user), checkpoint(_checkpoint), http(None()), - pid(None()) + pid(None()), + isGeneratedForCommandTask_(isGeneratedForCommandTask) { CHECK_NOTNULL(slave); @@ -10280,16 +10297,6 @@ Executor::Executor( completedTasks = 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 bb14f5f..d5fd105 100644 --- a/src/slave/slave.hpp +++ b/src/slave/slave.hpp @@ -171,7 +171,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. // @@ -195,7 +196,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 @@ -901,7 +903,8 @@ public: const ContainerID& containerId, const std::string& directory, const Option<std::string>& user, - bool checkpoint); + bool checkpoint, + bool isGeneratedForCommandTask); ~Executor(); @@ -1101,7 +1104,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 1122c2a..aeb9fe0 100644 --- a/src/tests/mock_slave.cpp +++ b/src/tests/mock_slave.cpp @@ -131,7 +131,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)); @@ -218,7 +218,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, @@ -226,7 +227,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 326a450..b3d8c67 100644 --- a/src/tests/mock_slave.hpp +++ b/src/tests/mock_slave.hpp @@ -152,13 +152,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, @@ -166,7 +167,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,
