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