You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by vi...@apache.org on 2014/05/13 19:47:02 UTC

git commit: Added test for killing unknown task with Slaves in transitional state.

Repository: mesos
Updated Branches:
  refs/heads/master 611e1c231 -> 9a8d4e58b


Added test for killing unknown task with Slaves in transitional state.

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


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

Branch: refs/heads/master
Commit: 9a8d4e58befb9e8b09c76f1cd91276c387d604be
Parents: 611e1c2
Author: Dominic Hamon <dh...@twopensource.com>
Authored: Tue May 13 10:45:36 2014 -0700
Committer: Vinod Kone <vi...@twitter.com>
Committed: Tue May 13 10:46:49 2014 -0700

----------------------------------------------------------------------
 src/master/master.cpp      |   2 +-
 src/master/master.hpp      |   1 +
 src/tests/master_tests.cpp | 128 ++++++++++++++++++++++++++++++++++++++++
 3 files changed, 130 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/mesos/blob/9a8d4e58/src/master/master.cpp
----------------------------------------------------------------------
diff --git a/src/master/master.cpp b/src/master/master.cpp
index 569995c..d545367 100644
--- a/src/master/master.cpp
+++ b/src/master/master.cpp
@@ -1961,7 +1961,7 @@ void Master::killTask(
       // between states, then this task is definitely unknown!
       LOG(WARNING)
         << "Cannot kill task " << taskId << " of framework " << frameworkId
-        << " because it cannot be found; sending TASK_LOST since there are "
+        << " because it cannot be found; sending TASK_LOST since there are"
         << " no transitionary slaves";
 
       StatusUpdateMessage message;

http://git-wip-us.apache.org/repos/asf/mesos/blob/9a8d4e58/src/master/master.hpp
----------------------------------------------------------------------
diff --git a/src/master/master.hpp b/src/master/master.hpp
index 923552e..4f9ae36 100644
--- a/src/master/master.hpp
+++ b/src/master/master.hpp
@@ -203,6 +203,7 @@ public:
   // Made public for testing purposes.
   // TODO(vinod): Instead of doing this create and use a
   // MockRegistrar.
+  // TODO(dhamon): Consider FRIEND_TEST macro from gtest.
   void _reregisterSlave(
       const SlaveInfo& slaveInfo,
       const process::UPID& pid,

http://git-wip-us.apache.org/repos/asf/mesos/blob/9a8d4e58/src/tests/master_tests.cpp
----------------------------------------------------------------------
diff --git a/src/tests/master_tests.cpp b/src/tests/master_tests.cpp
index 639e760..7aa678a 100644
--- a/src/tests/master_tests.cpp
+++ b/src/tests/master_tests.cpp
@@ -388,6 +388,134 @@ TEST_F(MasterTest, KillUnknownTask)
 }
 
 
+TEST_F(MasterTest, KillUnknownTaskSlaveInTransition)
+{
+  Try<PID<Master> > master = StartMaster();
+  ASSERT_SOME(master);
+
+  StandaloneMasterDetector detector(master.get());
+
+  Future<SlaveRegisteredMessage> slaveRegisteredMessage =
+    FUTURE_PROTOBUF(SlaveRegisteredMessage(), _, _);
+
+  MockExecutor exec(DEFAULT_EXECUTOR_ID);
+
+  // Start a checkpointing slave.
+  slave::Flags slaveFlags = CreateSlaveFlags();
+  slaveFlags.checkpoint = true;
+
+  Try<PID<Slave> > slave = StartSlave(&exec, slaveFlags);
+  ASSERT_SOME(slave);
+
+  // Wait for slave registration.
+  AWAIT_READY(slaveRegisteredMessage);
+  const SlaveID slaveId = slaveRegisteredMessage.get().slave_id();
+
+  MockScheduler sched;
+  TestingMesosSchedulerDriver driver(&sched, &detector);
+
+  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(offers);
+  EXPECT_NE(0u, offers.get().size());
+
+  // Start a task.
+  TaskInfo task = createTask(offers.get()[0], "", DEFAULT_EXECUTOR_ID);
+
+  vector<TaskInfo> tasks;
+  tasks.push_back(task);
+
+  EXPECT_CALL(exec, registered(_, _, _, _))
+    .Times(1);
+
+  EXPECT_CALL(exec, launchTask(_, _))
+    .WillOnce(SendStatusUpdateFromTask(TASK_RUNNING));
+
+  Future<TaskStatus> status;
+  EXPECT_CALL(sched, statusUpdate(&driver, _))
+    .WillOnce(FutureArg<1>(&status));
+
+  driver.launchTasks(offers.get()[0].id(), tasks);
+
+  AWAIT_READY(status);
+  EXPECT_EQ(TASK_RUNNING, status.get().state());
+
+  Future<Nothing> _reregisterSlave =
+    DROP_DISPATCH(_, &Master::_reregisterSlave);
+
+  // Stop master and slave.
+  Stop(master.get());
+  Stop(slave.get());
+
+  frameworkId = Future<FrameworkID>();
+  EXPECT_CALL(sched, registered(&driver, _, _))
+    .WillOnce(FutureArg<1>(&frameworkId));
+
+  // Restart master.
+  master = StartMaster();
+  ASSERT_SOME(master);
+
+  Future<Nothing> disconnected;
+  EXPECT_CALL(sched, disconnected(&driver))
+    .WillOnce(FutureSatisfy(&disconnected));
+
+  // Simulate a spurious event (e.g., due to ZooKeeper
+  // expiration) at the scheduler.
+  detector.appoint(master.get());
+
+  AWAIT_READY(frameworkId);
+
+  // Restart slave.
+  slave = StartSlave(&exec, slaveFlags);
+
+  // Wait for the slave to start reregistration.
+  AWAIT_READY(_reregisterSlave);
+
+  // As Master::killTask isn't doing anything, we shouldn't get a status update.
+  EXPECT_CALL(sched, statusUpdate(&driver, _))
+    .Times(0);
+
+  // Set expectation that Master receives killTask message.
+  Future<KillTaskMessage> killTaskMessage =
+    FUTURE_PROTOBUF(KillTaskMessage(), _, master.get());
+
+  // Attempt to kill unknown task while slave is transitioning.
+  TaskID unknownTaskId;
+  unknownTaskId.set_value("2");
+
+  ASSERT_FALSE(unknownTaskId == task.task_id());
+
+  Clock::pause();
+
+  driver.killTask(unknownTaskId);
+
+  AWAIT_READY(killTaskMessage);
+
+  // Wait for all messages to be dispatched and processed completely to satisfy
+  // the expectation that we didn't receive a status update.
+  Clock::settle();
+
+  Clock::resume();
+
+  EXPECT_CALL(exec, shutdown(_))
+    .Times(AtMost(1));
+
+  driver.stop();
+  driver.join();
+
+  Shutdown();
+}
+
+
 TEST_F(MasterTest, StatusUpdateAck)
 {
   Try<PID<Master> > master = StartMaster();