You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@mesos.apache.org by be...@apache.org on 2011/06/05 07:44:40 UTC

svn commit: r1131885 - in /incubator/mesos/trunk/src: configuration.cpp master.cpp master.hpp master_main.cpp nexus_local.cpp slave.cpp slave.hpp slave_main.cpp

Author: benh
Date: Sun Jun  5 05:44:40 2011
New Revision: 1131885

URL: http://svn.apache.org/viewvc?rev=1131885&view=rev
Log:
Made slave configurable through new configuration framework

Modified:
    incubator/mesos/trunk/src/configuration.cpp
    incubator/mesos/trunk/src/master.cpp
    incubator/mesos/trunk/src/master.hpp
    incubator/mesos/trunk/src/master_main.cpp
    incubator/mesos/trunk/src/nexus_local.cpp
    incubator/mesos/trunk/src/slave.cpp
    incubator/mesos/trunk/src/slave.hpp
    incubator/mesos/trunk/src/slave_main.cpp

Modified: incubator/mesos/trunk/src/configuration.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/configuration.cpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/configuration.cpp (original)
+++ incubator/mesos/trunk/src/configuration.cpp Sun Jun  5 05:44:40 2011
@@ -191,7 +191,13 @@ string Configuration::getUsage() const 
     string line;
 
     if (opt.defaultValue != "") {  // add default value
-      helpStr += " (default: " + opt.defaultValue + ")";
+      // Place a space between help string and (default: VAL) if the
+      // help string does not end with a newline itself
+      size_t lastNewLine = helpStr.find_last_of("\n\r");
+      if (helpStr.size() > 0 && lastNewLine != helpStr.size() - 1) {
+        helpStr += " ";
+      }
+      helpStr += "(default: " + opt.defaultValue + ")";
     }
 
     line += "--" + key + "=VAL";

Modified: incubator/mesos/trunk/src/master.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/master.cpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/master.cpp (original)
+++ incubator/mesos/trunk/src/master.cpp Sun Jun  5 05:44:40 2011
@@ -1036,3 +1036,9 @@ FrameworkID Master::newFrameworkId()
   oss << timestr << "-" << masterId << "-" << setw(4) << setfill('0') << fwId;
   return oss.str();
 }
+
+
+const Params& Master::getConf()
+{
+  return conf;
+}

Modified: incubator/mesos/trunk/src/master.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/master.hpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/master.hpp (original)
+++ incubator/mesos/trunk/src/master.hpp Sun Jun  5 05:44:40 2011
@@ -289,7 +289,7 @@ protected:
 public:
   Master();
 
-  Master(const Params& conf_);
+  Master(const Params& conf);
   
   ~Master();
 
@@ -327,6 +327,8 @@ public:
   // Make self() public so that isolation modules and tests can access it
   using Tuple<ReliableProcess>::self;
 
+  const Params& getConf();
+
 protected:
   void operator () ();
 

Modified: incubator/mesos/trunk/src/master_main.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/master_main.cpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/master_main.cpp (original)
+++ incubator/mesos/trunk/src/master_main.cpp Sun Jun  5 05:44:40 2011
@@ -30,7 +30,7 @@ int main(int argc, char **argv)
 {
   Configuration conf;
   conf.addOption<string>("url", 'u', "URL used for leader election");
-  conf.addOption<int>("port", 'p', "Port to listen on");
+  conf.addOption<int>("port", 'p', "Port to listen on", 50010);
   conf.addOption<bool>("quiet", 'q', "Disable logging to stderr", false);
   conf.addOption<string>("log_dir", "Where to place logs", "/tmp");
 #ifdef NEXUS_WEBUI
@@ -44,7 +44,6 @@ int main(int argc, char **argv)
   }
 
   Params params;
