From 76cf929ccf37f7df80cc38f1348f8df6bfeeabde Mon Sep 17 00:00:00 2001 From: "kyle.cao" Date: Wed, 5 Jan 2022 20:02:05 +0800 Subject: [PATCH] fix service crash (#3616) --- src/daemons/GraphDaemon.cpp | 26 ++++++++++++-------------- src/daemons/MetaDaemon.cpp | 32 ++++++++++++++++---------------- src/daemons/StorageDaemon.cpp | 31 +++++++++++++++---------------- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/src/daemons/GraphDaemon.cpp b/src/daemons/GraphDaemon.cpp index 0b76f558120..217ce7aa1f7 100644 --- a/src/daemons/GraphDaemon.cpp +++ b/src/daemons/GraphDaemon.cpp @@ -30,8 +30,8 @@ using nebula::fs::FileUtils; using nebula::graph::GraphService; using nebula::network::NetworkUtils; -static void signalHandler(int sig); -static Status setupSignalHandler(); +static void signalHandler(nebula::graph::GraphServer *graphServer, int sig); +static Status setupSignalHandler(nebula::graph::GraphServer *graphServer); static void printHelp(const char *prog); #if defined(__x86_64__) extern Status setupBreakpad(); @@ -40,8 +40,6 @@ extern Status setupBreakpad(); DECLARE_string(flagfile); DECLARE_bool(containerized); -std::unique_ptr gServer; - int main(int argc, char *argv[]) { google::SetVersionString(nebula::versionString()); if (argc == 1) { @@ -153,37 +151,37 @@ int main(int argc, char *argv[]) { } LOG(INFO) << "Number of worker threads: " << FLAGS_num_worker_threads; + auto graphServer = std::make_unique(localhost); // Setup the signal handlers - status = setupSignalHandler(); + status = setupSignalHandler(graphServer.get()); if (!status.ok()) { LOG(ERROR) << status; return EXIT_FAILURE; } - gServer = std::make_unique(localhost); - - if (!gServer->start()) { + if (!graphServer->start()) { LOG(ERROR) << "The graph server start failed"; return EXIT_FAILURE; } - gServer->waitUntilStop(); + graphServer->waitUntilStop(); LOG(INFO) << "The graph Daemon stopped"; return EXIT_SUCCESS; } -Status setupSignalHandler() { +Status setupSignalHandler(nebula::graph::GraphServer *graphServer) { return nebula::SignalHandler::install( - {SIGINT, SIGTERM}, - [](nebula::SignalHandler::GeneralSignalInfo *info) { signalHandler(info->sig()); }); + {SIGINT, SIGTERM}, [graphServer](nebula::SignalHandler::GeneralSignalInfo *info) { + signalHandler(graphServer, info->sig()); + }); } -void signalHandler(int sig) { +void signalHandler(nebula::graph::GraphServer *graphServer, int sig) { switch (sig) { case SIGINT: case SIGTERM: FLOG_INFO("Signal %d(%s) received, stopping this server", sig, ::strsignal(sig)); - gServer->notifyStop(); + graphServer->notifyStop(); break; default: FLOG_ERROR("Signal %d(%s) received but ignored", sig, ::strsignal(sig)); diff --git a/src/daemons/MetaDaemon.cpp b/src/daemons/MetaDaemon.cpp index 211a88d17d0..8c8eb306611 100644 --- a/src/daemons/MetaDaemon.cpp +++ b/src/daemons/MetaDaemon.cpp @@ -53,12 +53,11 @@ DEFINE_int32(meta_http_thread_num, 3, "Number of meta daemon's http thread"); DEFINE_string(pid_file, "pids/nebula-metad.pid", "File to hold the process id"); DEFINE_bool(daemonize, true, "Whether run as a daemon process"); -static std::unique_ptr gServer; static std::unique_ptr gKVStore; -static void signalHandler(int sig); +static void signalHandler(apache::thrift::ThriftServer* metaServer, int sig); static void waitForStop(); -static Status setupSignalHandler(); +static Status setupSignalHandler(apache::thrift::ThriftServer* metaServer); #if defined(__x86_64__) extern Status setupBreakpad(); #endif @@ -189,8 +188,9 @@ int main(int argc, char* argv[]) { } } + auto metaServer = std::make_unique(); // Setup the signal handlers - status = setupSignalHandler(); + status = setupSignalHandler(metaServer.get()); if (!status.ok()) { LOG(ERROR) << status; return EXIT_FAILURE; @@ -215,14 +215,13 @@ int main(int argc, char* argv[]) { std::make_shared(gKVStore.get(), metaClusterId()); LOG(INFO) << "The meta daemon start on " << localhost; try { - gServer = std::make_unique(); - gServer->setPort(FLAGS_port); - gServer->setIdleTimeout(std::chrono::seconds(0)); // No idle timeout on client connection - gServer->setInterface(std::move(handler)); + metaServer->setPort(FLAGS_port); + metaServer->setIdleTimeout(std::chrono::seconds(0)); // No idle timeout on client connection + metaServer->setInterface(std::move(handler)); if (FLAGS_enable_ssl || FLAGS_enable_meta_ssl) { - gServer->setSSLConfig(nebula::sslContextConfig()); + metaServer->setSSLConfig(nebula::sslContextConfig()); } - gServer->serve(); // Will wait until the server shuts down + metaServer->serve(); // Will wait until the server shuts down waitForStop(); } catch (const std::exception& e) { LOG(ERROR) << "Exception thrown: " << e.what(); @@ -233,19 +232,20 @@ int main(int argc, char* argv[]) { return EXIT_SUCCESS; } -Status setupSignalHandler() { +Status setupSignalHandler(apache::thrift::ThriftServer* metaServer) { return nebula::SignalHandler::install( - {SIGINT, SIGTERM}, - [](nebula::SignalHandler::GeneralSignalInfo* info) { signalHandler(info->sig()); }); + {SIGINT, SIGTERM}, [metaServer](nebula::SignalHandler::GeneralSignalInfo* info) { + signalHandler(metaServer, info->sig()); + }); } -void signalHandler(int sig) { +void signalHandler(apache::thrift::ThriftServer* metaServer, int sig) { switch (sig) { case SIGINT: case SIGTERM: FLOG_INFO("Signal %d(%s) received, stopping this server", sig, ::strsignal(sig)); - if (gServer) { - gServer->stop(); + if (metaServer) { + metaServer->stop(); } break; default: diff --git a/src/daemons/StorageDaemon.cpp b/src/daemons/StorageDaemon.cpp index e40625b531d..5b22349b83d 100644 --- a/src/daemons/StorageDaemon.cpp +++ b/src/daemons/StorageDaemon.cpp @@ -45,14 +45,12 @@ using nebula::Status; using nebula::StatusOr; using nebula::network::NetworkUtils; -static void signalHandler(int sig); -static Status setupSignalHandler(); +static void signalHandler(nebula::storage::StorageServer *storageServer, int sig); +static Status setupSignalHandler(nebula::storage::StorageServer *storageServer); #if defined(__x86_64__) extern Status setupBreakpad(); #endif -std::unique_ptr gStorageServer; - int main(int argc, char *argv[]) { google::SetVersionString(nebula::versionString()); // Detect if the server has already been started @@ -150,8 +148,10 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } + auto storageServer = std::make_unique( + localhost, metaAddrsRet.value(), paths, FLAGS_wal_path, FLAGS_listener_path); // Setup the signal handlers - status = setupSignalHandler(); + status = setupSignalHandler(storageServer.get()); if (!status.ok()) { LOG(ERROR) << status; return EXIT_FAILURE; @@ -172,32 +172,31 @@ int main(int argc, char *argv[]) { return EXIT_FAILURE; } - gStorageServer = std::make_unique( - localhost, metaAddrsRet.value(), paths, FLAGS_wal_path, FLAGS_listener_path); - if (!gStorageServer->start()) { + if (!storageServer->start()) { LOG(ERROR) << "Storage server start failed"; - gStorageServer->stop(); + storageServer->stop(); return EXIT_FAILURE; } - gStorageServer->waitUntilStop(); + storageServer->waitUntilStop(); LOG(INFO) << "The storage Daemon stopped"; return EXIT_SUCCESS; } -Status setupSignalHandler() { +Status setupSignalHandler(nebula::storage::StorageServer *storageServer) { return nebula::SignalHandler::install( - {SIGINT, SIGTERM}, - [](nebula::SignalHandler::GeneralSignalInfo *info) { signalHandler(info->sig()); }); + {SIGINT, SIGTERM}, [storageServer](nebula::SignalHandler::GeneralSignalInfo *info) { + signalHandler(storageServer, info->sig()); + }); } -void signalHandler(int sig) { +void signalHandler(nebula::storage::StorageServer *storageServer, int sig) { switch (sig) { case SIGINT: case SIGTERM: FLOG_INFO("Signal %d(%s) received, stopping this server", sig, ::strsignal(sig)); - if (gStorageServer) { - gStorageServer->notifyStop(); + if (storageServer) { + storageServer->notifyStop(); } break; default: