Refactoring

This commit is contained in:
Andi Skrgat 2024-02-28 14:08:13 +01:00
parent f6f29107a6
commit 208838289e
18 changed files with 105 additions and 90 deletions

View File

@ -21,18 +21,18 @@ auto CoordinatorClusterState::MainExists() const -> bool {
return std::ranges::any_of(instance_roles, [](auto const &entry) { return entry.second == ReplicationRole::MAIN; }); return std::ranges::any_of(instance_roles, [](auto const &entry) { return entry.second == ReplicationRole::MAIN; });
} }
auto CoordinatorClusterState::IsMain(std::string const &instance_name) const -> bool { auto CoordinatorClusterState::IsMain(std::string_view instance_name) const -> bool {
auto const it = instance_roles.find(instance_name); auto const it = instance_roles.find(instance_name);
return it != instance_roles.end() && it->second == ReplicationRole::MAIN; return it != instance_roles.end() && it->second == ReplicationRole::MAIN;
} }
auto CoordinatorClusterState::IsReplica(std::string const &instance_name) const -> bool { auto CoordinatorClusterState::IsReplica(std::string_view instance_name) const -> bool {
auto const it = instance_roles.find(instance_name); auto const it = instance_roles.find(instance_name);
return it != instance_roles.end() && it->second == ReplicationRole::REPLICA; return it != instance_roles.end() && it->second == ReplicationRole::REPLICA;
} }
auto CoordinatorClusterState::InsertInstance(std::string const &instance_name, ReplicationRole role) -> void { auto CoordinatorClusterState::InsertInstance(std::string_view instance_name, ReplicationRole role) -> void {
instance_roles[instance_name] = role; instance_roles[instance_name.data()] = role;
} }
auto CoordinatorClusterState::DoAction(TRaftLog log_entry, RaftLogAction log_action) -> void { auto CoordinatorClusterState::DoAction(TRaftLog log_entry, RaftLogAction log_action) -> void {

View File

@ -562,3 +562,4 @@ auto CoordinatorInstance::IsReplica(std::string_view instance_name) const -> boo
} // namespace memgraph::coordination } // namespace memgraph::coordination
#endif #endif

View File

@ -41,7 +41,7 @@ CoordinatorState::CoordinatorState() {
} }
} }
auto CoordinatorState::RegisterReplicationInstance(CoordinatorClientConfig config) auto CoordinatorState::RegisterReplicationInstance(CoordinatorClientConfig const &config)
-> RegisterInstanceCoordinatorStatus { -> RegisterInstanceCoordinatorStatus {
MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_), MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_),
"Coordinator cannot register replica since variant holds wrong alternative"); "Coordinator cannot register replica since variant holds wrong alternative");
@ -56,7 +56,8 @@ auto CoordinatorState::RegisterReplicationInstance(CoordinatorClientConfig confi
data_); data_);
} }
auto CoordinatorState::UnregisterReplicationInstance(std::string instance_name) -> UnregisterInstanceCoordinatorStatus { auto CoordinatorState::UnregisterReplicationInstance(std::string_view instance_name)
-> UnregisterInstanceCoordinatorStatus {
MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_), MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_),
"Coordinator cannot unregister instance since variant holds wrong alternative"); "Coordinator cannot unregister instance since variant holds wrong alternative");
@ -70,7 +71,8 @@ auto CoordinatorState::UnregisterReplicationInstance(std::string instance_name)
data_); data_);
} }
auto CoordinatorState::SetReplicationInstanceToMain(std::string instance_name) -> SetInstanceToMainCoordinatorStatus { auto CoordinatorState::SetReplicationInstanceToMain(std::string_view instance_name)
-> SetInstanceToMainCoordinatorStatus {
MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_), MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_),
"Coordinator cannot register replica since variant holds wrong alternative"); "Coordinator cannot register replica since variant holds wrong alternative");
@ -96,8 +98,8 @@ auto CoordinatorState::GetCoordinatorServer() const -> CoordinatorServer & {
return *std::get<CoordinatorMainReplicaData>(data_).coordinator_server_; return *std::get<CoordinatorMainReplicaData>(data_).coordinator_server_;
} }
auto CoordinatorState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) auto CoordinatorState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port,
-> void { std::string_view raft_address) -> void {
MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_), MG_ASSERT(std::holds_alternative<CoordinatorInstance>(data_),
"Coordinator cannot register replica since variant holds wrong alternative"); "Coordinator cannot register replica since variant holds wrong alternative");
return std::get<CoordinatorInstance>(data_).AddCoordinatorInstance(raft_server_id, raft_port, raft_address); return std::get<CoordinatorInstance>(data_).AddCoordinatorInstance(raft_server_id, raft_port, raft_address);