-
   try {
     conf.load(argc, argv, true);
     params = conf.getParams();

Modified: incubator/mesos/trunk/src/nexus_local.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/nexus_local.cpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/nexus_local.cpp (original)
+++ incubator/mesos/trunk/src/nexus_local.cpp Sun Jun  5 05:44:40 2011
@@ -64,7 +64,7 @@ PID launch(int numSlaves, int32_t cpus, 
     // TODO(benh): Create a local isolation module?
     ProcessBasedIsolationModule *isolationModule =
       new ProcessBasedIsolationModule();
-    Slave* slave = new Slave(Resources(cpus, mem), true, isolationModule);
+    Slave* slave = new Slave(conf, Resources(cpus, mem), true, isolationModule);
     slaves[isolationModule] = slave;
     pids.push_back(Process::spawn(slave));
   }

Modified: incubator/mesos/trunk/src/slave.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/slave.cpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/slave.cpp (original)
+++ incubator/mesos/trunk/src/slave.cpp Sun Jun  5 05:44:40 2011
@@ -67,6 +67,17 @@ Slave::Slave(Resources _resources, bool 
     isolationModule(_isolationModule) {}
 
 
+Slave::Slave(const Params& _conf, Resources _resources, bool _local,
+             IsolationModule *_isolationModule)
+  : id(""), conf(_conf), resources(_resources), local(_local),
+    isolationModule(_isolationModule) {}
+
+
+void Slave::registerOptions(Configuration* conf)
+{
+}
+
+
 Slave::~Slave()
 {
   // TODO(benh): Shut down and free executors?
@@ -481,3 +492,9 @@ string Slave::getWorkDirectory(Framework
   workDir << "work/slave-" << id << "/framework-" << fid;
   return workDir.str();
 }
+
+
+const Params& Slave::getConf()
+{
+  return conf;
+}

Modified: incubator/mesos/trunk/src/slave.hpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/slave.hpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/slave.hpp (original)
+++ incubator/mesos/trunk/src/slave.hpp Sun Jun  5 05:44:40 2011
@@ -28,6 +28,7 @@
 
 #include <reliable.hpp>
 
+#include "configuration.hpp"
 #include "fatal.hpp"
 #include "foreach.hpp"
 #include "isolation_module.hpp"
@@ -158,6 +159,8 @@ struct Executor
 class Slave : public Tuple<ReliableProcess>
 {
 public:
+  Params conf;
+
   typedef unordered_map<FrameworkID, Framework*> FrameworkMap;
   typedef unordered_map<FrameworkID, Executor*> ExecutorMap;
   
@@ -173,10 +176,17 @@ public:
   unordered_map<FrameworkID, unordered_set<int> > seqs;
 
 public:
-  Slave(Resources resources, bool local, IsolationModule *isolationModule);
+  Slave(Resources resources, bool local, IsolationModule* isolationModule);
+
+  Slave(const Params& conf,
+        Resources resources,
+        bool local,
+        IsolationModule *isolationModule);
 
   virtual ~Slave();
 
+  static void registerOptions(Configuration* conf);
+
   state::SlaveState *getState();
 
   // Callback used by isolation module to tell us when an executor exits
@@ -191,6 +201,8 @@ public:
   // Make self() public so that isolation modules and tests can access it
   using Tuple<ReliableProcess>::self;
 
+  const Params& getConf();
+
 protected:
   void operator () ();
 

Modified: incubator/mesos/trunk/src/slave_main.cpp
URL: http://svn.apache.org/viewvc/incubator/mesos/trunk/src/slave_main.cpp?rev=1131885&r1=1131884&r2=1131885&view=diff
==============================================================================
--- incubator/mesos/trunk/src/slave_main.cpp (original)
+++ incubator/mesos/trunk/src/slave_main.cpp Sun Jun  5 05:44:40 2011
@@ -12,118 +12,98 @@ using namespace std;
 using namespace nexus::internal::slave;
 
 
-void usage(const char *programName)
+void usage(const char *programName, const Configuration& conf)
 {
   cerr << "Usage: " << programName
        << " --url MASTER_URL"
        << " [--cpus NUM]"
        << " [--mem NUM]"
        << " [--isolation TYPE]"
-       << " [--webui-port PORT]"
-       << " [--quiet]" << endl
-       << endl
+       << " [...]"
+       << endl << endl
        << "MASTER_URL may be one of:" << endl
        << "  nexus://id@host:port" << endl
        << "  zoo://host1:port1,host2:port2,..." << endl
        << "  zoofile://file where file contains a host:port pair per line"
-       << endl;
+       << endl
+       << conf.getUsage();
 }
 
 
 int main(int argc, char **argv)
 {
+  Configuration conf;
+  conf.addOption<string>("url", 'u', "Master URL");
+  conf.addOption<int>("port", 'p', "Port to listen on (default: random)");
+  conf.addOption<bool>("quiet", 'q', "Disable logging to stderr", false);
+  conf.addOption<string>("log_dir", "Where to place logs", "/tmp");
+  conf.addOption<string>("isolation", 'i', "Isolation module name", "process");
+  conf.addOption<int32_t>("cpus", 'c', "CPU cores to use for tasks", 1);
+  conf.addOption<int64_t>("mem", 'm', "Memory to use for tasks, in bytes\n",
+                          1 * Gigabyte);
+#ifdef NEXUS_WEBUI
+  conf.addOption<int>("webui_port", 'w', "Web UI port", 8081);
+#endif
+  Slave::registerOptions(&conf);
+
   if (argc == 2 && string("--help") == argv[1]) {
-    usage(argv[0]);
+    usage(argv[0], conf);
     exit(1);
   }
 
-  option options[] = {
-    {"url", required_argument, 0, 'u'},
-    {"cpus", required_argument, 0, 'c'},
-    {"mem", required_argument, 0, 'm'},
-    {"isolation", required_argument, 0, 'i'},
-    {"webui-port", required_argument, 0, 'w'}, 
-    {"quiet", no_argument, 0, 'q'},
-  };
-
-  string url = "";
-  Resources resources(1, 1 * Gigabyte);
-  string isolation = "process";
-  char* webuiPortStr = "8081"; // C string because it is sent to python C API
-  bool quiet = false;
-
-  int opt;
-  int index;
-  while ((opt = getopt_long(argc, argv, "u:c:m:i:w:q", options, &index)) != -1) {
-    switch (opt) {
-      case 'u':
-        url = optarg;
-        break;
-      case 'c': 
-        resources.cpus = atoi(optarg);
-        break;
-      case 'm':
-        resources.mem = atoll(optarg);
-        break;
-      case 'i':
-        isolation = optarg;
-        break;
-      case 'w':
-        webuiPortStr = optarg;
-        break;
-      case 'q':
-        quiet = true;
-        break;
-      case '?':
-        // Error parsing options; getopt prints an error message, so just exit
-        exit(1);
-        break;
-      default:
-        break;
-    }
-  }
-
-  if (url == "") {
-    cerr << "Master URL argument (--url) required." << endl;
+  Params params;
+  try {
+    conf.load(argc, argv, true);
+    params = conf.getParams();
+  } catch (BadOptionValueException& e) {
+    cerr << "Invalid value for '" << e.what() << "' option" << endl;
+    exit(1);
+  } catch (ConfigurationException& e) {
+    cerr << "Configuration error: " << e.what() << endl;
     exit(1);
   }
 
-  if (!quiet)
-    google::SetStderrLogging(google::INFO);
+  if (params.contains("port"))
+    setenv("LIBPROCESS_PORT", params["port"].c_str(), 1);
 
-  FLAGS_log_dir = "/tmp";
+  FLAGS_log_dir = params["log_dir"];
   FLAGS_logbufsecs = 1;
   google::InitGoogleLogging(argv[0]);
 
+  bool quiet = params.get<bool>("quiet", false);
+  if (!quiet)
+    google::SetStderrLogging(google::INFO);
+
+  if (!params.contains("url")) {
+    cerr << "Master URL argument (--url) required." << endl;
+    exit(1);
+  }
+  string url = params["url"];
+
+  string isolation = params["isolation"];
   LOG(INFO) << "Creating \"" << isolation << "\" isolation module";
   IsolationModule *isolationModule = IsolationModule::create(isolation);
 
-  if (isolationModule == NULL)
-    fatal("unrecognized isolation type: %s", isolation.c_str());
+  if (isolationModule == NULL) {
+    cerr << "Unrecognized isolation type: " << isolation << endl;
+    exit(1);
+  }
 
   LOG(INFO) << "Build: " << BUILD_DATE << " by " << BUILD_USER;
   LOG(INFO) << "Starting Nexus slave";
 
-  Slave* slave = new Slave(resources, false, isolationModule);
+  if (chdir(dirname(argv[0])) != 0)
+    fatalerror("Could not chdir into %s", dirname(argv[0]));
+
+  Resources resources(params.get<int32_t>("cpus", 1),
+                      params.get<int64_t>("mem", 1 * Gigabyte));
+  Slave* slave = new Slave(params, resources, false, isolationModule);
   PID pid = Process::spawn(slave);
 
   MasterDetector *detector = MasterDetector::create(url, pid, false, quiet);
 
 #ifdef NEXUS_WEBUI
-  if (chdir(dirname(argv[0])) != 0)
-    fatalerror("could not change into %s for running webui", dirname(argv[0]));
-
-  // TODO(*): Since we normally don't use exceptions in Mesos, replace
-  // use of an exception here with use of a utility to handle checking
-  // that the input string is actually a number that fits
-  // in the type being used (in this case, short).
-  try {
-    lexical_cast<short>(webuiPortStr);
-  } catch(bad_lexical_cast &) {
-    fatal("Passed invalid string for webui port number.\n");
-  }
-
-  startSlaveWebUI(pid, webuiPortStr);
+  startSlaveWebUI(pid, (char*) params["webui_port"].c_str());
 #endif
 
   Process::wait(pid);