Exemple #1
0
int main(int argc, const char** argv)
{
	Turbopump::Options options;
	string versionStr = "0.1." + string(__DATE__) + " " + string(__TIME__);

	ezOptionParser opt;
	opt.overview = "A high performance distributed key value store. 'high performance' is a relative term.";
	opt.syntax = "./turbopumpd --dothething";
	opt.example = examples();
	opt.footer = "\n\n***version " + versionStr;

	opt.add("", false, 0, 0, "Display usage instructions.", "-h", "--help");
	opt.add("localhost:1592", false, 1, 0, "local server. File path (domain socket), or tcp bind address.", "-l", "--local-addr");
	opt.add(str::str(options.internal_port).c_str(), false, 1, 0, "udp port", "-p", "--port");
	opt.add("", false, 0, 0, "run cluster in clone mode", "-c", "--clone");
	opt.add(options.home_dir.c_str(), false, 1, 0, "Home directory for settings data. Default is cwd.", "--home");
	opt.add(options.store.c_str(), false, 1, 0, "Data store backend. Default is file-system backed database at `--home`/store.", "--store");

	opt.add("2000", false, 1, 0, "sync interval (ms)", "--sync-interval");

	opt.add("", false, 0, 0, "TEST-ONLY: disable data forwarding", "--no-write-chaining");
	opt.add("", false, 0, 0, "TEST-ONLY: disable query-response data sync between peers", "--no-active-sync");
	opt.add("", false, 0, 0, "peer-to-peer communications use UDP instead of congestion-aware, reliable UDT", "--udp");

	opt.parse(argc, argv);

	if (opt.isSet("-h"))
	{
		std::string usage;
		opt.getUsage(usage);
		std::cout << usage << std::endl;
		return 1;
	}
	OptionGroup* og;

	socket_address localAddr;
	if ((og = opt.get("--local-addr")) != NULL)
	{
		string turbopath;
		og->getString(turbopath);
		std::vector<string> comps = str::split(turbopath, ':');
		if (comps.size() == 1)
			localAddr = socket_address(comps[0]);
		else if (comps.size() == 2)
			localAddr = socket_address(comps[0], std::stoi(comps[1]));
	}

	// update Turbopump::Options
	if ((og = opt.get("--port")) != NULL)
	{
		unsigned long temp;
		og->getULong(temp);
		options.internal_port = temp;
	}

	if ((og = opt.get("--sync-interval")) != NULL)
	{
		unsigned long temp;
		og->getULong(temp);
		options.sync_interval_ms = temp;
	}

	if ((og = opt.get("--home")) != NULL)
		og->getString(options.home_dir);
	if ((og = opt.get("--store")) != NULL)
		og->getString(options.store);
	if (opt.isSet("--clone"))
		options.partition_keys = false;
	if (opt.isSet("--no-write-chaining"))
		options.write_chaining = false;
	if (opt.isSet("--no-active-sync"))
		options.active_sync = false;
	if (opt.isSet("--udp"))
		options.udt = false;

	std::cout << localAddr.toString() << ":" << options.internal_port << std::endl;
	_app.reset( new TurboApp(options, localAddr) );

	::signal(SIGINT, &onShutdown);
	::signal(SIGTERM, &onShutdown);
	::signal(SIGPIPE, SIG_IGN); // may use SO_NOSIGPIPE and/or MSG_NOSIGNAL instead...
	_app->run();
	return 0;
}