View File

@ -19,18 +19,18 @@ CoordinatorStateMachine::CoordinatorStateMachine(OnRaftCommitCb raft_commit_cb)
auto CoordinatorStateMachine::MainExists() const -> bool { return cluster_state_.MainExists(); } auto CoordinatorStateMachine::MainExists() const -> bool { return cluster_state_.MainExists(); }
auto CoordinatorStateMachine::IsMain(std::string const &instance_name) const -> bool { auto CoordinatorStateMachine::IsMain(std::string_view instance_name) const -> bool {
return cluster_state_.IsMain(instance_name); return cluster_state_.IsMain(instance_name);
} }
auto CoordinatorStateMachine::IsReplica(std::string const &instance_name) const -> bool { auto CoordinatorStateMachine::IsReplica(std::string_view instance_name) const -> bool {
return cluster_state_.IsReplica(instance_name); return cluster_state_.IsReplica(instance_name);
} }
auto CoordinatorStateMachine::CreateLog(std::string const &log) -> ptr<buffer> { auto CoordinatorStateMachine::CreateLog(std::string_view log) -> ptr<buffer> {
ptr<buffer> log_buf = buffer::alloc(sizeof(uint32_t) + log.size()); ptr<buffer> log_buf = buffer::alloc(sizeof(uint32_t) + log.size());
buffer_serializer bs(log_buf); buffer_serializer bs(log_buf);
bs.put_str(log); bs.put_str(log.data());
return log_buf; return log_buf;
} }

View File

