0
0
Fork 0
mirror of https://github.com/matrix-construct/construct synced 2024-12-01 19:22:53 +01:00

ircd:Ⓜ️:dbs: Involve the servername in the database path.

Fixes #75.
This commit is contained in:
Jason Volk 2019-06-06 17:34:33 -07:00
parent 70c6c9ea86
commit f1b0ba8648
3 changed files with 40 additions and 3 deletions

View file

@ -183,6 +183,10 @@ enum ircd::m::dbs::appendix::index
struct ircd::m::dbs::init struct ircd::m::dbs::init
{ {
init(std::string dbopts = {}); std::string our_dbpath;
string_view their_dbpath;
public:
init(const string_view &servername, std::string dbopts = {});
~init() noexcept; ~init() noexcept;
}; };

View file

@ -43,6 +43,10 @@ try
{ {
origin, servername origin, servername
} }
,_dbs
{
self::servername, std::string{}
}
,_modules ,_modules
{ {
std::make_unique<modules>() std::make_unique<modules>()

View file

@ -138,10 +138,36 @@ ircd::m::dbs::events_mem_write_buffer_size
/// Initializes the m::dbs subsystem; sets up the events database. Held/called /// Initializes the m::dbs subsystem; sets up the events database. Held/called
/// by m::init. Most of the extern variables in m::dbs are not ready until /// by m::init. Most of the extern variables in m::dbs are not ready until
/// this call completes. /// this call completes.
ircd::m::dbs::init::init(std::string dbopts) ///
/// We also update the fs::basepath for the database directory to include our
/// servername in the path component. The fs::base::DB setting was generated
/// during the build and install process, and is unaware of our servername
/// at runtime. This change deconflicts multiple instances of IRCd running in
/// the same installation prefix using different servernames (i.e clustering
/// on the same machine).
///
ircd::m::dbs::init::init(const string_view &servername,
std::string dbopts)
:our_dbpath
{ {
ircd::string(fs::PATH_MAX_LEN | SHRINK_TO_FIT, [&servername]
(const mutable_buffer &buf)
{
return fs::path(buf, fs::base::DB, servername);
})
}
,their_dbpath
{
// NOTE that this is a global change that leaks outside of ircd::m. The
// database directory for the entire process is being changed here.
fs::basepath::set(fs::base::DB, our_dbpath)
}
{
// Recall the db directory init manually with the now-updated basepath
db::init::directory();
// Open the events database // Open the events database
static const auto dbname{"events"}; static const string_view &dbname{"events"};
events = std::make_shared<database>(dbname, std::move(dbopts), desc::events); events = std::make_shared<database>(dbname, std::move(dbopts), desc::events);
// Cache the columns for the event tuple in order for constant time lookup // Cache the columns for the event tuple in order for constant time lookup
@ -178,6 +204,9 @@ noexcept
{ {
// Unref DB (should close) // Unref DB (should close)
events = {}; events = {};
// restore the fs::base::DB path the way we found it.
fs::basepath::set(fs::base::DB, their_dbpath);
} }
// //