You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by gr...@apache.org on 2018/04/06 06:32:57 UTC
[03/13] mesos git commit: Updated an agent test to use the mock
garbage collector.
Updated an agent test to use the mock garbage collector.
The test `RemoveExecutorUponFailedTaskGroupLaunch`
currently depends on catching and modifying the input
arguments of the `Slave::__run()` function to mock the
garbage collector behavior. Using the mock garbage collector
gives better readability and more functionality.
Review: https://reviews.apache.org/r/66120/
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo
Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/aa2b4959
Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/aa2b4959
Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/aa2b4959
Branch: refs/heads/master
Commit: aa2b49591c7ef2898c7ed07170783c782ee783d2
Parents: 397cdd5
Author: Meng Zhu <mz...@mesosphere.io>
Authored: Thu Apr 5 17:44:00 2018 -0700
Committer: Greg Mann <gr...@gmail.com>
Committed: Thu Apr 5 17:51:46 2018 -0700
----------------------------------------------------------------------
src/tests/mesos.cpp | 13 ++++++---
src/tests/mesos.hpp | 3 ++-
src/tests/slave_tests.cpp | 61 +++++++++++++++---------------------------
3 files changed, 34 insertions(+), 43 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/mesos/blob/aa2b4959/src/tests/mesos.cpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.cpp b/src/tests/mesos.cpp
index 6d09df2..6a924d7 100644
--- a/src/tests/mesos.cpp
+++ b/src/tests/mesos.cpp
@@ -430,16 +430,23 @@ Try<Owned<cluster::Slave>> MesosTest::StartSlave(
Try<Owned<cluster::Slave>> MesosTest::StartSlave(
MasterDetector* detector,
slave::GarbageCollector* gc,
- const Option<slave::Flags>& flags)
+ const Option<slave::Flags>& flags,
+ bool mock)
{
Try<Owned<cluster::Slave>> slave = cluster::Slave::create(
detector,
flags.isNone() ? CreateSlaveFlags() : flags.get(),
None(),
None(),
- gc);
+ gc,
+ None(),
+ None(),
+ None(),
+ None(),
+ None(),
+ mock);
- if (slave.isSome()) {
+ if (slave.isSome() && !mock) {
slave.get()->start();
}
http://git-wip-us.apache.org/repos/asf/mesos/blob/aa2b4959/src/tests/mesos.hpp
----------------------------------------------------------------------
diff --git a/src/tests/mesos.hpp b/src/tests/mesos.hpp
index bddce3d..b3b1817 100644
--- a/src/tests/mesos.hpp
+++ b/src/tests/mesos.hpp
@@ -204,7 +204,8 @@ protected:
virtual Try<process::Owned<cluster::Slave>> StartSlave(
mesos::master::detector::MasterDetector* detector,
slave::GarbageCollector* gc,
- const Option<slave::Flags>& flags = None());
+ const Option<slave::Flags>& flags = None(),
+ bool mock = false);
// Starts a slave with the specified detector, resource estimator, and flags.
virtual Try<process::Owned<cluster::Slave>> StartSlave(
http://git-wip-us.apache.org/repos/asf/mesos/blob/aa2b4959/src/tests/slave_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp
index 242cbaf..ae8eeba 100644
--- a/src/tests/slave_tests.cpp
+++ b/src/tests/slave_tests.cpp
@@ -4752,9 +4752,13 @@ TEST_F(SlaveTest, RemoveExecutorUponFailedTaskGroupLaunch)
Owned<MasterDetector> detector = master.get()->createDetector();
+ MockGarbageCollector mockGarbageCollector;
+
+ slave::Flags slaveFlags = CreateSlaveFlags();
+
// Start a mock slave.
Try<Owned<cluster::Slave>> slave =
- StartSlave(detector.get(), CreateSlaveFlags(), true);
+ StartSlave(detector.get(), &mockGarbageCollector, slaveFlags, true);
ASSERT_SOME(slave);
ASSERT_NE(nullptr, slave.get()->mock());
@@ -4816,50 +4820,29 @@ TEST_F(SlaveTest, RemoveExecutorUponFailedTaskGroupLaunch)
v1::Offer::Operation launchGroup = v1::LAUNCH_GROUP(executorInfo, taskGroup);
- // Saved arguments from `Slave::_run()`.
- Future<list<bool>> _unschedules;
- FrameworkInfo _frameworkInfo;
- ExecutorInfo _executorInfo;
- Option<TaskGroupInfo> _taskGroup;
- Option<TaskInfo> _task;
- vector<ResourceVersionUUID> _resourceVersionUuids;
- Option<bool> _launchExecutor;
-
- // Capture `_run` arguments.
- Future<Nothing> _run;
- EXPECT_CALL(*slave.get()->mock(), _run(_, _, _, _, _, _, _))
- .WillOnce(DoAll(FutureSatisfy(&_run),
- SaveArg<0>(&_unschedules),
- SaveArg<1>(&_frameworkInfo),
- SaveArg<2>(&_executorInfo),
- SaveArg<3>(&_task),
- SaveArg<4>(&_taskGroup),
- SaveArg<5>(&_resourceVersionUuids),
- SaveArg<6>(&_launchExecutor)));
+ // The `unschedule()` function is used to prevent premature garbage
+ // collection when the executor directory already exists due to a
+ // previously-launched task. Simulate this scenario by creating the
+ // executor directory manually.
+ string path = paths::getExecutorPath(
+ slaveFlags.work_dir,
+ devolve(agentId),
+ devolve(frameworkId),
+ devolve(executorInfo.executor_id()));
+
+ Try<Nothing> mkdir = os::mkdir(path, true);
+ CHECK_SOME(mkdir);
+
+ // Induce agent unschedule GC failure. This will result in
+ // task launch failure before the executor launch.
+ EXPECT_CALL(mockGarbageCollector, unschedule(_))
+ .WillRepeatedly(Return(Failure("")));
Future<ExitedExecutorMessage> exitedExecutorMessage =
FUTURE_PROTOBUF(ExitedExecutorMessage(), _, _);
mesos.send(v1::createCallAccept(frameworkId, offer, {launchGroup}));
- AWAIT_READY(_run);
-
- // Induce a failed GC unschedule.
- Promise<list<bool>> promise;
- Future<list<bool>> failedFuture = promise.future();
- promise.fail("");
-
- process::dispatch(slave.get()->pid, [&] {
- slave.get()->mock()->unmocked__run(
- failedFuture,
- _frameworkInfo,
- _executorInfo,
- _task,
- _taskGroup,
- _resourceVersionUuids,
- _launchExecutor);
- });
-
AWAIT_READY(exitedExecutorMessage);
// Helper function to post a request to '/api/v1' master endpoint