@ -37,18 +37,20 @@ class CoordinatorInstance {
public: public:
CoordinatorInstance(); CoordinatorInstance();
[[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig config) -> RegisterInstanceCoordinatorStatus; [[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig const &config)
[[nodiscard]] auto UnregisterReplicationInstance(std::string instance_name) -> UnregisterInstanceCoordinatorStatus; -> RegisterInstanceCoordinatorStatus;
[[nodiscard]] auto UnregisterReplicationInstance(std::string_view instance_name)
-> UnregisterInstanceCoordinatorStatus;
[[nodiscard]] auto SetReplicationInstanceToMain(std::string instance_name) -> SetInstanceToMainCoordinatorStatus; [[nodiscard]] auto SetReplicationInstanceToMain(std::string_view instance_name) -> SetInstanceToMainCoordinatorStatus;
auto ShowInstances() const -> std::vector<InstanceStatus>; auto ShowInstances() const -> std::vector<InstanceStatus>;
auto TryFailover() -> void; auto TryFailover() -> void;
auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) -> void; auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string_view raft_address) -> void;
static auto ChooseMostUpToDateInstance(const std::vector<InstanceNameDbHistories> &) -> NewMainRes; static auto ChooseMostUpToDateInstance(std::span<InstanceNameDbHistories> histories) -> NewMainRes;
private: private:
HealthCheckClientCallback client_succ_cb_, client_fail_cb_; HealthCheckClientCallback client_succ_cb_, client_fail_cb_;

View File

@ -33,14 +33,16 @@ class CoordinatorState {
CoordinatorState(CoordinatorState &&) noexcept = delete; CoordinatorState(CoordinatorState &&) noexcept = delete;
CoordinatorState &operator=(CoordinatorState &&) noexcept = delete; CoordinatorState &operator=(CoordinatorState &&) noexcept = delete;
[[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig config) -> RegisterInstanceCoordinatorStatus; [[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig const &config)
[[nodiscard]] auto UnregisterReplicationInstance(std::string instance_name) -> UnregisterInstanceCoordinatorStatus; -> RegisterInstanceCoordinatorStatus;
[[nodiscard]] auto UnregisterReplicationInstance(std::string_view instance_name)
-> UnregisterInstanceCoordinatorStatus;
[[nodiscard]] auto SetReplicationInstanceToMain(std::string instance_name) -> SetInstanceToMainCoordinatorStatus; [[nodiscard]] auto SetReplicationInstanceToMain(std::string_view instance_name) -> SetInstanceToMainCoordinatorStatus;
auto ShowInstances() const -> std::vector<InstanceStatus>; auto ShowInstances() const -> std::vector<InstanceStatus>;
auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) -> void; auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string_view raft_address) -> void;
// NOTE: The client code must check that the server exists before calling this method. // NOTE: The client code must check that the server exists before calling this method.
auto GetCoordinatorServer() const -> CoordinatorServer &; auto GetCoordinatorServer() const -> CoordinatorServer &;

View File

@ -59,15 +59,15 @@ class RaftState {
auto InstanceName() const -> std::string; auto InstanceName() const -> std::string;
auto RaftSocketAddress() const -> std::string; auto RaftSocketAddress() const -> std::string;
auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) -> void; auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string_view raft_address) -> void;
auto GetAllCoordinators() const -> std::vector<ptr<srv_config>>; auto GetAllCoordinators() const -> std::vector<ptr<srv_config>>;
auto RequestLeadership() -> bool; auto RequestLeadership() -> bool;
auto IsLeader() const -> bool; auto IsLeader() const -> bool;
auto MainExists() const -> bool; auto MainExists() const -> bool;
auto IsMain(std::string const &instance_name) const -> bool; auto IsMain(std::string_view instance_name) const -> bool;
auto IsReplica(std::string const &instance_name) const -> bool; auto IsReplica(std::string_view instance_name) const -> bool;
/// TODO: (andi) Add log in the name of methods /// TODO: (andi) Add log in the name of methods
auto AppendRegisterReplicationInstance(CoordinatorClientConfig const &config) -> ptr<raft_result>; auto AppendRegisterReplicationInstance(CoordinatorClientConfig const &config) -> ptr<raft_result>;

View File

@ -38,11 +38,11 @@ class CoordinatorClusterState {
public: public:
auto MainExists() const -> bool; auto MainExists() const -> bool;
auto IsMain(std::string const &instance_name) const -> bool; auto IsMain(std::string_view instance_name) const -> bool;
auto IsReplica(std::string const &instance_name) const -> bool; auto IsReplica(std::string_view instance_name) const -> bool;
auto InsertInstance(std::string const &instance_name, replication_coordination_glue::ReplicationRole role) -> void; auto InsertInstance(std::string_view instance_name, replication_coordination_glue::ReplicationRole role) -> void;
auto DoAction(TRaftLog log_entry, RaftLogAction log_action) -> void; auto DoAction(TRaftLog log_entry, RaftLogAction log_action) -> void;
@ -53,7 +53,7 @@ class CoordinatorClusterState {
auto GetInstances() const -> std::vector<std::pair<std::string, std::string>>; auto GetInstances() const -> std::vector<std::pair<std::string, std::string>>;
private: private:
std::map<std::string, replication_coordination_glue::ReplicationRole> instance_roles; std::map<std::string, replication_coordination_glue::ReplicationRole, std::less<>> instance_roles;
}; };
} // namespace memgraph::coordination } // namespace memgraph::coordination

View File

