This is an automated email from the ASF dual-hosted git repository. qianzhang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mesos.git
commit 97dc2b069965929105d6241c57f8cb6ee77a5e35 Author: Qian Zhang <[email protected]> AuthorDate: Tue Apr 21 16:46:17 2020 +0800 Updated Docker containerizer by not updating resources for command task. For command task, its resources will be set when it is launched as a Docker container by Docker executor, and we do not need to update its resources afterward since we do not support task resizing. But for the case that a custom executor launched as a Docker container by Docker containerizer, we need to update its resources when it launches a new task or an existing task terminates. Review: https://reviews.apache.org/r/72401 --- src/slave/containerizer/docker.cpp | 11 ++ src/slave/containerizer/docker.hpp | 5 +- .../containerizer/docker_containerizer_tests.cpp | 157 --------------------- 3 files changed, 15 insertions(+), 158 deletions(-) diff --git a/src/slave/containerizer/docker.cpp b/src/slave/containerizer/docker.cpp index 492ac27..3aa6a99 100644 --- a/src/slave/containerizer/docker.cpp +++ b/src/slave/containerizer/docker.cpp @@ -1007,6 +1007,7 @@ Future<Nothing> DockerContainerizerProcess::_recover( Container* container = new Container(containerId); containers_[containerId] = container; container->state = Container::RUNNING; + container->generatedForCommandTask = executor.generatedForCommandTask; container->launchesExecutorContainer = executorContainers.contains(containerId); @@ -1675,6 +1676,16 @@ Future<Nothing> DockerContainerizerProcess::update( return Nothing(); } + if (container->generatedForCommandTask) { + LOG(INFO) << "Ignoring updating container " << containerId + << " because it is generated for a command task"; + + // Store the resources for usage(). + container->resources = resourceRequests; + + return Nothing(); + } + if (container->resources == resourceRequests && !force) { LOG(INFO) << "Ignoring updating container " << containerId << " because resources passed to update are identical to" diff --git a/src/slave/containerizer/docker.hpp b/src/slave/containerizer/docker.hpp index 09fc279..d3d5f3a 100644 --- a/src/slave/containerizer/docker.hpp +++ b/src/slave/containerizer/docker.hpp @@ -353,7 +353,8 @@ private: symlinked(symlinked), containerWorkDir(containerWorkDir), containerName(name(id)), - launchesExecutorContainer(launchesExecutorContainer) + launchesExecutorContainer(launchesExecutorContainer), + generatedForCommandTask(_containerConfig.has_task_info()) { // NOTE: The task's resources are included in the executor's // resources in order to make sure when launching the executor @@ -531,6 +532,8 @@ private: // Marks if this container launches an executor in a docker // container. bool launchesExecutorContainer; + + bool generatedForCommandTask; }; hashmap<ContainerID, Container*> containers_; diff --git a/src/tests/containerizer/docker_containerizer_tests.cpp b/src/tests/containerizer/docker_containerizer_tests.cpp index b069f51..42692dc 100644 --- a/src/tests/containerizer/docker_containerizer_tests.cpp +++ b/src/tests/containerizer/docker_containerizer_tests.cpp @@ -1086,163 +1086,6 @@ TEST_F(DockerContainerizerTest, ROOT_DOCKER_Usage) } -#ifdef __linux__ -TEST_F(DockerContainerizerTest, ROOT_DOCKER_Update) -{ - Try<Owned<cluster::Master>> master = StartMaster(); - ASSERT_SOME(master); - - MockDocker* mockDocker = - new MockDocker(tests::flags.docker, tests::flags.docker_socket); - - Shared<Docker> docker(mockDocker); - - slave::Flags flags = CreateSlaveFlags(); - - Fetcher fetcher(flags); - - Try<ContainerLogger*> logger = - ContainerLogger::create(flags.container_logger); - - ASSERT_SOME(logger); - - MockDockerContainerizer dockerContainerizer( - flags, - &fetcher, - Owned<ContainerLogger>(logger.get()), - docker); - - Owned<MasterDetector> detector = master.get()->createDetector(); - - Try<Owned<cluster::Slave>> slave = - StartSlave(detector.get(), &dockerContainerizer, flags); - ASSERT_SOME(slave); - - MockScheduler sched; - MesosSchedulerDriver driver( - &sched, DEFAULT_FRAMEWORK_INFO, master.get()->pid, DEFAULT_CREDENTIAL); - - Future<FrameworkID> frameworkId; - EXPECT_CALL(sched, registered(&driver, _, _)) - .WillOnce(FutureArg<1>(&frameworkId)); - - Future<vector<Offer>> offers; - EXPECT_CALL(sched, resourceOffers(&driver, _)) - .WillOnce(FutureArg<1>(&offers)) - .WillRepeatedly(Return()); // Ignore subsequent offers. - - driver.start(); - - AWAIT_READY(frameworkId); - - AWAIT_READY(offers); - ASSERT_FALSE(offers->empty()); - - TaskInfo task = createTask( - offers->front().slave_id(), - offers->front().resources(), - SLEEP_COMMAND(1000)); - - // TODO(tnachen): Use local image to test if possible. - task.mutable_container()->CopyFrom(createDockerInfo("alpine")); - - Future<ContainerID> containerId; - EXPECT_CALL(dockerContainerizer, launch(_, _, _, _)) - .WillOnce(DoAll(FutureArg<0>(&containerId), - Invoke(&dockerContainerizer, - &MockDockerContainerizer::_launch))); - - Future<TaskStatus> statusStarting; - Future<TaskStatus> statusRunning; - EXPECT_CALL(sched, statusUpdate(&driver, _)) - .WillOnce(FutureArg<1>(&statusStarting)) - .WillOnce(FutureArg<1>(&statusRunning)) - .WillRepeatedly(DoDefault()); - - driver.launchTasks(offers.get()[0].id(), {task}); - - AWAIT_READY(containerId); - - AWAIT_READY_FOR(statusStarting, Seconds(60)); - EXPECT_EQ(TASK_STARTING, statusStarting->state()); - - AWAIT_READY_FOR(statusRunning, Seconds(60)); - EXPECT_EQ(TASK_RUNNING, statusRunning->state()); - - ASSERT_TRUE( - exists(docker, containerId.get(), ContainerState::RUNNING)); - - string name = containerName(containerId.get()); - - Future<Docker::Container> inspect = docker->inspect(name); - - AWAIT_READY(inspect); - - Try<Resources> newResources = Resources::parse("cpus:1;mem:128"); - - ASSERT_SOME(newResources); - - Future<Nothing> update = - dockerContainerizer.update(containerId.get(), newResources.get(), {}); - - AWAIT_READY(update); - - Result<string> cpuHierarchy = cgroups::hierarchy("cpu"); - Result<string> memoryHierarchy = cgroups::hierarchy("memory"); - - ASSERT_SOME(cpuHierarchy); - ASSERT_SOME(memoryHierarchy); - - Option<pid_t> pid = inspect->pid; - ASSERT_SOME(pid); - - Result<string> cpuCgroup = cgroups::cpu::cgroup(pid.get()); - ASSERT_SOME(cpuCgroup); - - Result<string> memoryCgroup = cgroups::memory::cgroup(pid.get()); - ASSERT_SOME(memoryCgroup); - - Try<uint64_t> cpu = cgroups::cpu::shares( - cpuHierarchy.get(), - cpuCgroup.get()); - - ASSERT_SOME(cpu); - - Try<Bytes> mem = cgroups::memory::soft_limit_in_bytes( - memoryHierarchy.get(), - memoryCgroup.get()); - - ASSERT_SOME(mem); - - EXPECT_EQ(1024u, cpu.get()); - EXPECT_EQ(128u, mem->bytes() / Bytes::MEGABYTES); - - newResources = Resources::parse("cpus:1;mem:144"); - - // Issue second update that uses the cached cgroups instead of inspect. - update = dockerContainerizer.update(containerId.get(), newResources.get(), {}); - - AWAIT_READY(update); - - cpu = cgroups::cpu::shares(cpuHierarchy.get(), cpuCgroup.get()); - - ASSERT_SOME(cpu); - - mem = cgroups::memory::soft_limit_in_bytes( - memoryHierarchy.get(), - memoryCgroup.get()); - - ASSERT_SOME(mem); - - EXPECT_EQ(1024u, cpu.get()); - EXPECT_EQ(144u, mem->bytes() / Bytes::MEGABYTES); - - driver.stop(); - driver.join(); -} -#endif // __linux__ - - TEST_F(DockerContainerizerTest, ROOT_DOCKER_Recover) { MockDocker* mockDocker =
