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);
 

Reply via email to