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