From 82482278fb2d104925558927e6fb4be8d262ea72 Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 19 Mar 2023 22:12:40 -0700 Subject: [PATCH] construct: Handle SIGUSR2 to refresh slave. --- construct/signals.cc | 47 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/construct/signals.cc b/construct/signals.cc index 5d1582893..b46d12f00 100644 --- a/construct/signals.cc +++ b/construct/signals.cc @@ -20,6 +20,7 @@ namespace construct namespace ph = std::placeholders; static void handle_cont(); + static void handle_usr2(); static void handle_usr1(); static void handle_quit(); static void handle_interrupt(); @@ -42,6 +43,7 @@ construct::signals::signals(boost::asio::io_context &ios) signal_set->add(SIGQUIT); signal_set->add(SIGTERM); signal_set->add(SIGUSR1); + signal_set->add(SIGUSR2); signal_set->add(SIGCONT); set_handle(); } @@ -133,6 +135,7 @@ construct::handle_signal(const int &signum) case SIGQUIT: return handle_quit(); case SIGTERM: return handle_quit(); case SIGUSR1: return handle_usr1(); + case SIGUSR2: return handle_usr2(); case SIGCONT: return handle_cont(); default: break; } @@ -252,6 +255,50 @@ catch(const std::exception &e) }; } +void +construct::handle_usr2() +try +{ + if(ircd::run::level != ircd::run::level::RUN) + { + ircd::log::warning + { + "Not synchronizing database from SIGUSR2 in runlevel %s", + reflect(ircd::run::level) + }; + + return; + } + + if(!ircd::slave) + return; + + if(!homeserver::primary || !homeserver::primary->module[0]) + return; + + ircd::context{[] + { + static ircd::mods::import refresh + { + homeserver::primary->module[0], "ircd::m::homeserver::refresh" + }; + + assert(homeserver::primary->hs); + const bool refreshed + { + refresh(homeserver::primary->hs.get()) + }; + }}; +} +catch(const std::exception &e) +{ + ircd::log::error + { + "SIGUSR2 handler :%s", + e.what() + }; +} + void construct::handle_cont() try