bool runServer(const McrouterStandaloneOptions& standaloneOpts, const McrouterOptions& mcrouterOpts) { AsyncMcServer::Options opts; if (standaloneOpts.listen_sock_fd >= 0) { opts.existingSocketFd = standaloneOpts.listen_sock_fd; } else if (!standaloneOpts.unix_domain_sock.empty()) { opts.unixDomainSockPath = standaloneOpts.unix_domain_sock; } else { opts.ports = standaloneOpts.ports; opts.sslPorts = standaloneOpts.ssl_ports; opts.pemCertPath = mcrouterOpts.pem_cert_path; opts.pemKeyPath = mcrouterOpts.pem_key_path; opts.pemCaPath = mcrouterOpts.pem_ca_path; } opts.numThreads = mcrouterOpts.num_proxies; opts.setPerThreadMaxConns(standaloneOpts.max_conns, opts.numThreads); opts.tcpListenBacklog = standaloneOpts.tcp_listen_backlog; opts.worker.defaultVersionHandler = false; opts.worker.maxInFlight = standaloneOpts.max_client_outstanding_reqs; opts.worker.sendTimeout = std::chrono::milliseconds{ standaloneOpts.client_timeout_ms}; if (!mcrouterOpts.debug_fifo_root.empty()) { opts.worker.debugFifoPath = getServerDebugFifoFullPath(mcrouterOpts); } /* Default to one read per event to help latency-sensitive workloads. We can make this an option if this needs to be adjusted. */ opts.worker.maxReadsPerEvent = 1; try { LOG(INFO) << "Spawning AsyncMcServer"; AsyncMcServer server(opts); server.installShutdownHandler({SIGINT, SIGTERM}); auto router = McrouterInstance::init( "standalone", mcrouterOpts, server.eventBases()); if (router == nullptr) { LOG(ERROR) << "CRITICAL: Failed to initialize mcrouter!"; return false; } router->addStartupOpts(standaloneOpts.toDict()); if (standaloneOpts.postprocess_logging_route) { router->setPostprocessCallback(getLogPostprocessFunc<void>()); } if (standaloneOpts.enable_server_compression && !mcrouterOpts.enable_compression) { initCompression(*router); } server.spawn( [router, &standaloneOpts] (size_t threadId, folly::EventBase& evb, AsyncMcServerWorker& worker) { serverLoop(*router, threadId, evb, worker, standaloneOpts); }, [router]() { router->shutdown(); } ); server.join(); LOG(INFO) << "Shutting down"; McrouterInstance::freeAllMcrouters(); if (!opts.unixDomainSockPath.empty()) { std::remove(opts.unixDomainSockPath.c_str()); } } catch (const std::exception& e) { LOG(ERROR) << e.what(); return false; } return true; }
bool runServer(const McrouterStandaloneOptions& standaloneOpts, const McrouterOptions& mcrouterOpts) { AsyncMcServer::Options opts; if (standaloneOpts.listen_sock_fd >= 0) { opts.existingSocketFd = standaloneOpts.listen_sock_fd; } else if (!standaloneOpts.unix_domain_sock.empty()) { opts.unixDomainSockPath = standaloneOpts.unix_domain_sock; } else { opts.ports = standaloneOpts.ports; opts.sslPorts = standaloneOpts.ssl_ports; opts.pemCertPath = mcrouterOpts.pem_cert_path; opts.pemKeyPath = mcrouterOpts.pem_key_path; opts.pemCaPath = mcrouterOpts.pem_ca_path; } opts.numThreads = mcrouterOpts.num_proxies; opts.worker.connLRUopts.maxConns = (standaloneOpts.max_conns + opts.numThreads - 1) / opts.numThreads; opts.worker.versionString = MCROUTER_PACKAGE_STRING; opts.worker.maxInFlight = standaloneOpts.max_client_outstanding_reqs; opts.worker.sendTimeout = std::chrono::milliseconds{ mcrouterOpts.server_timeout_ms}; /* Default to one read per event to help latency-sensitive workloads. We can make this an option if this needs to be adjusted. */ opts.worker.maxReadsPerEvent = 1; opts.worker.requestsPerRead = standaloneOpts.requests_per_read; try { LOG(INFO) << "Spawning AsyncMcServer"; AsyncMcServer server(opts); server.installShutdownHandler({SIGINT, SIGTERM}); auto router = McrouterInstance::init( "standalone", mcrouterOpts, server.eventBases()); if (router == nullptr) { LOG(ERROR) << "CRITICAL: Failed to initialize mcrouter!"; return false; } router->addStartupOpts(standaloneOpts.toDict()); if (standaloneOpts.postprocess_logging_route) { router->setPostprocessCallback(getLogPostprocessFunc<void>()); } server.spawn( [router, &standaloneOpts] (size_t threadId, folly::EventBase& evb, AsyncMcServerWorker& worker) { serverLoop(*router, threadId, evb, worker, standaloneOpts.retain_source_ip); } ); server.join(); LOG(INFO) << "Shutting down"; McrouterInstance::freeAllMcrouters(); if (!opts.unixDomainSockPath.empty()) { std::remove(opts.unixDomainSockPath.c_str()); } } catch (const std::exception& e) { LOG(ERROR) << e.what(); return false; } return true; }