Single (instance level) connection to a replica (messages from all databases get multiplexed through it) ReplicationClient split in two: ReplicationClient and ReplicationStorageClient New ReplicationClient, moved under replication, handles the raw connection, owned by MainRoleData ReplicationStorageClient handles the storage <-> replica state machine and holds to a stream Removed epoch and storage from *Clients rpc::Stream proactively aborts on error and sets itself to a defunct state Removed HandleRpcFailure, instead we simply log the error and let the FrequentCheck handle re-connection replica_state is now a synced variable ReplicaStorageClient state machine bugfixes Single FrequentCheck that goes through DBMS Moved ReplicationState under DbmsHandler Moved some replication startup logic under the DbmsHandler's constructor Removed InMemoryReplicationClient CreateReplicationClient has been removed from Storage Simplified GetRecoverySteps and made safer --------- Co-authored-by: Gareth Lloyd <gareth.lloyd@memgraph.io>
76 lines
3.0 KiB
C++
76 lines
3.0 KiB
C++
// Copyright 2023 Memgraph Ltd.
|
|
//
|
|
// Use of this software is governed by the Business Source License
|
|
// included in the file licenses/BSL.txt; by using this file, you agree to be bound by the terms of the Business Source
|
|
// License, and you may not use this file except in compliance with the Business Source License.
|
|
//
|
|
// As of the Change Date specified in that file, in accordance with
|
|
// the Business Source License, use of this software will be governed
|
|
// by the Apache License, Version 2.0, included in the file
|
|
// licenses/APL.txt.
|
|
|
|
#include "dbms/dbms_handler.hpp"
|
|
|
|
namespace memgraph::dbms {
|
|
#ifdef MG_ENTERPRISE
|
|
DbmsHandler::DbmsHandler(
|
|
storage::Config config,
|
|
memgraph::utils::Synchronized<memgraph::auth::Auth, memgraph::utils::WritePrioritizedRWLock> *auth,
|
|
bool recovery_on_startup, bool delete_on_drop)
|
|
: default_config_{std::move(config)},
|
|
delete_on_drop_(delete_on_drop),
|
|
repl_state_{ReplicationStateRootPath(default_config_)} {
|
|
// TODO: Decouple storage config from dbms config
|
|
// TODO: Save individual db configs inside the kvstore and restore from there
|
|
storage::UpdatePaths(default_config_, default_config_.durability.storage_directory / "databases");
|
|
const auto &db_dir = default_config_.durability.storage_directory;
|
|
const auto durability_dir = db_dir / ".durability";
|
|
utils::EnsureDirOrDie(db_dir);
|
|
utils::EnsureDirOrDie(durability_dir);
|
|
durability_ = std::make_unique<kvstore::KVStore>(durability_dir);
|
|
|
|
// Generate the default database
|
|
MG_ASSERT(!NewDefault_().HasError(), "Failed while creating the default DB.");
|
|
|
|
// Recover previous databases
|
|
if (recovery_on_startup) {
|
|
for (const auto &[name, _] : *durability_) {
|
|
if (name == kDefaultDB) continue; // Already set
|
|
spdlog::info("Restoring database {}.", name);
|
|
MG_ASSERT(!New_(name).HasError(), "Failed while creating database {}.", name);
|
|
spdlog::info("Database {} restored.", name);
|
|
}
|
|
} else { // Clear databases from the durability list and auth
|
|
auto locked_auth = auth->Lock();
|
|
for (const auto &[name, _] : *durability_) {
|
|
if (name == kDefaultDB) continue;
|
|
locked_auth->DeleteDatabase(name);
|
|
durability_->Delete(name);
|
|
}
|
|
}
|
|
|
|
// Startup replication state (if recovered at startup)
|
|
auto replica = [this](replication::RoleReplicaData const &data) {
|
|
// Register handlers
|
|
InMemoryReplicationHandlers::Register(this, *data.server);
|
|
if (!data.server->Start()) {
|
|
spdlog::error("Unable to start the replication server.");
|
|
return false;
|
|
}
|
|
return true;
|
|
};
|
|
// Replication frequent check start
|
|
auto main = [this](replication::RoleMainData &data) {
|
|
for (auto &client : data.registered_replicas_) {
|
|
StartReplicaClient(*this, client);
|
|
}
|
|
return true;
|
|
};
|
|
// Startup proccess for main/replica
|
|
MG_ASSERT(std::visit(memgraph::utils::Overloaded{replica, main}, repl_state_.ReplicationData()),
|
|
"Replica recovery failure!");
|
|
}
|
|
#endif
|
|
|
|
} // namespace memgraph::dbms
|