You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by ji...@apache.org on 2016/10/08 02:01:06 UTC

[1/2] mesos git commit: Refactored the test case `ROOT_CGROUPS_PERF_RollForward`.

Repository: mesos
Updated Branches:
  refs/heads/master b9e72327f -> d16f53d5a


Refactored the test case `ROOT_CGROUPS_PERF_RollForward`.

* Wait for `TASK_RUNNING` to check task status.
* Update the legacy comments.
* Move to cgroups_isolator_tests.cpp.
* Speed up the recovery of the agent.

Review: https://reviews.apache.org/r/52242/


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/ad13fb45
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/ad13fb45
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/ad13fb45

Branch: refs/heads/master
Commit: ad13fb45b2a809c000bbb9b9332a281353fe0704
Parents: b9e7232
Author: haosdent huang <ha...@gmail.com>
Authored: Fri Oct 7 17:50:32 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Fri Oct 7 18:37:55 2016 -0700

----------------------------------------------------------------------
 .../containerizer/cgroups_isolator_tests.cpp    | 166 +++++++++++++++++++
 src/tests/slave_recovery_tests.cpp              | 148 -----------------
 2 files changed, 166 insertions(+), 148 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/ad13fb45/src/tests/containerizer/cgroups_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/cgroups_isolator_tests.cpp b/src/tests/containerizer/cgroups_isolator_tests.cpp
index 702181d..f1035a0 100644
--- a/src/tests/containerizer/cgroups_isolator_tests.cpp
+++ b/src/tests/containerizer/cgroups_isolator_tests.cpp
@@ -14,6 +14,7 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
+#include <process/gmock.hpp>
 #include <process/gtest.hpp>
 #include <process/queue.hpp>
 
@@ -42,10 +43,14 @@ using mesos::internal::slave::CGROUP_SUBSYSTEM_NET_CLS_NAME;
 using mesos::internal::slave::CGROUP_SUBSYSTEM_PERF_EVENT_NAME;
 using mesos::internal::slave::CPU_SHARES_PER_CPU_REVOCABLE;
 using mesos::internal::slave::DEFAULT_EXECUTOR_CPUS;
+
+using mesos::internal::slave::Containerizer;
 using mesos::internal::slave::Fetcher;
 using mesos::internal::slave::MesosContainerizer;
+using mesos::internal::slave::MesosContainerizerProcess;
 using mesos::internal::slave::NetClsHandle;
 using mesos::internal::slave::NetClsHandleManager;
+using mesos::internal::slave::Slave;
 
 using mesos::master::detector::MasterDetector;
 
@@ -953,6 +958,167 @@ TEST_F(CgroupsIsolatorTest, ROOT_CGROUPS_PERF_Sample)
   driver.join();
 }
 
