Handled the `FrameworkInfo` field added to the `UpdateFrameworkMessage`. Review: https://reviews.apache.org/r/57108
Project: http://git-wip-us.apache.org/repos/asf/mesos/repo Commit: http://git-wip-us.apache.org/repos/asf/mesos/commit/4912f341 Tree: http://git-wip-us.apache.org/repos/asf/mesos/tree/4912f341 Diff: http://git-wip-us.apache.org/repos/asf/mesos/diff/4912f341 Branch: refs/heads/master Commit: 4912f341dce12f10b43fe82db20086032391e95a Parents: 60577e7 Author: Michael Park <[email protected]> Authored: Sun Feb 12 17:36:32 2017 -0800 Committer: Michael Park <[email protected]> Committed: Fri Mar 3 03:39:02 2017 -0800 ---------------------------------------------------------------------- src/master/master.cpp | 9 ++++++--- src/slave/slave.cpp | 30 +++++++++++++----------------- src/slave/slave.hpp | 5 +++-- src/tests/slave_recovery_tests.cpp | 10 +++++++++- src/tests/slave_tests.cpp | 8 +++++++- 5 files changed, 38 insertions(+), 24 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/mesos/blob/4912f341/src/master/master.cpp ---------------------------------------------------------------------- diff --git a/src/master/master.cpp b/src/master/master.cpp index 442fbc6..43e6fad 100644 --- a/src/master/master.cpp +++ b/src/master/master.cpp @@ -2676,12 +2676,13 @@ void Master::_subscribe( // it currently isn't running any tasks. foreachvalue (Slave* slave, slaves.registered) { UpdateFrameworkMessage message; - message.mutable_framework_id()->MergeFrom(frameworkInfo.id()); + message.mutable_framework_id()->CopyFrom(frameworkInfo.id()); // TODO(anand): We set 'pid' to UPID() for http frameworks // as 'pid' was made optional in 0.24.0. In 0.25.0, we // no longer have to set pid here for http frameworks. message.set_pid(UPID()); + message.mutable_framework_info()->CopyFrom(frameworkInfo); send(slave->pid, message); } } @@ -3038,8 +3039,9 @@ void Master::_subscribe( // it currently isn't running any tasks. foreachvalue (Slave* slave, slaves.registered) { UpdateFrameworkMessage message; - message.mutable_framework_id()->MergeFrom(frameworkInfo.id()); + message.mutable_framework_id()->CopyFrom(frameworkInfo.id()); message.set_pid(from); + message.mutable_framework_info()->CopyFrom(frameworkInfo); send(slave->pid, message); } } @@ -5961,12 +5963,13 @@ void Master::__reregisterSlave( // re-registering slaves. if (framework != nullptr && framework->connected()) { UpdateFrameworkMessage message; - message.mutable_framework_id()->MergeFrom(framework->id()); + message.mutable_framework_id()->CopyFrom(framework->id()); // TODO(anand): We set 'pid' to UPID() for http frameworks // as 'pid' was made optional in 0.24.0. In 0.25.0, we // no longer have to set pid here for http frameworks. message.set_pid(framework->pid.getOrElse(UPID())); + message.mutable_framework_info()->CopyFrom(framework->info); send(slave->pid, message); } http://git-wip-us.apache.org/repos/asf/mesos/blob/4912f341/src/slave/slave.cpp ---------------------------------------------------------------------- diff --git a/src/slave/slave.cpp b/src/slave/slave.cpp index 6ae9458..4db367c 100644 --- a/src/slave/slave.cpp +++ b/src/slave/slave.cpp @@ -616,7 +616,8 @@ void Slave::initialize() install<UpdateFrameworkMessage>( &Slave::updateFramework, &UpdateFrameworkMessage::framework_id, - &UpdateFrameworkMessage::pid); + &UpdateFrameworkMessage::pid, + &UpdateFrameworkMessage::framework_info); install<CheckpointResourcesMessage>( &Slave::checkpointResources, @@ -2799,7 +2800,8 @@ void Slave::schedulerMessage( void Slave::updateFramework( const FrameworkID& frameworkId, - const UPID& pid) + const UPID& pid, + const FrameworkInfo& frameworkInfo) { CHECK(state == RECOVERING || state == DISCONNECTED || state == RUNNING || state == TERMINATING) @@ -2814,18 +2816,23 @@ void Slave::updateFramework( Framework* framework = getFramework(frameworkId); if (framework == nullptr) { - LOG(WARNING) << "Ignoring updating pid for framework " << frameworkId + LOG(WARNING) << "Ignoring info update for framework " << frameworkId << " because it does not exist"; return; } switch (framework->state) { case Framework::TERMINATING: - LOG(WARNING) << "Ignoring updating pid for framework " << frameworkId + LOG(WARNING) << "Ignoring info update for framework " << frameworkId << " because it is terminating"; break; case Framework::RUNNING: { - LOG(INFO) << "Updating framework " << frameworkId << " pid to " << pid; + LOG(INFO) << "Updating info for framework " << frameworkId + << (pid != UPID() ? "with pid updated to " + stringify(pid) + : ""); + + framework->info.CopyFrom(frameworkInfo); + framework->capabilities = frameworkInfo.capabilities(); if (pid == UPID()) { framework->pid = None(); @@ -2834,18 +2841,7 @@ void Slave::updateFramework( } if (framework->info.checkpoint()) { - // Checkpoint the framework pid, note that when the 'pid' - // is None, we checkpoint a default UPID() because - // 0.23.x slaves consider a missing pid file to be an - // error. - const string path = paths::getFrameworkPidPath( - metaDir, info.id(), frameworkId); - - VLOG(1) << "Checkpointing framework pid" - << " '" << framework->pid.getOrElse(UPID()) << "'" - << " to '" << path << "'"; - - CHECK_SOME(state::checkpoint(path, framework->pid.getOrElse(UPID()))); + framework->checkpointFramework(); } // Inform status update manager to immediately resend any pending http://git-wip-us.apache.org/repos/asf/mesos/blob/4912f341/src/slave/slave.hpp ---------------------------------------------------------------------- diff --git a/src/slave/slave.hpp b/src/slave/slave.hpp index 449971b..e6fac20 100644 --- a/src/slave/slave.hpp +++ b/src/slave/slave.hpp @@ -187,7 +187,8 @@ public: void updateFramework( const FrameworkID& frameworkId, - const process::UPID& pid); + const process::UPID& pid, + const FrameworkInfo& frameworkInfo); void checkpointResources(const std::vector<Resource>& checkpointedResources); @@ -1065,7 +1066,7 @@ struct Framework // the 'Slave' class. Slave* slave; - const FrameworkInfo info; + FrameworkInfo info; protobuf::framework::Capabilities capabilities; http://git-wip-us.apache.org/repos/asf/mesos/blob/4912f341/src/tests/slave_recovery_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/slave_recovery_tests.cpp b/src/tests/slave_recovery_tests.cpp index b5b8058..a29b29c 100644 --- a/src/tests/slave_recovery_tests.cpp +++ b/src/tests/slave_recovery_tests.cpp @@ -1976,9 +1976,17 @@ TYPED_TEST(SlaveRecoveryTest, NonCheckpointingFramework) Future<Nothing> updateFramework = FUTURE_DISPATCH(_, &Slave::updateFramework); + // Set the `FrameworkID` in `FrameworkInfo`. + frameworkInfo.mutable_id()->CopyFrom(frameworkId); + // Simulate a 'UpdateFrameworkMessage' to ensure framework pid is // not being checkpointed. - process::dispatch(slave.get()->pid, &Slave::updateFramework, frameworkId, ""); + process::dispatch( + slave.get()->pid, + &Slave::updateFramework, + frameworkId, + "", + frameworkInfo); AWAIT_READY(updateFramework); http://git-wip-us.apache.org/repos/asf/mesos/blob/4912f341/src/tests/slave_tests.cpp ---------------------------------------------------------------------- diff --git a/src/tests/slave_tests.cpp b/src/tests/slave_tests.cpp index 3731c76..ec2cd34 100644 --- a/src/tests/slave_tests.cpp +++ b/src/tests/slave_tests.cpp @@ -4619,9 +4619,11 @@ TEST_F(SlaveTest, HTTPSchedulerLiveUpgrade) Try<Owned<cluster::Slave>> slave = StartSlave(detector.get(), &containerizer); ASSERT_SOME(slave); + FrameworkInfo frameworkInfo = DEFAULT_FRAMEWORK_INFO; + MockScheduler sched; MesosSchedulerDriver driver( - &sched, DEFAULT_FRAMEWORK_INFO, master.get()->pid, DEFAULT_CREDENTIAL); + &sched, frameworkInfo, master.get()->pid, DEFAULT_CREDENTIAL); Future<FrameworkID> frameworkId; EXPECT_CALL(sched, registered(&driver, _, _)) @@ -4644,11 +4646,15 @@ TEST_F(SlaveTest, HTTPSchedulerLiveUpgrade) AWAIT_READY(frameworkId); AWAIT_READY(launchTask); + // Set the `FrameworkID` in `FrameworkInfo`. + frameworkInfo.mutable_id()->CopyFrom(frameworkId.get()); + // Now spoof a live upgrade of the framework by updating // the framework information to have an empty pid. UpdateFrameworkMessage updateFrameworkMessage; updateFrameworkMessage.mutable_framework_id()->CopyFrom(frameworkId.get()); updateFrameworkMessage.set_pid(""); + updateFrameworkMessage.mutable_framework_info()->CopyFrom(frameworkInfo); process::post(master.get()->pid, slave.get()->pid, updateFrameworkMessage);
