0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-06-16 00:48:26 +02:00

ircd: Add distinct maintenance mode; chain write-avoid/read-only and net listen modes.

This commit is contained in:
Jason Volk 2020-09-15 18:01:40 -07:00
parent 772022a74e
commit 4ecb2d0d5f
6 changed files with 85 additions and 48 deletions

View file

@ -472,13 +472,15 @@ enable_coredumps()
void void
applyargs() applyargs()
{ {
if(single) if(single && !bootstrap)
{ {
nolisten = true; ircd::write_avoid.set("true");
write_avoid = true;
cmdline = true; cmdline = true;
} }
if(bootstrap)
ircd::maintenance.set("true");
if(defaults) if(defaults)
ircd::defaults.set("true"); ircd::defaults.set("true");

View file

@ -111,11 +111,13 @@ namespace ircd
extern const info::versions version_api; extern const info::versions version_api;
extern const info::versions version_abi; extern const info::versions version_abi;
// Operating Mode Selectors
extern conf::item<bool> restart; extern conf::item<bool> restart;
extern conf::item<bool> debugmode; extern conf::item<bool> debugmode;
extern conf::item<bool> read_only; extern conf::item<bool> maintenance;
extern conf::item<bool> write_avoid;
extern conf::item<bool> soft_assert; extern conf::item<bool> soft_assert;
extern conf::item<bool> write_avoid; // implies maintenance
extern conf::item<bool> read_only; // implies write_avoid
extern conf::item<bool> defaults; extern conf::item<bool> defaults;
// Informational // Informational

View file

@ -41,6 +41,33 @@ ircd::version_abi
"IRCd", info::versions::ABI, 0, {0, 0, 0}, ircd::info::version "IRCd", info::versions::ABI, 0, {0, 0, 0}, ircd::info::version
}; };
/// Courtesy indicator; this item allows the library to indicate to the
/// embedder that they should restart their application (or reload this library
/// if available). The use-case here is for features like the `restart` command
/// in the console module. Such a command triggers a normal quit and the
/// application may exit normally; therefor the embedder should check this
/// item to perform a restart rather than exiting.
decltype(ircd::restart)
ircd::restart
{
{ "name", "ircd.restart" },
{ "default", false },
{ "persist", false },
};
/// Coarse mode indicator for debug/developer behavior when and if possible.
/// For example: additional log messages may be enabled by this mode. This
/// option is technically effective in both release builds and debug builds
/// but it controls far less in non-debug builds. This item may be toggled
/// at any time. It doesn't change operational functionality.
decltype(ircd::debugmode)
ircd::debugmode
{
{ "name", "ircd.debugmode" },
{ "default", false },
{ "persist", false },
};
/// When assertions are enabled this further softens runtime behavior to be /// When assertions are enabled this further softens runtime behavior to be
/// non-disruptive/non-terminating for diagnostic purposes. Debugging/developer /// non-disruptive/non-terminating for diagnostic purposes. Debugging/developer
/// use only. This item may be toggled at any time. /// use only. This item may be toggled at any time.
@ -52,6 +79,26 @@ ircd::soft_assert
{ "persist", false }, { "persist", false },
}; };
/// Coarse mode declaration for "maintenance mode" a.k.a. "single user mode"
/// which is intended to be similar to normal operating mode but without
/// services to clients or some background tasks. It is implied and set when
/// write_avoid=true which is itself implied and set by read_only.
decltype(ircd::maintenance)
ircd::maintenance
{
{
{ "name", "ircd.maintenance" },
{ "default", false },
{ "persist", false },
}, []
{
if(!maintenance)
return;
net::listen.set("false");
}
};
/// Coarse mode indicator for degraded operation known as "write-avoid" which /// Coarse mode indicator for degraded operation known as "write-avoid" which
/// is similar to read_only but not hard-enforced. Writes may still occur, /// is similar to read_only but not hard-enforced. Writes may still occur,
/// such as those manually triggered by an admin. All subsystems and background /// such as those manually triggered by an admin. All subsystems and background
@ -59,9 +106,18 @@ ircd::soft_assert
decltype(ircd::write_avoid) decltype(ircd::write_avoid)
ircd::write_avoid ircd::write_avoid
{ {
{ "name", "ircd.write_avoid" }, {
{ "default", false }, { "name", "ircd.write_avoid" },
{ "persist", false }, { "default", false },
{ "persist", false },
}, []
{
if(!write_avoid)
return;
maintenance.set("true");
db::auto_compact.set("false");
}
}; };
/// Coarse mode declaration for read-only behavior. All subsystems and feature /// Coarse mode declaration for read-only behavior. All subsystems and feature
@ -71,30 +127,17 @@ ircd::write_avoid
decltype(ircd::read_only) decltype(ircd::read_only)
ircd::read_only ircd::read_only
{ {
{ "name", "ircd.read_only" }, {
{ "default", false }, { "name", "ircd.read_only" },
{ "persist", false }, { "default", false },
}; { "persist", false },
}, []
{
if(!read_only)
return;
/// Coarse mode indicator for debug/developer behavior when and if possible. write_avoid.set("true");
/// For example: additional log messages may be enabled by this mode. This }
/// option is technically effective in both release builds and debug builds
/// but it controls far less in non-debug builds. This item may be toggled
/// at any time.
decltype(ircd::debugmode)
ircd::debugmode
{
{ "name", "ircd.debugmode" },
{ "default", false },
{ "persist", false },
};
decltype(ircd::restart)
ircd::restart
{
{ "name", "ircd.restart" },
{ "default", false },
{ "persist", false },
}; };
/// Main context pointer placement. /// Main context pointer placement.

View file

@ -136,7 +136,7 @@ ircd::log::init()
console_disable(level::DWARNING); console_disable(level::DWARNING);
} }
if(!ircd::write_avoid || ircd::debugmode) if(!ircd::write_avoid)
{ {
mkdir(); mkdir();
open(); open();

View file

@ -261,7 +261,6 @@ try
const bool need_bootstrap const bool need_bootstrap
{ {
(sequence(*dbs::events) == 0 || opts->bootstrap_vector_path) (sequence(*dbs::events) == 0 || opts->bootstrap_vector_path)
&& !ircd::write_avoid
&& dbs::events && dbs::events
}; };
@ -271,13 +270,14 @@ try
mods::imports.emplace("net_dns_cache"s, "net_dns_cache"s); mods::imports.emplace("net_dns_cache"s, "net_dns_cache"s);
if(!ircd::write_avoid) if(!ircd::write_avoid)
{
if(key && !key->verify_keys.empty()) if(key && !key->verify_keys.empty())
m::keys::cache::set(key->verify_keys); m::keys::cache::set(key->verify_keys);
if(!ircd::maintenance)
signon(*this); signon(*this);
if(!ircd::maintenance)
m::init::backfill::init(); m::init::backfill::init();
}
} }
catch(const std::exception &e) catch(const std::exception &e)
{ {
@ -304,7 +304,7 @@ noexcept try
server::init::wait(); server::init::wait();
m::sync::pool.join(); m::sync::pool.join();
if(!ircd::write_avoid && _vm) if(!ircd::maintenance && _vm)
signoff(*this); signoff(*this);
///TODO: XXX primary ///TODO: XXX primary
@ -826,7 +826,7 @@ ircd::m::offline_status_msg
void void
ircd::m::signon(homeserver &homeserver) ircd::m::signon(homeserver &homeserver)
{ {
if(!ircd::write_avoid && vm::sequence::retired != 0) if(vm::sequence::retired != 0)
presence::set(homeserver.self, "online", online_status_msg); presence::set(homeserver.self, "online", online_status_msg);
} }
@ -834,7 +834,7 @@ void
ircd::m::signoff(homeserver &homeserver) ircd::m::signoff(homeserver &homeserver)
noexcept try noexcept try
{ {
if(!std::uncaught_exceptions() && !ircd::write_avoid && vm::sequence::retired != 0) if(!std::uncaught_exceptions() && vm::sequence::retired != 0)
presence::set(homeserver.self, "offline", offline_status_msg); presence::set(homeserver.self, "offline", offline_status_msg);
} }
catch(const std::exception &e) catch(const std::exception &e)

View file

@ -114,16 +114,6 @@ ircd::m::init::backfill::init()
return; return;
} }
if(ircd::read_only || ircd::write_avoid)
{
log::warning
{
log, "Not performing initial backfill because write-avoid flag is set."
};
return;
}
assert(!worker_context); assert(!worker_context);
worker_context.reset(new context worker_context.reset(new context
{ {