+
+// Test that the perf event subsystem can be enabled after the agent
+// restart. Previously created containers will not report perf
+// statistics but newly created containers will.
+TEST_F(CgroupsIsolatorTest, ROOT_CGROUPS_PERF_PerfForward)
+{
+  Try<Owned<cluster::Master>> master = StartMaster();
+  ASSERT_SOME(master);
+
+  // Start an agent using a containerizer without the perf_event isolation.
+  slave::Flags flags = CreateSlaveFlags();
+  flags.isolation = "cgroups/cpu,cgroups/mem";
+
+  Fetcher fetcher;
+
+  Try<MesosContainerizer*> create =
+    MesosContainerizer::create(flags, true, &fetcher);
+
+  ASSERT_SOME(create);
+
+  Owned<slave::Containerizer> containerizer(create.get());
+
+  Owned<MasterDetector> detector = master.get()->createDetector();
+
+  Try<Owned<cluster::Slave>> slave = StartSlave(
+      detector.get(),
+      containerizer.get(),
+      flags);
+
+  ASSERT_SOME(slave);
+
+  // Enable checkpointing for the framework.
+  FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO;
+  frameworkInfo.set_checkpoint(true);
+
+  MockScheduler sched;
+
+  MesosSchedulerDriver driver(
+      &sched,
+      frameworkInfo,
+      master.get()->pid,
+      DEFAULT_CREDENTIAL);
+
+  EXPECT_CALL(sched, registered(&driver, _, _));
+
+  Future<vector<Offer>> offers1;
+  EXPECT_CALL(sched, resourceOffers(_, _))
+    .WillOnce(FutureArg<1>(&offers1))
+    .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+  driver.start();
+
+  AWAIT_READY(offers1);
+  EXPECT_NE(0u, offers1->size());
+
+  Future<TaskStatus> statusRunning1;
+  EXPECT_CALL(sched, statusUpdate(&driver, _))
+    .WillOnce(FutureArg<1>(&statusRunning1))
+    .WillRepeatedly(Return());
+
+  TaskInfo task1 = createTask(
+      offers1.get()[0].slave_id(),
+      Resources::parse("cpus:0.5;mem:128").get(),
+      "sleep 1000");
+
+  // We want to be notified immediately with new offer.
+  Filters filters;
+  filters.set_refuse_seconds(0);
+
+  driver.launchTasks(offers1.get()[0].id(), {task1}, filters);
+
+  AWAIT_READY(statusRunning1);
+  EXPECT_EQ(TASK_RUNNING, statusRunning1->state());
+
+  Future<hashset<ContainerID>> containers = containerizer->containers();
+
+  AWAIT_READY(containers);
+  EXPECT_EQ(1u, containers->size());
+
+  ContainerID containerId1 = *(containers->begin());
+
+  Future<ResourceStatistics> usage = containerizer->usage(containerId1);
+  AWAIT_READY(usage);
+
+  // There should not be any perf statistics.
+  EXPECT_FALSE(usage->has_perf());
+
+  slave.get()->terminate();
+
+  Future<vector<Offer>> offers2;
+  EXPECT_CALL(sched, resourceOffers(_, _))
+    .WillOnce(FutureArg<1>(&offers2))
+    .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+  Future<Nothing> __recover = FUTURE_DISPATCH(_, &Slave::__recover);
+
+  // Start a slave using a containerizer with the perf_event isolation.
+  flags.isolation = "cgroups/cpu,cgroups/mem,cgroups/perf_event";
+  flags.perf_events = "cycles,task-clock";
+  flags.perf_duration = Milliseconds(250);
+  flags.perf_interval = Milliseconds(500);
+
+  containerizer.reset();
+
+  create = MesosContainerizer::create(flags, true, &fetcher);
+  ASSERT_SOME(create);
+
+  containerizer.reset(create.get());
+
+  slave = StartSlave(detector.get(), containerizer.get(), flags);
+  ASSERT_SOME(slave);
+
+  // Wait until slave recovery is complete.
+  AWAIT_READY(__recover);
+
+  AWAIT_READY(offers2);
+  EXPECT_NE(0u, offers2->size());
+
+  // The first container should not report any perf statistics.
+  usage = containerizer->usage(containerId1);
+  AWAIT_READY(usage);
+
+  EXPECT_FALSE(usage->has_perf());
+
+  // Start a new container which will start reporting perf statistics.
+  TaskInfo task2 = createTask(offers2.get()[0], "sleep 1000");
+
+  Future<TaskStatus> statusRunning2;
+  EXPECT_CALL(sched, statusUpdate(&driver, _))
+    .WillOnce(FutureArg<1>(&statusRunning2))
+    .WillRepeatedly(Return()); // Ignore subsequent offers.
+
+  driver.launchTasks(offers2.get()[0].id(), {task2});
+
+  AWAIT_READY(statusRunning2);
+  EXPECT_EQ(TASK_RUNNING, statusRunning2.get().state());
+
+  containers = containerizer->containers();
+
+  AWAIT_READY(containers);
+  EXPECT_EQ(2u, containers.get().size());
+  EXPECT_TRUE(containers.get().contains(containerId1));
+
+  ContainerID containerId2;
+  foreach (const ContainerID containerId, containers.get()) {
+    if (containerId != containerId1) {
+      containerId2 = containerId;
+    }
+  }
+
+  usage = containerizer->usage(containerId2);
+  AWAIT_READY(usage);
+
+  EXPECT_TRUE(usage->has_perf());
+
+  // TODO(jieyu): Consider kill the perf process.
+
+  driver.stop();
+  driver.join();
+}
+
 } // namespace tests {
 } // namespace internal {
 } // namespace mesos {

