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.