@ -45,10 +45,10 @@ class CoordinatorStateMachine : public state_machine {
~CoordinatorStateMachine() override {} ~CoordinatorStateMachine() override {}
auto MainExists() const -> bool; auto MainExists() const -> bool;
auto IsMain(std::string const &instance_name) const -> bool; auto IsMain(std::string_view instance_name) const -> bool;
auto IsReplica(std::string const &instance_name) const -> bool; auto IsReplica(std::string_view instance_name) const -> bool;
static auto CreateLog(std::string const &log) -> ptr<buffer>; static auto CreateLog(std::string_view log) -> ptr<buffer>;
static auto SerializeRegisterInstance(CoordinatorClientConfig const &config) -> ptr<buffer>; static auto SerializeRegisterInstance(CoordinatorClientConfig const &config) -> ptr<buffer>;
static auto SerializeUnregisterInstance(std::string_view instance_name) -> ptr<buffer>; static auto SerializeUnregisterInstance(std::string_view instance_name) -> ptr<buffer>;
static auto SerializeSetInstanceAsMain(std::string_view instance_name) -> ptr<buffer>; static auto SerializeSetInstanceAsMain(std::string_view instance_name) -> ptr<buffer>;

View File

@ -113,8 +113,9 @@ auto RaftState::InstanceName() const -> std::string { return "coordinator_" + st
auto RaftState::RaftSocketAddress() const -> std::string { return raft_address_ + ":" + std::to_string(raft_port_); } auto RaftState::RaftSocketAddress() const -> std::string { return raft_address_ + ":" + std::to_string(raft_port_); }
auto RaftState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) -> void { auto RaftState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string_view raft_address)
auto const endpoint = raft_address + ":" + std::to_string(raft_port); -> void {
auto const endpoint = fmt::format("{}:{}", raft_address, raft_port);
srv_config const srv_config_to_add(static_cast<int>(raft_server_id), endpoint); srv_config const srv_config_to_add(static_cast<int>(raft_server_id), endpoint);
if (!raft_server_->add_srv(srv_config_to_add)->get_accepted()) { if (!raft_server_->add_srv(srv_config_to_add)->get_accepted()) {
throw RaftAddServerException("Failed to add server {} to the cluster", endpoint); throw RaftAddServerException("Failed to add server {} to the cluster", endpoint);
@ -154,9 +155,9 @@ auto RaftState::AppendSetInstanceAsReplica(std::string_view instance_name) -> pt
auto RaftState::MainExists() const -> bool { return state_machine_->MainExists(); } auto RaftState::MainExists() const -> bool { return state_machine_->MainExists(); }
auto RaftState::IsMain(std::string const &instance_name) const -> bool { return state_machine_->IsMain(instance_name); } auto RaftState::IsMain(std::string_view instance_name) const -> bool { return state_machine_->IsMain(instance_name); }
auto RaftState::IsReplica(std::string const &instance_name) const -> bool { auto RaftState::IsReplica(std::string_view instance_name) const -> bool {
return state_machine_->IsReplica(instance_name); return state_machine_->IsReplica(instance_name);
} }

View File

@ -20,28 +20,28 @@ namespace memgraph::dbms {
CoordinatorHandler::CoordinatorHandler(coordination::CoordinatorState &coordinator_state) CoordinatorHandler::CoordinatorHandler(coordination::CoordinatorState &coordinator_state)
: coordinator_state_(coordinator_state) {} : coordinator_state_(coordinator_state) {}
auto CoordinatorHandler::RegisterReplicationInstance(memgraph::coordination::CoordinatorClientConfig config) auto CoordinatorHandler::RegisterReplicationInstance(coordination::CoordinatorClientConfig const &config)
-> coordination::RegisterInstanceCoordinatorStatus { -> coordination::RegisterInstanceCoordinatorStatus {
return coordinator_state_.RegisterReplicationInstance(config); return coordinator_state_.RegisterReplicationInstance(config);
} }
auto CoordinatorHandler::UnregisterReplicationInstance(std::string instance_name) auto CoordinatorHandler::UnregisterReplicationInstance(std::string_view instance_name)
-> coordination::UnregisterInstanceCoordinatorStatus { -> coordination::UnregisterInstanceCoordinatorStatus {
return coordinator_state_.UnregisterReplicationInstance(std::move(instance_name)); return coordinator_state_.UnregisterReplicationInstance(instance_name);
} }
auto CoordinatorHandler::SetReplicationInstanceToMain(std::string instance_name) auto CoordinatorHandler::SetReplicationInstanceToMain(std::string_view instance_name)
-> coordination::SetInstanceToMainCoordinatorStatus { -> coordination::SetInstanceToMainCoordinatorStatus {
return coordinator_state_.SetReplicationInstanceToMain(std::move(instance_name)); return coordinator_state_.SetReplicationInstanceToMain(instance_name);
} }
auto CoordinatorHandler::ShowInstances() const -> std::vector<coordination::InstanceStatus> { auto CoordinatorHandler::ShowInstances() const -> std::vector<coordination::InstanceStatus> {
return coordinator_state_.ShowInstances(); return coordinator_state_.ShowInstances();
} }
auto CoordinatorHandler::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) auto CoordinatorHandler::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port,
-> void { std::string_view raft_address) -> void {
coordinator_state_.AddCoordinatorInstance(raft_server_id, raft_port, std::move(raft_address)); coordinator_state_.AddCoordinatorInstance(raft_server_id, raft_port, raft_address);
} }
} // namespace memgraph::dbms } // namespace memgraph::dbms

View File

@ -30,16 +30,17 @@ class CoordinatorHandler {
// TODO: (andi) When moving coordinator state on same instances, rename from RegisterReplicationInstance to // TODO: (andi) When moving coordinator state on same instances, rename from RegisterReplicationInstance to
// RegisterInstance // RegisterInstance
auto RegisterReplicationInstance(coordination::CoordinatorClientConfig config) auto RegisterReplicationInstance(coordination::CoordinatorClientConfig const &config)
-> coordination::RegisterInstanceCoordinatorStatus; -> coordination::RegisterInstanceCoordinatorStatus;
auto UnregisterReplicationInstance(std::string instance_name) -> coordination::UnregisterInstanceCoordinatorStatus; auto UnregisterReplicationInstance(std::string_view instance_name)
-> coordination::UnregisterInstanceCoordinatorStatus;
auto SetReplicationInstanceToMain(std::string instance_name) -> coordination::SetInstanceToMainCoordinatorStatus; auto SetReplicationInstanceToMain(std::string_view instance_name) -> coordination::SetInstanceToMainCoordinatorStatus;
auto ShowInstances() const -> std::vector<coordination::InstanceStatus>; auto ShowInstances() const -> std::vector<coordination::InstanceStatus>;
auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) -> void; auto AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string_view raft_address) -> void;
private: private:
coordination::CoordinatorState &coordinator_state_; coordination::CoordinatorState &coordinator_state_;

View File

@ -24,22 +24,22 @@
namespace memgraph::io::network { namespace memgraph::io::network {
Endpoint::IpFamily Endpoint::GetIpFamily(const std::string &address) { Endpoint::IpFamily Endpoint::GetIpFamily(std::string_view address) {
in_addr addr4; in_addr addr4;
in6_addr addr6; in6_addr addr6;
int ipv4_result = inet_pton(AF_INET, address.c_str(), &addr4); int ipv4_result = inet_pton(AF_INET, address.data(), &addr4);
int ipv6_result = inet_pton(AF_INET6, address.c_str(), &addr6); int ipv6_result = inet_pton(AF_INET6, address.data(), &addr6);
if (ipv4_result == 1) { if (ipv4_result == 1) {
return IpFamily::IP4; return IpFamily::IP4;
} else if (ipv6_result == 1) {
return IpFamily::IP6;
} else {
return IpFamily::NONE;
} }
if (ipv6_result == 1) {
return IpFamily::IP6;
}
return IpFamily::NONE;
} }
std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseSocketOrIpAddress( std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseSocketOrIpAddress(
const std::string &address, const std::optional<uint16_t> default_port) { std::string_view address, const std::optional<uint16_t> default_port) {
/// expected address format: /// expected address format:
/// - "ip_address:port_number" /// - "ip_address:port_number"
/// - "ip_address" /// - "ip_address"
@ -56,7 +56,7 @@ std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseSocketOrIpAddress
if (GetIpFamily(address) == IpFamily::NONE) { if (GetIpFamily(address) == IpFamily::NONE) {
return std::nullopt; return std::nullopt;
} }
return std::pair{address, *default_port}; return std::pair{std::string(address), *default_port}; // TODO: (andi) Optimize throughout the code
} }
} else if (parts.size() == 2) { } else if (parts.size() == 2) {
ip_address = std::move(parts[0]); ip_address = std::move(parts[0]);
@ -88,7 +88,7 @@ std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseSocketOrIpAddress
} }
std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseHostname( std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseHostname(
const std::string &address, const std::optional<uint16_t> default_port = {}) { std::string_view address, const std::optional<uint16_t> default_port = {}) {
const std::string delimiter = ":"; const std::string delimiter = ":";
std::string ip_address; std::string ip_address;
std::vector<std::string> parts = utils::Split(address, delimiter); std::vector<std::string> parts = utils::Split(address, delimiter);
@ -97,7 +97,7 @@ std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseHostname(
if (!IsResolvableAddress(address, *default_port)) { if (!IsResolvableAddress(address, *default_port)) {
return std::nullopt; return std::nullopt;
} }
return std::pair{address, *default_port}; return std::pair{std::string(address), *default_port}; // TODO: (andi) Optimize throughout the code
} }
} else if (parts.size() == 2) { } else if (parts.size() == 2) {
int64_t int_port{0}; int64_t int_port{0};
@ -153,20 +153,20 @@ std::ostream &operator<<(std::ostream &os, const Endpoint &endpoint) {
return os << endpoint.address << ":" << endpoint.port; return os << endpoint.address << ":" << endpoint.port;
} }
bool Endpoint::IsResolvableAddress(const std::string &address, uint16_t port) { bool Endpoint::IsResolvableAddress(std::string_view address, uint16_t port) {
addrinfo hints{ addrinfo hints{
.ai_flags = AI_PASSIVE, .ai_flags = AI_PASSIVE,
.ai_family = AF_UNSPEC, // IPv4 and IPv6 .ai_family = AF_UNSPEC, // IPv4 and IPv6
.ai_socktype = SOCK_STREAM // TCP socket .ai_socktype = SOCK_STREAM // TCP socket
}; };
addrinfo *info = nullptr; addrinfo *info = nullptr;
auto status = getaddrinfo(address.c_str(), std::to_string(port).c_str(), &hints, &info); auto status = getaddrinfo(address.data(), std::to_string(port).c_str(), &hints, &info);
if (info) freeaddrinfo(info); if (info) freeaddrinfo(info);
return status == 0; return status == 0;
} }
std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseSocketOrAddress( std::optional<std::pair<std::string, uint16_t>> Endpoint::ParseSocketOrAddress(
const std::string &address, const std::optional<uint16_t> default_port) { std::string_view address, const std::optional<uint16_t> default_port) {
const std::string delimiter = ":"; const std::string delimiter = ":";
std::vector<std::string> parts = utils::Split(address, delimiter); std::vector<std::string> parts = utils::Split(address, delimiter);
if (parts.size() == 1) { if (parts.size() == 1) {

View File

@ -48,8 +48,8 @@ struct Endpoint {
uint16_t port{0}; uint16_t port{0};
IpFamily family{IpFamily::NONE}; IpFamily family{IpFamily::NONE};
static std::optional<std::pair<std::string, uint16_t>> ParseSocketOrAddress(const std::string &address, static std::optional<std::pair<std::string, uint16_t>> ParseSocketOrAddress(
std::optional<uint16_t> default_port); std::string_view address, std::optional<uint16_t> default_port = {});
/** /**
* Tries to parse the given string as either a socket address or ip address. * Tries to parse the given string as either a socket address or ip address.
@ -62,7 +62,7 @@ struct Endpoint {
* it won't be used, as we expect that it is given in the address string. * it won't be used, as we expect that it is given in the address string.
*/ */
static std::optional<std::pair<std::string, uint16_t>> ParseSocketOrIpAddress( static std::optional<std::pair<std::string, uint16_t>> ParseSocketOrIpAddress(
const std::string &address, std::optional<uint16_t> default_port = {}); std::string_view address, std::optional<uint16_t> default_port = {});
/** /**
* Tries to parse given string as either socket address or hostname. * Tries to parse given string as either socket address or hostname.
@ -71,12 +71,12 @@ struct Endpoint {
* - "hostname" * - "hostname"
* After we parse hostname and port we try to resolve the hostname into an ip_address. * After we parse hostname and port we try to resolve the hostname into an ip_address.
*/ */
static std::optional<std::pair<std::string, uint16_t>> ParseHostname(const std::string &address, static std::optional<std::pair<std::string, uint16_t>> ParseHostname(std::string_view address,
std::optional<uint16_t> default_port); std::optional<uint16_t> default_port);
static IpFamily GetIpFamily(const std::string &address); static IpFamily GetIpFamily(std::string_view address);
static bool IsResolvableAddress(const std::string &address, uint16_t port); static bool IsResolvableAddress(std::string_view address, uint16_t port);
/** /**
* Tries to resolve hostname to its corresponding IP address. * Tries to resolve hostname to its corresponding IP address.

View File

@ -410,7 +410,7 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler {
: coordinator_handler_(coordinator_state) {} : coordinator_handler_(coordinator_state) {}
void UnregisterInstance(std::string const &instance_name) override { void UnregisterInstance(std::string_view instance_name) override {
auto status = coordinator_handler_.UnregisterReplicationInstance(instance_name); auto status = coordinator_handler_.UnregisterReplicationInstance(instance_name);
switch (status) { switch (status) {
using enum memgraph::coordination::UnregisterInstanceCoordinatorStatus; using enum memgraph::coordination::UnregisterInstanceCoordinatorStatus;
@ -437,20 +437,18 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler {
} }
} }
void RegisterReplicationInstance(std::string const &coordinator_socket_address, void RegisterReplicationInstance(std::string_view coordinator_socket_address,
std::string const &replication_socket_address, std::string_view replication_socket_address,
std::chrono::seconds const &instance_check_frequency, std::chrono::seconds const &instance_check_frequency,
std::chrono::seconds const &instance_down_timeout, std::chrono::seconds const &instance_down_timeout,
std::chrono::seconds const &instance_get_uuid_frequency, std::chrono::seconds const &instance_get_uuid_frequency,
std::string const &instance_name, CoordinatorQuery::SyncMode sync_mode) override { std::string_view instance_name, CoordinatorQuery::SyncMode sync_mode) override {
const auto maybe_replication_ip_port = const auto maybe_replication_ip_port = io::network::Endpoint::ParseSocketOrAddress(replication_socket_address);
io::network::Endpoint::ParseSocketOrAddress(replication_socket_address, std::nullopt);
if (!maybe_replication_ip_port) { if (!maybe_replication_ip_port) {
throw QueryRuntimeException("Invalid replication socket address!"); throw QueryRuntimeException("Invalid replication socket address!");
} }
const auto maybe_coordinator_ip_port = const auto maybe_coordinator_ip_port = io::network::Endpoint::ParseSocketOrAddress(coordinator_socket_address);
io::network::Endpoint::ParseSocketOrAddress(coordinator_socket_address, std::nullopt);
if (!maybe_replication_ip_port) { if (!maybe_replication_ip_port) {
throw QueryRuntimeException("Invalid replication socket address!"); throw QueryRuntimeException("Invalid replication socket address!");
} }
@ -458,13 +456,13 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler {
const auto [replication_ip, replication_port] = *maybe_replication_ip_port; const auto [replication_ip, replication_port] = *maybe_replication_ip_port;
const auto [coordinator_server_ip, coordinator_server_port] = *maybe_coordinator_ip_port; const auto [coordinator_server_ip, coordinator_server_port] = *maybe_coordinator_ip_port;
const auto repl_config = coordination::CoordinatorClientConfig::ReplicationClientInfo{ const auto repl_config = coordination::CoordinatorClientConfig::ReplicationClientInfo{
.instance_name = instance_name, .instance_name = std::string(instance_name),
.replication_mode = convertFromCoordinatorToReplicationMode(sync_mode), .replication_mode = convertFromCoordinatorToReplicationMode(sync_mode),
.replication_ip_address = replication_ip, .replication_ip_address = replication_ip,
.replication_port = replication_port}; .replication_port = replication_port};
auto coordinator_client_config = auto coordinator_client_config =
coordination::CoordinatorClientConfig{.instance_name = instance_name, coordination::CoordinatorClientConfig{.instance_name = std::string(instance_name),
.ip_address = coordinator_server_ip, .ip_address = coordinator_server_ip,
.port = coordinator_server_port, .port = coordinator_server_port,
.instance_health_check_frequency_sec = instance_check_frequency, .instance_health_check_frequency_sec = instance_check_frequency,
@ -473,7 +471,7 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler {
.replication_client_info = repl_config, .replication_client_info = repl_config,
.ssl = std::nullopt}; .ssl = std::nullopt};
auto status = coordinator_handler_.RegisterReplicationInstance(std::move(coordinator_client_config)); auto status = coordinator_handler_.RegisterReplicationInstance(coordinator_client_config);
switch (status) { switch (status) {
using enum memgraph::coordination::RegisterInstanceCoordinatorStatus; using enum memgraph::coordination::RegisterInstanceCoordinatorStatus;
case NAME_EXISTS: case NAME_EXISTS:
@ -499,8 +497,8 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler {
} }
} }
auto AddCoordinatorInstance(uint32_t raft_server_id, std::string const &raft_socket_address) -> void override { auto AddCoordinatorInstance(uint32_t raft_server_id, std::string_view raft_socket_address) -> void override {
auto const maybe_ip_and_port = io::network::Endpoint::ParseSocketOrIpAddress(raft_socket_address); auto const maybe_ip_and_port = io::network::Endpoint::ParseSocketOrAddress(raft_socket_address);
if (maybe_ip_and_port) { if (maybe_ip_and_port) {
auto const [ip, port] = *maybe_ip_and_port; auto const [ip, port] = *maybe_ip_and_port;
spdlog::info("Adding instance {} with raft socket address {}:{}.", raft_server_id, port, ip); spdlog::info("Adding instance {} with raft socket address {}:{}.", raft_server_id, port, ip);
@ -510,7 +508,7 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler {
} }
} }
void SetReplicationInstanceToMain(const std::string &instance_name) override { void SetReplicationInstanceToMain(std::string_view instance_name) override {
auto status = coordinator_handler_.SetReplicationInstanceToMain(instance_name); auto status = coordinator_handler_.SetReplicationInstanceToMain(instance_name);
switch (status) { switch (status) {
using enum memgraph::coordination::SetInstanceToMainCoordinatorStatus; using enum memgraph::coordination::SetInstanceToMainCoordinatorStatus;

View File

@ -95,25 +95,24 @@ class CoordinatorQueryHandler {
}; };
/// @throw QueryRuntimeException if an error ocurred. /// @throw QueryRuntimeException if an error ocurred.
virtual void RegisterReplicationInstance(std::string const &coordinator_socket_address, virtual void RegisterReplicationInstance(std::string_view coordinator_socket_address,
std::string const &replication_socket_address, std::string_view replication_socket_address,
std::chrono::seconds const &instance_health_check_frequency, std::chrono::seconds const &instance_health_check_frequency,
std::chrono::seconds const &instance_down_timeout, std::chrono::seconds const &instance_down_timeout,
std::chrono::seconds const &instance_get_uuid_frequency, std::chrono::seconds const &instance_get_uuid_frequency,
std::string const &instance_name, CoordinatorQuery::SyncMode sync_mode) = 0; std::string_view instance_name, CoordinatorQuery::SyncMode sync_mode) = 0;
/// @throw QueryRuntimeException if an error ocurred. /// @throw QueryRuntimeException if an error ocurred.
virtual void UnregisterInstance(std::string const &instance_name) = 0; virtual void UnregisterInstance(std::string_view instance_name) = 0;
/// @throw QueryRuntimeException if an error ocurred. /// @throw QueryRuntimeException if an error ocurred.
virtual void SetReplicationInstanceToMain(const std::string &instance_name) = 0; virtual void SetReplicationInstanceToMain(std::string_view instance_name) = 0;
/// @throw QueryRuntimeException if an error ocurred. /// @throw QueryRuntimeException if an error ocurred.
virtual std::vector<coordination::InstanceStatus> ShowInstances() const = 0; virtual std::vector<coordination::InstanceStatus> ShowInstances() const = 0;
/// @throw QueryRuntimeException if an error ocurred. /// @throw QueryRuntimeException if an error ocurred.
virtual auto AddCoordinatorInstance(uint32_t raft_server_id, std::string const &coordinator_socket_address) virtual auto AddCoordinatorInstance(uint32_t raft_server_id, std::string_view coordinator_socket_address) -> void = 0;
-> void = 0;
}; };
#endif #endif

View File

@ -24,8 +24,10 @@ find_package(Threads REQUIRED)
add_library(mg-utils STATIC ${utils_src_files}) add_library(mg-utils STATIC ${utils_src_files})
add_library(mg::utils ALIAS mg-utils) add_library(mg::utils ALIAS mg-utils)
find_library(LIBUUID_LIBRARY libuuid.a)
target_link_libraries(mg-utils PUBLIC Boost::headers fmt::fmt spdlog::spdlog json) target_link_libraries(mg-utils PUBLIC Boost::headers fmt::fmt spdlog::spdlog json)
target_link_libraries(mg-utils PRIVATE librdtsc stdc++fs Threads::Threads gflags uuid rt) target_link_libraries(mg-utils PRIVATE librdtsc stdc++fs Threads::Threads gflags ${LIBUUID_LIBRARY} rt)
set(settings_src_files set(settings_src_files
settings.cpp) settings.cpp)

View File

@ -229,6 +229,13 @@ inline std::vector<std::string> Split(const std::string_view src, const std::str
return res; return res;
} }
inline std::vector<std::string_view> SplitView(const std::string_view src, const std::string_view delimiter,
int splits = -1) {
std::vector<std::string_view> res;
Split(&res, src, delimiter, splits);
return res;
}
/** /**
* Split a string by whitespace into a vector. * Split a string by whitespace into a vector.
* Runs of consecutive whitespace are regarded as a single delimiter. * Runs of consecutive whitespace are regarded as a single delimiter.