http://git-wip-us.apache.org/repos/asf/mesos/blob/ad13fb45/src/tests/slave_recovery_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_recovery_tests.cpp b/src/tests/slave_recovery_tests.cpp
index 115fe94..703948f 100644
--- a/src/tests/slave_recovery_tests.cpp
+++ b/src/tests/slave_recovery_tests.cpp
@@ -4080,154 +4080,6 @@ TEST_F(MesosContainerizerSlaveRecoveryTest, ResourceStatistics)
 
 
 #ifdef __linux__
-// Test that the perf event isolator can be enabled on a new slave.
-// Previously created containers will not report perf statistics but
-// newly created containers will.
-TEST_F(MesosContainerizerSlaveRecoveryTest, ROOT_CGROUPS_PERF_RollForward)
-{
-  Try<Owned<cluster::Master>> master = this->StartMaster();
-  ASSERT_SOME(master);
-
-  // Start a slave using a containerizer without a perf event
-  // isolator.
-  slave::Flags flags = this->CreateSlaveFlags();
-  flags.isolation = "cgroups/cpu,cgroups/mem";
-  flags.agent_subsystems = "";
-
-  Fetcher fetcher;
-
-  Try<MesosContainerizer*> _containerizer =
-    MesosContainerizer::create(flags, true, &fetcher);
-  ASSERT_SOME(_containerizer);
-
-  Owned<slave::Containerizer> containerizer(_containerizer.get());
-
-  Owned<MasterDetector> detector = master.get()->createDetector();
-
-  Try<Owned<cluster::Slave>> slave =
-    this->StartSlave(detector.get(), containerizer.get(), flags);
-  ASSERT_SOME(slave);
-
-  MockScheduler sched;
-
-  // Scheduler expectations.
-  EXPECT_CALL(sched, statusUpdate(_, _))
-    .WillRepeatedly(Return());
-
-  // Enable checkpointing for the framework.
-  FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO;
-  frameworkInfo.set_checkpoint(true);
-
-  MesosSchedulerDriver driver(
-      &sched, frameworkInfo, master.get()->pid, DEFAULT_CREDENTIAL);
-
-  EXPECT_CALL(sched, registered(_, _, _));
-
-  Future<vector<Offer>> offers1;
-  EXPECT_CALL(sched, resourceOffers(_, _))
-    .WillOnce(FutureArg<1>(&offers1))
-    .WillRepeatedly(Return());      // Ignore subsequent offers.
-
-  driver.start();
-
-  AWAIT_READY(offers1);
-  EXPECT_NE(0u, offers1.get().size());
-
-  SlaveID slaveId = offers1.get()[0].slave_id();
-
-  TaskInfo task1 = createTask(
-      slaveId, Resources::parse("cpus:0.5;mem:128").get(), "sleep 1000");
-
-  // Message expectations.
-  Future<Message> registerExecutor =
-    FUTURE_MESSAGE(Eq(RegisterExecutorMessage().GetTypeName()), _, _);
-
-  driver.launchTasks(offers1.get()[0].id(), {task1});
-
-  AWAIT_READY(registerExecutor);
-
-  Future<hashset<ContainerID>> containers = containerizer->containers();
-  AWAIT_READY(containers);
-  EXPECT_EQ(1u, containers.get().size());
-
-  ContainerID containerId1 = *(containers.get().begin());
-
-  Future<ResourceStatistics> usage = containerizer->usage(containerId1);
-  AWAIT_READY(usage);
-
-  // There should not be any perf statistics.
-  EXPECT_FALSE(usage.get().has_perf());
-
-  slave.get()->terminate();
-
-  // Set up so we can wait until the new slave updates the container's
-  // resources (this occurs after the executor has re-registered).
-  Future<Nothing> update =
-    FUTURE_DISPATCH(_, &MesosContainerizerProcess::update);
-
-  // Start a slave using a containerizer with a perf event isolator.
-  flags.isolation = "cgroups/cpu,cgroups/mem,cgroups/perf_event";
-  flags.perf_events = "cycles,task-clock";
-  flags.perf_duration = Milliseconds(250);
-  flags.perf_interval = Milliseconds(500);
-
-  _containerizer = MesosContainerizer::create(flags, true, &fetcher);
-  ASSERT_SOME(_containerizer);
-  containerizer.reset(_containerizer.get());
-
-  Future<vector<Offer>> offers2;
-  EXPECT_CALL(sched, resourceOffers(_, _))
-    .WillOnce(FutureArg<1>(&offers2))
-    .WillRepeatedly(Return());        // Ignore subsequent offers.
-
-  slave = this->StartSlave(detector.get(), containerizer.get(), flags);
-  ASSERT_SOME(slave);
-
-  AWAIT_READY(offers2);
-  EXPECT_NE(0u, offers2.get().size());
-
-  // Wait until the containerizer is updated.
-  AWAIT_READY(update);
-
-  // The first container should not report perf statistics.
-  usage = containerizer->usage(containerId1);
-  AWAIT_READY(usage);
-
-  EXPECT_FALSE(usage.get().has_perf());
-
-  // Start a new container which will start reporting perf statistics.
-  TaskInfo task2 = createTask(offers2.get()[0], "sleep 1000");
-
-  // Message expectations.
-  registerExecutor =
-    FUTURE_MESSAGE(Eq(RegisterExecutorMessage().GetTypeName()), _, _);
-
-  driver.launchTasks(offers2.get()[0].id(), {task2});
-
-  AWAIT_READY(registerExecutor);
-
-  containers = containerizer->containers();
-  AWAIT_READY(containers);
-  EXPECT_EQ(2u, containers.get().size());
-  EXPECT_TRUE(containers.get().contains(containerId1));
-
-  ContainerID containerId2;
-  foreach (const ContainerID containerId, containers.get()) {
-    if (containerId != containerId1) {
-      containerId2.CopyFrom(containerId);
-    }
-  }
-
-  usage = containerizer->usage(containerId2);
-  AWAIT_READY(usage);
-
-  EXPECT_TRUE(usage.get().has_perf());
-
-  driver.stop();
-  driver.join();
-}
-
-
 // Test that a container started without namespace/pid isolation can
 // be destroyed correctly with namespace/pid isolation enabled.
 TEST_F(MesosContainerizerSlaveRecoveryTest, CGROUPS_ROOT_PidNamespaceForward)


