This is an automated email from the ASF dual-hosted git repository. bbannier pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 877b5886804a17ea4aee4f251a43a3f5dbc84ca1 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 4b02978..4c3d471 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -2112,13 +2112,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); } @@ -2129,7 +2132,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"; @@ -2447,7 +2451,8 @@ void Slave::run( task, taskGroup, resourceVersionUuids, - launchExecutor)) + launchExecutor, + executorGeneratedForCommandTask)) .onFailed(defer(self(), [=](const string& failure) { Framework* _framework = getFramework(frameworkId); if (_framework == nullptr) { @@ -2677,7 +2682,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"; @@ -3129,7 +3135,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); @@ -3794,13 +3801,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); } @@ -9999,7 +10010,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 @@ -10055,7 +10068,8 @@ Try<Executor*> Framework::addExecutor(const ExecutorInfo& executorInfo) containerId, directory.get(), user, - info.checkpoint()); + info.checkpoint(), + isGeneratedForCommandTask); if (executor->checkpoint) { executor->checkpointExecutor(); @@ -10250,7 +10264,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()) { @@ -10594,7 +10609,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()), @@ -10605,7 +10621,8 @@ Executor::Executor( user(_user), checkpoint(_checkpoint), http(None()), - pid(None()) + pid(None()), + isGeneratedForCommandTask_(isGeneratedForCommandTask) { CHECK_NOTNULL(slave); @@ -10622,16 +10639,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 3d191dc..3844867 100644 --- a/src/slave/slave.hpp +++ b/src/slave/slave.hpp @@ -173,7 +173,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. // @@ -197,7 +198,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 @@ -942,7 +944,8 @@ public: const ContainerID& containerId, const std::string& directory, const Option<std::string>& user, - bool checkpoint); + bool checkpoint, + bool isGeneratedForCommandTask); ~Executor(); @@ -1142,7 +1145,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 4940285..dfbca2a 100644 --- a/src/tests/mock_slave.cpp +++ b/src/tests/mock_slave.cpp @@ -134,7 +134,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)); @@ -223,7 +223,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, @@ -231,7 +232,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 eb31a0f..58daefa 100644 --- a/src/tests/mock_slave.hpp +++ b/src/tests/mock_slave.hpp @@ -153,13 +153,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, @@ -167,7 +168,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,
