You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by bm...@apache.org on 2013/04/30 03:31:46 UTC

svn commit: r1477443 - in /incubator/mesos/trunk/src: master/http.cpp master/master.cpp master/master.hpp webui/master/static/controllers.js webui/master/static/home.html

Author: bmahler
Date: Tue Apr 30 01:31:45 2013
New Revision: 1477443

URL: http://svn.apache.org/r1477443
Log:
Removed the hostname:port slave map from the Master.

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

Modified:
    incubator/mesos/trunk/src/master/http.cpp
    incubator/mesos/trunk/src/master/master.cpp
    incubator/mesos/trunk/src/master/master.hpp
    incubator/mesos/trunk/src/webui/master/static/controllers.js
    incubator/mesos/trunk/src/webui/master/static/home.html

Modified: incubator/mesos/trunk/src/master/http.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/master/http.cpp?rev=1477443&r1=1477442&r2=1477443&view=diff
==============================================================================
--- incubator/mesos/trunk/src/master/http.cpp (original)
+++ incubator/mesos/trunk/src/master/http.cpp Tue Apr 30 01:31:45 2013
@@ -265,9 +265,8 @@ Future<Response> stats(
   object.values["elected"] = master.elected; // Note: using int not bool.
   object.values["total_schedulers"] = master.frameworks.size();
   object.values["active_schedulers"] = master.getActiveFrameworks().size();
-  object.values["activated_slaves"] = master.slavePIDs.size();
-  object.values["deactivated_slaves"] = master.deactivatedSlavePIDs.size();
-  object.values["connected_slaves"] = master.slaves.size();
+  object.values["activated_slaves"] = master.slaves.size();
+  object.values["deactivated_slaves"] = master.deactivatedSlaves.size();
   object.values["staged_tasks"] = master.stats.tasks[TASK_STAGING];
   object.values["started_tasks"] = master.stats.tasks[TASK_STARTING];
   object.values["finished_tasks"] = master.stats.tasks[TASK_FINISHED];
@@ -318,9 +317,8 @@ Future<Response> state(
   object.values["start_time"] = master.startTime;
   object.values["id"] = master.info.id();
   object.values["pid"] = string(master.self());
-  object.values["activated_slaves"] = master.slavePIDs.size();
-  object.values["deactivated_slaves"] = master.deactivatedSlavePIDs.size();
-  object.values["connected_slaves"] = master.slaves.size();
+  object.values["activated_slaves"] = master.slaves.size();
+  object.values["deactivated_slaves"] = master.deactivatedSlaves.size();
   object.values["staged_tasks"] = master.stats.tasks[TASK_STAGING];
   object.values["started_tasks"] = master.stats.tasks[TASK_STARTING];
   object.values["finished_tasks"] = master.stats.tasks[TASK_FINISHED];

Modified: incubator/mesos/trunk/src/master/master.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/master/master.cpp?rev=1477443&r1=1477442&r2=1477443&view=diff
==============================================================================
--- incubator/mesos/trunk/src/master/master.cpp (original)
+++ incubator/mesos/trunk/src/master/master.cpp Tue Apr 30 01:31:45 2013
@@ -172,8 +172,7 @@ protected:
 
   void deactivate()
   {
-    dispatch(
-        master, &Master::deactivateSlave, slaveInfo.hostname(), slave.port);
+    dispatch(master, &Master::deactivateSlave, slaveId);
   }
 
 private:
@@ -460,18 +459,18 @@ void Master::exited(const UPID& pid)
         removeSlave(slave);
         return;
       } else {
-        // If a slave is checkpointing, remove frameworks from this
-        // slave that have disabled checkpointing.
+        // If a slave is checkpointing, remove all non-checkpointing
+        // frameworks from the slave.
         hashset<FrameworkID> ids;
         foreachvalue (Task* task, utils::copy(slave->tasks)) {
           if (!ids.contains(task->framework_id())) {
             ids.insert(task->framework_id());
             Framework* framework = getFramework(task->framework_id());
             if (framework != NULL && !framework->info.checkpoint()) {
-              LOG(INFO) << "Removing framework " << task->framework_id()
+              LOG(INFO) << "Removing non-checkpointing framework "
+                        << task->framework_id()
                         << " from disconnected slave " << slave->id
-                        << "(" << slave->info.hostname() << ") "
-                        << "because it is not checkpointing!";
+                        << "(" << slave->info.hostname() << ")";
 
               removeFramework(slave, framework);
             }
@@ -915,13 +914,13 @@ void Master::reregisterSlave(const Slave
   if (slaveId == "") {
     LOG(ERROR) << "Slave " << from << " re-registered without an id!";
     reply(ShutdownMessage());
-  } else if (deactivatedSlavePIDs.contains(slaveInfo.hostname(), from.port)) {
+  } else if (deactivatedSlaves.contains(from)) {
     // We disallow deactivated slaves from re-registering. This is
     // to ensure that when a master deactivates a slave that was
     // partitioned, we don't allow the slave to re-register, as we've
     // already informed frameworks that the tasks were lost.
-    LOG(ERROR) << "Slave " << from
-               << " attempted to re-register after deactivation";
+    LOG(ERROR) << "Slave " << slaveId << " at " << from
+               << "attempted to re-register after deactivation";
     reply(ShutdownMessage());
   } else {
     Slave* slave = getSlave(slaveId);
@@ -1186,24 +1185,23 @@ void Master::exitedExecutor(const SlaveI
 }
 
 
-void Master::deactivateSlave(const string& hostname, uint16_t port)
+void Master::deactivateSlave(const SlaveID& slaveId)
 {
-  if (slavePIDs.contains(hostname, port)) {
-    // Look for a connected slave and remove it.
-    foreachvalue (Slave* slave, slaves) {
-      if (slave->info.hostname() == hostname && slave->pid.port == port) {
-        LOG(WARNING) << "Removing slave " << slave->id << " at "
-                     << hostname << ":" << port
-                     << " because it has been deactivated";
-        send(slave->pid, ShutdownMessage());
-        removeSlave(slave);
-        break;
-      }
-    }
-
-    LOG(INFO) << "Master now considering a slave at "
-	            << hostname << ":" << port << " as inactive";
+  if (!slaves.contains(slaveId)) {
+    // Possible when the SlaveObserver dispatched to deactivate a slave,
+    // but exited() was already called for this slave.
+    LOG(WARNING) << "Unable to deactivate unknown slave " << slaveId;
+    return;
   }
+
+  Slave* slave = slaves[slaveId];
+  CHECK_NOTNULL(slave);
+
+  LOG(WARNING) << "Removing slave " << slave->id << " at " << slave->pid
+               << " because it has been deactivated";
+
+  send(slave->pid, ShutdownMessage());
+  removeSlave(slave);
 }
 
 
@@ -1848,8 +1846,7 @@ void Master::addSlave(Slave* slave, bool
             << " at " << slave->info.hostname()
             << " with " << slave->info.resources();
 
-  slavePIDs.put(slave->info.hostname(), slave->pid.port);
-  deactivatedSlavePIDs.remove(slave->info.hostname(), slave->pid.port);
+  deactivatedSlaves.erase(slave->pid);
   slaves[slave->id] = slave;
 
   link(slave->pid);
@@ -2024,9 +2021,8 @@ void Master::removeSlave(Slave* slave)
 
   // TODO(benh): unlink(slave->pid);
 
-  // Delete it.
-  slavePIDs.remove(slave->info.hostname(), slave->pid.port);
-  deactivatedSlavePIDs.put(slave->info.hostname(), slave->pid.port);
+  // Mark the slave as deactivated.
+  deactivatedSlaves.insert(slave->pid);
   slaves.erase(slave->id);
   delete slave;
 }

Modified: incubator/mesos/trunk/src/master/master.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/master/master.hpp?rev=1477443&r1=1477442&r2=1477443&view=diff
==============================================================================
--- incubator/mesos/trunk/src/master/master.hpp (original)
+++ incubator/mesos/trunk/src/master/master.hpp Tue Apr 30 01:31:45 2013
@@ -115,7 +115,7 @@ public:
                       const FrameworkID& frameworkId,
                       const ExecutorID& executorId,
                       int32_t status);
-  void deactivateSlave(const std::string& hostname, uint16_t port);
+  void deactivateSlave(const SlaveID& slaveId);
   void frameworkFailoverTimeout(const FrameworkID& frameworkId,
                                 double reregisteredTime);
 
@@ -225,9 +225,9 @@ private:
   MasterInfo info;
 
   hashmap<FrameworkID, Framework*> frameworks;
+
   hashmap<SlaveID, Slave*> slaves;
-  multihashmap<std::string, uint16_t> slavePIDs;
-  multihashmap<std::string, uint16_t> deactivatedSlavePIDs;
+  hashset<UPID> deactivatedSlaves;
 
   hashmap<OfferID, Offer*> offers;
 

Modified: incubator/mesos/trunk/src/webui/master/static/controllers.js
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/master/static/controllers.js?rev=1477443&r1=1477442&r2=1477443&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/master/static/controllers.js (original)
+++ incubator/mesos/trunk/src/webui/master/static/controllers.js Tue Apr 30 01:31:45 2013
@@ -186,7 +186,7 @@ function update($scope, $defer, data) {
   $scope.lost_tasks = $scope.state.lost_tasks;
 
   $scope.activated_slaves = $scope.state.activated_slaves;
-  $scope.connected_slaves = $scope.state.connected_slaves;
+  $scope.deactivated_slaves = $scope.state.deactivated_slaves;
 
   _.each($scope.slaves, function(slave) {
     $scope.total_cpus += slave.resources.cpus;

Modified: incubator/mesos/trunk/src/webui/master/static/home.html
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/webui/master/static/home.html?rev=1477443&r1=1477442&r2=1477443&view=diff
==============================================================================
--- incubator/mesos/trunk/src/webui/master/static/home.html (original)
+++ incubator/mesos/trunk/src/webui/master/static/home.html Tue Apr 30 01:31:45 2013
@@ -44,13 +44,13 @@
       <table class="table table-condensed">
         <tbody>
           <tr>
-            <th>Connected</th>
-            <td>{{connected_slaves | number}}</td>
-          </tr>
-          <tr>
             <th>Activated</th>
             <td>{{activated_slaves | number}}</td>
           </tr>
+          <tr>
+            <th>Deactivated</th>
+            <td>{{deactivated_slaves | number}}</td>
+          </tr>
         </tbody>
       </table>