[2/2] mesos git commit: Fixed a potential flaky linux filesystem isolator test.

Posted by ji...@apache.org.
Fixed a potential flaky linux filesystem isolator test.


Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/d16f53d5
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/d16f53d5
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/d16f53d5

Branch: refs/heads/master
Commit: d16f53d5a9e15d1d9533739a8c052bc546ec3262
Parents: ad13fb4
Author: Jie Yu <yu...@gmail.com>
Authored: Fri Oct 7 18:38:43 2016 -0700
Committer: Jie Yu <yu...@gmail.com>
Committed: Fri Oct 7 18:38:43 2016 -0700

----------------------------------------------------------------------
 src/tests/containerizer/linux_filesystem_isolator_tests.cpp | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/d16f53d5/src/tests/containerizer/linux_filesystem_isolator_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/containerizer/linux_filesystem_isolator_tests.cpp b/src/tests/containerizer/linux_filesystem_isolator_tests.cpp
index aa200c1..eb191a3 100644
--- a/src/tests/containerizer/linux_filesystem_isolator_tests.cpp
+++ b/src/tests/containerizer/linux_filesystem_isolator_tests.cpp
@@ -1215,17 +1215,20 @@ TEST_F(LinuxFilesystemIsolatorMesosTest,
   // above running task as an orphan.
   ASSERT_SOME(os::rmdir(slave::paths::getMetaRootDir(flags.work_dir)));
 
+  Future<Nothing> _recover = FUTURE_DISPATCH(_, &Slave::_recover);
+
   // Recreate the containerizer using the same helper as above.
   containerizer.reset();
 
   create = MesosContainerizer::create(flags, true, &fetcher);
+  ASSERT_SOME(create);
+
   containerizer.reset(create.get());
 
   slave = StartSlave(detector.get(), containerizer.get(), flags);
   ASSERT_SOME(slave);
 
   // Wait until slave recovery is complete.
-  Future<Nothing> _recover = FUTURE_DISPATCH(_, &Slave::_recover);
   AWAIT_READY(_recover);
 
   // Wait until the orphan containers are cleaned up.