From 208838289eabb6fe1ebb32ab69fe89c879fcbce9 Mon Sep 17 00:00:00 2001 From: Andi Skrgat Date: Wed, 28 Feb 2024 14:08:13 +0100 Subject: [PATCH] Refactoring --- .../coordinator_cluster_state.cpp | 8 +++--- src/coordination/coordinator_instance.cpp | 1 + src/coordination/coordinator_state.cpp | 12 ++++---- .../coordinator_state_machine.cpp | 8 +++--- .../coordination/coordinator_instance.hpp | 12 ++++---- .../coordination/coordinator_state.hpp | 10 ++++--- .../include/coordination/raft_state.hpp | 6 ++-- .../nuraft/coordinator_cluster_state.hpp | 8 +++--- .../nuraft/coordinator_state_machine.hpp | 6 ++-- src/coordination/raft_state.cpp | 9 +++--- src/dbms/coordinator_handler.cpp | 16 +++++------ src/dbms/coordinator_handler.hpp | 9 +++--- src/io/network/endpoint.cpp | 28 +++++++++---------- src/io/network/endpoint.hpp | 12 ++++---- src/query/interpreter.cpp | 26 ++++++++--------- src/query/interpreter.hpp | 13 ++++----- src/utils/CMakeLists.txt | 4 ++- src/utils/string.hpp | 7 +++++ 18 files changed, 105 insertions(+), 90 deletions(-) diff --git a/src/coordination/coordinator_cluster_state.cpp b/src/coordination/coordinator_cluster_state.cpp index 443e1203e..197164886 100644 --- a/src/coordination/coordinator_cluster_state.cpp +++ b/src/coordination/coordinator_cluster_state.cpp @@ -21,18 +21,18 @@ auto CoordinatorClusterState::MainExists() const -> bool { 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); 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); return it != instance_roles.end() && it->second == ReplicationRole::REPLICA; } -auto CoordinatorClusterState::InsertInstance(std::string const &instance_name, ReplicationRole role) -> void { - instance_roles[instance_name] = role; +auto CoordinatorClusterState::InsertInstance(std::string_view instance_name, ReplicationRole role) -> void { + instance_roles[instance_name.data()] = role; } auto CoordinatorClusterState::DoAction(TRaftLog log_entry, RaftLogAction log_action) -> void { diff --git a/src/coordination/coordinator_instance.cpp b/src/coordination/coordinator_instance.cpp index a8a5d0c59..ffd330816 100644 --- a/src/coordination/coordinator_instance.cpp +++ b/src/coordination/coordinator_instance.cpp @@ -562,3 +562,4 @@ auto CoordinatorInstance::IsReplica(std::string_view instance_name) const -> boo } // namespace memgraph::coordination #endif + diff --git a/src/coordination/coordinator_state.cpp b/src/coordination/coordinator_state.cpp index 28d6c604e..f429cd5a7 100644 --- a/src/coordination/coordinator_state.cpp +++ b/src/coordination/coordinator_state.cpp @@ -41,7 +41,7 @@ CoordinatorState::CoordinatorState() { } } -auto CoordinatorState::RegisterReplicationInstance(CoordinatorClientConfig config) +auto CoordinatorState::RegisterReplicationInstance(CoordinatorClientConfig const &config) -> RegisterInstanceCoordinatorStatus { MG_ASSERT(std::holds_alternative(data_), "Coordinator cannot register replica since variant holds wrong alternative"); @@ -56,7 +56,8 @@ auto CoordinatorState::RegisterReplicationInstance(CoordinatorClientConfig confi data_); } -auto CoordinatorState::UnregisterReplicationInstance(std::string instance_name) -> UnregisterInstanceCoordinatorStatus { +auto CoordinatorState::UnregisterReplicationInstance(std::string_view instance_name) + -> UnregisterInstanceCoordinatorStatus { MG_ASSERT(std::holds_alternative(data_), "Coordinator cannot unregister instance since variant holds wrong alternative"); @@ -70,7 +71,8 @@ auto CoordinatorState::UnregisterReplicationInstance(std::string instance_name) data_); } -auto CoordinatorState::SetReplicationInstanceToMain(std::string instance_name) -> SetInstanceToMainCoordinatorStatus { +auto CoordinatorState::SetReplicationInstanceToMain(std::string_view instance_name) + -> SetInstanceToMainCoordinatorStatus { MG_ASSERT(std::holds_alternative(data_), "Coordinator cannot register replica since variant holds wrong alternative"); @@ -96,8 +98,8 @@ auto CoordinatorState::GetCoordinatorServer() const -> CoordinatorServer & { return *std::get(data_).coordinator_server_; } -auto CoordinatorState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) - -> void { +auto CoordinatorState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, + std::string_view raft_address) -> void { MG_ASSERT(std::holds_alternative(data_), "Coordinator cannot register replica since variant holds wrong alternative"); return std::get(data_).AddCoordinatorInstance(raft_server_id, raft_port, raft_address); diff --git a/src/coordination/coordinator_state_machine.cpp b/src/coordination/coordinator_state_machine.cpp index ec0dba09b..491876351 100644 --- a/src/coordination/coordinator_state_machine.cpp +++ b/src/coordination/coordinator_state_machine.cpp @@ -19,18 +19,18 @@ CoordinatorStateMachine::CoordinatorStateMachine(OnRaftCommitCb raft_commit_cb) 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); } -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); } -auto CoordinatorStateMachine::CreateLog(std::string const &log) -> ptr { +auto CoordinatorStateMachine::CreateLog(std::string_view log) -> ptr { ptr log_buf = buffer::alloc(sizeof(uint32_t) + log.size()); buffer_serializer bs(log_buf); - bs.put_str(log); + bs.put_str(log.data()); return log_buf; } diff --git a/src/coordination/include/coordination/coordinator_instance.hpp b/src/coordination/include/coordination/coordinator_instance.hpp index e7949e066..dfeed8676 100644 --- a/src/coordination/include/coordination/coordinator_instance.hpp +++ b/src/coordination/include/coordination/coordinator_instance.hpp @@ -37,18 +37,20 @@ class CoordinatorInstance { public: CoordinatorInstance(); - [[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig config) -> RegisterInstanceCoordinatorStatus; - [[nodiscard]] auto UnregisterReplicationInstance(std::string instance_name) -> UnregisterInstanceCoordinatorStatus; + [[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig const &config) + -> 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; 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 &) -> NewMainRes; + static auto ChooseMostUpToDateInstance(std::span histories) -> NewMainRes; private: HealthCheckClientCallback client_succ_cb_, client_fail_cb_; diff --git a/src/coordination/include/coordination/coordinator_state.hpp b/src/coordination/include/coordination/coordinator_state.hpp index 256af66f9..400c36940 100644 --- a/src/coordination/include/coordination/coordinator_state.hpp +++ b/src/coordination/include/coordination/coordinator_state.hpp @@ -33,14 +33,16 @@ class CoordinatorState { CoordinatorState(CoordinatorState &&) noexcept = delete; CoordinatorState &operator=(CoordinatorState &&) noexcept = delete; - [[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig config) -> RegisterInstanceCoordinatorStatus; - [[nodiscard]] auto UnregisterReplicationInstance(std::string instance_name) -> UnregisterInstanceCoordinatorStatus; + [[nodiscard]] auto RegisterReplicationInstance(CoordinatorClientConfig const &config) + -> 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; - 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. auto GetCoordinatorServer() const -> CoordinatorServer &; diff --git a/src/coordination/include/coordination/raft_state.hpp b/src/coordination/include/coordination/raft_state.hpp index 7a6e4b94f..c8ba686c1 100644 --- a/src/coordination/include/coordination/raft_state.hpp +++ b/src/coordination/include/coordination/raft_state.hpp @@ -59,15 +59,15 @@ class RaftState { auto InstanceName() 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>; auto RequestLeadership() -> bool; auto IsLeader() const -> bool; auto MainExists() const -> bool; - auto IsMain(std::string const &instance_name) const -> bool; - auto IsReplica(std::string const &instance_name) const -> bool; + auto IsMain(std::string_view instance_name) const -> bool; + auto IsReplica(std::string_view instance_name) const -> bool; /// TODO: (andi) Add log in the name of methods auto AppendRegisterReplicationInstance(CoordinatorClientConfig const &config) -> ptr; diff --git a/src/coordination/include/nuraft/coordinator_cluster_state.hpp b/src/coordination/include/nuraft/coordinator_cluster_state.hpp index 700ca8601..68e1ad1aa 100644 --- a/src/coordination/include/nuraft/coordinator_cluster_state.hpp +++ b/src/coordination/include/nuraft/coordinator_cluster_state.hpp @@ -38,11 +38,11 @@ class CoordinatorClusterState { public: 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; @@ -53,7 +53,7 @@ class CoordinatorClusterState { auto GetInstances() const -> std::vector>; private: - std::map instance_roles; + std::map> instance_roles; }; } // namespace memgraph::coordination diff --git a/src/coordination/include/nuraft/coordinator_state_machine.hpp b/src/coordination/include/nuraft/coordinator_state_machine.hpp index 9b73a0ee2..90738931c 100644 --- a/src/coordination/include/nuraft/coordinator_state_machine.hpp +++ b/src/coordination/include/nuraft/coordinator_state_machine.hpp @@ -45,10 +45,10 @@ class CoordinatorStateMachine : public state_machine { ~CoordinatorStateMachine() override {} auto MainExists() const -> bool; - auto IsMain(std::string const &instance_name) const -> bool; - auto IsReplica(std::string const &instance_name) const -> bool; + auto IsMain(std::string_view instance_name) const -> bool; + auto IsReplica(std::string_view instance_name) const -> bool; - static auto CreateLog(std::string const &log) -> ptr; + static auto CreateLog(std::string_view log) -> ptr; static auto SerializeRegisterInstance(CoordinatorClientConfig const &config) -> ptr; static auto SerializeUnregisterInstance(std::string_view instance_name) -> ptr; static auto SerializeSetInstanceAsMain(std::string_view instance_name) -> ptr; diff --git a/src/coordination/raft_state.cpp b/src/coordination/raft_state.cpp index e7ee05a4e..a80fa6f19 100644 --- a/src/coordination/raft_state.cpp +++ b/src/coordination/raft_state.cpp @@ -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::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) -> void { - auto const endpoint = raft_address + ":" + std::to_string(raft_port); +auto RaftState::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string_view raft_address) + -> void { + auto const endpoint = fmt::format("{}:{}", raft_address, raft_port); srv_config const srv_config_to_add(static_cast(raft_server_id), endpoint); if (!raft_server_->add_srv(srv_config_to_add)->get_accepted()) { 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::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); } diff --git a/src/dbms/coordinator_handler.cpp b/src/dbms/coordinator_handler.cpp index f8e14e2a0..292d50d3d 100644 --- a/src/dbms/coordinator_handler.cpp +++ b/src/dbms/coordinator_handler.cpp @@ -20,28 +20,28 @@ namespace memgraph::dbms { CoordinatorHandler::CoordinatorHandler(coordination::CoordinatorState &coordinator_state) : coordinator_state_(coordinator_state) {} -auto CoordinatorHandler::RegisterReplicationInstance(memgraph::coordination::CoordinatorClientConfig config) +auto CoordinatorHandler::RegisterReplicationInstance(coordination::CoordinatorClientConfig const &config) -> coordination::RegisterInstanceCoordinatorStatus { return coordinator_state_.RegisterReplicationInstance(config); } -auto CoordinatorHandler::UnregisterReplicationInstance(std::string instance_name) +auto CoordinatorHandler::UnregisterReplicationInstance(std::string_view instance_name) -> 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 { - return coordinator_state_.SetReplicationInstanceToMain(std::move(instance_name)); + return coordinator_state_.SetReplicationInstanceToMain(instance_name); } auto CoordinatorHandler::ShowInstances() const -> std::vector { return coordinator_state_.ShowInstances(); } -auto CoordinatorHandler::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, std::string raft_address) - -> void { - coordinator_state_.AddCoordinatorInstance(raft_server_id, raft_port, std::move(raft_address)); +auto CoordinatorHandler::AddCoordinatorInstance(uint32_t raft_server_id, uint32_t raft_port, + std::string_view raft_address) -> void { + coordinator_state_.AddCoordinatorInstance(raft_server_id, raft_port, raft_address); } } // namespace memgraph::dbms diff --git a/src/dbms/coordinator_handler.hpp b/src/dbms/coordinator_handler.hpp index d06e70676..1c456134d 100644 --- a/src/dbms/coordinator_handler.hpp +++ b/src/dbms/coordinator_handler.hpp @@ -30,16 +30,17 @@ class CoordinatorHandler { // TODO: (andi) When moving coordinator state on same instances, rename from RegisterReplicationInstance to // RegisterInstance - auto RegisterReplicationInstance(coordination::CoordinatorClientConfig config) + auto RegisterReplicationInstance(coordination::CoordinatorClientConfig const &config) -> 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; - 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: coordination::CoordinatorState &coordinator_state_; diff --git a/src/io/network/endpoint.cpp b/src/io/network/endpoint.cpp index 44123db6b..bb6dcfd10 100644 --- a/src/io/network/endpoint.cpp +++ b/src/io/network/endpoint.cpp @@ -24,22 +24,22 @@ namespace memgraph::io::network { -Endpoint::IpFamily Endpoint::GetIpFamily(const std::string &address) { +Endpoint::IpFamily Endpoint::GetIpFamily(std::string_view address) { in_addr addr4; in6_addr addr6; - int ipv4_result = inet_pton(AF_INET, address.c_str(), &addr4); - int ipv6_result = inet_pton(AF_INET6, address.c_str(), &addr6); + int ipv4_result = inet_pton(AF_INET, address.data(), &addr4); + int ipv6_result = inet_pton(AF_INET6, address.data(), &addr6); if (ipv4_result == 1) { 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> Endpoint::ParseSocketOrIpAddress( - const std::string &address, const std::optional default_port) { + std::string_view address, const std::optional default_port) { /// expected address format: /// - "ip_address:port_number" /// - "ip_address" @@ -56,7 +56,7 @@ std::optional> Endpoint::ParseSocketOrIpAddress if (GetIpFamily(address) == IpFamily::NONE) { 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) { ip_address = std::move(parts[0]); @@ -88,7 +88,7 @@ std::optional> Endpoint::ParseSocketOrIpAddress } std::optional> Endpoint::ParseHostname( - const std::string &address, const std::optional default_port = {}) { + std::string_view address, const std::optional default_port = {}) { const std::string delimiter = ":"; std::string ip_address; std::vector parts = utils::Split(address, delimiter); @@ -97,7 +97,7 @@ std::optional> Endpoint::ParseHostname( if (!IsResolvableAddress(address, *default_port)) { 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) { int64_t int_port{0}; @@ -153,20 +153,20 @@ std::ostream &operator<<(std::ostream &os, const Endpoint &endpoint) { 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{ .ai_flags = AI_PASSIVE, .ai_family = AF_UNSPEC, // IPv4 and IPv6 .ai_socktype = SOCK_STREAM // TCP socket }; 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); return status == 0; } std::optional> Endpoint::ParseSocketOrAddress( - const std::string &address, const std::optional default_port) { + std::string_view address, const std::optional default_port) { const std::string delimiter = ":"; std::vector parts = utils::Split(address, delimiter); if (parts.size() == 1) { diff --git a/src/io/network/endpoint.hpp b/src/io/network/endpoint.hpp index 16d70e080..b0201240b 100644 --- a/src/io/network/endpoint.hpp +++ b/src/io/network/endpoint.hpp @@ -48,8 +48,8 @@ struct Endpoint { uint16_t port{0}; IpFamily family{IpFamily::NONE}; - static std::optional> ParseSocketOrAddress(const std::string &address, - std::optional default_port); + static std::optional> ParseSocketOrAddress( + std::string_view address, std::optional default_port = {}); /** * 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. */ static std::optional> ParseSocketOrIpAddress( - const std::string &address, std::optional default_port = {}); + std::string_view address, std::optional default_port = {}); /** * Tries to parse given string as either socket address or hostname. @@ -71,12 +71,12 @@ struct Endpoint { * - "hostname" * After we parse hostname and port we try to resolve the hostname into an ip_address. */ - static std::optional> ParseHostname(const std::string &address, + static std::optional> ParseHostname(std::string_view address, std::optional 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. diff --git a/src/query/interpreter.cpp b/src/query/interpreter.cpp index a437d1060..a3b573a01 100644 --- a/src/query/interpreter.cpp +++ b/src/query/interpreter.cpp @@ -410,7 +410,7 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler { : 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); switch (status) { using enum memgraph::coordination::UnregisterInstanceCoordinatorStatus; @@ -437,20 +437,18 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler { } } - void RegisterReplicationInstance(std::string const &coordinator_socket_address, - std::string const &replication_socket_address, + void RegisterReplicationInstance(std::string_view coordinator_socket_address, + std::string_view replication_socket_address, std::chrono::seconds const &instance_check_frequency, std::chrono::seconds const &instance_down_timeout, std::chrono::seconds const &instance_get_uuid_frequency, - std::string const &instance_name, CoordinatorQuery::SyncMode sync_mode) override { - const auto maybe_replication_ip_port = - io::network::Endpoint::ParseSocketOrAddress(replication_socket_address, std::nullopt); + std::string_view instance_name, CoordinatorQuery::SyncMode sync_mode) override { + const auto maybe_replication_ip_port = io::network::Endpoint::ParseSocketOrAddress(replication_socket_address); if (!maybe_replication_ip_port) { throw QueryRuntimeException("Invalid replication socket address!"); } - const auto maybe_coordinator_ip_port = - io::network::Endpoint::ParseSocketOrAddress(coordinator_socket_address, std::nullopt); + const auto maybe_coordinator_ip_port = io::network::Endpoint::ParseSocketOrAddress(coordinator_socket_address); if (!maybe_replication_ip_port) { 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 [coordinator_server_ip, coordinator_server_port] = *maybe_coordinator_ip_port; const auto repl_config = coordination::CoordinatorClientConfig::ReplicationClientInfo{ - .instance_name = instance_name, + .instance_name = std::string(instance_name), .replication_mode = convertFromCoordinatorToReplicationMode(sync_mode), .replication_ip_address = replication_ip, .replication_port = replication_port}; auto coordinator_client_config = - coordination::CoordinatorClientConfig{.instance_name = instance_name, + coordination::CoordinatorClientConfig{.instance_name = std::string(instance_name), .ip_address = coordinator_server_ip, .port = coordinator_server_port, .instance_health_check_frequency_sec = instance_check_frequency, @@ -473,7 +471,7 @@ class CoordQueryHandler final : public query::CoordinatorQueryHandler { .replication_client_info = repl_config, .ssl = std::nullopt}; - auto status = coordinator_handler_.RegisterReplicationInstance(std::move(coordinator_client_config)); + auto status = coordinator_handler_.RegisterReplicationInstance(coordinator_client_config); switch (status) { using enum memgraph::coordination::RegisterInstanceCoordinatorStatus; 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 const maybe_ip_and_port = io::network::Endpoint::ParseSocketOrIpAddress(raft_socket_address); + auto AddCoordinatorInstance(uint32_t raft_server_id, std::string_view raft_socket_address) -> void override { + auto const maybe_ip_and_port = io::network::Endpoint::ParseSocketOrAddress(raft_socket_address); if (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); @@ -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); switch (status) { using enum memgraph::coordination::SetInstanceToMainCoordinatorStatus; diff --git a/src/query/interpreter.hpp b/src/query/interpreter.hpp index 01a443d6d..f18bd6721 100644 --- a/src/query/interpreter.hpp +++ b/src/query/interpreter.hpp @@ -95,25 +95,24 @@ class CoordinatorQueryHandler { }; /// @throw QueryRuntimeException if an error ocurred. - virtual void RegisterReplicationInstance(std::string const &coordinator_socket_address, - std::string const &replication_socket_address, + virtual void RegisterReplicationInstance(std::string_view coordinator_socket_address, + std::string_view replication_socket_address, std::chrono::seconds const &instance_health_check_frequency, std::chrono::seconds const &instance_down_timeout, 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. - virtual void UnregisterInstance(std::string const &instance_name) = 0; + virtual void UnregisterInstance(std::string_view instance_name) = 0; /// @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. virtual std::vector ShowInstances() const = 0; /// @throw QueryRuntimeException if an error ocurred. - virtual auto AddCoordinatorInstance(uint32_t raft_server_id, std::string const &coordinator_socket_address) - -> void = 0; + virtual auto AddCoordinatorInstance(uint32_t raft_server_id, std::string_view coordinator_socket_address) -> void = 0; }; #endif diff --git a/src/utils/CMakeLists.txt b/src/utils/CMakeLists.txt index bac3e78f3..0d9ab0156 100644 --- a/src/utils/CMakeLists.txt +++ b/src/utils/CMakeLists.txt @@ -24,8 +24,10 @@ find_package(Threads REQUIRED) add_library(mg-utils STATIC ${utils_src_files}) 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 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 settings.cpp) diff --git a/src/utils/string.hpp b/src/utils/string.hpp index 31723bb65..26709439f 100644 --- a/src/utils/string.hpp +++ b/src/utils/string.hpp @@ -229,6 +229,13 @@ inline std::vector Split(const std::string_view src, const std::str return res; } +inline std::vector SplitView(const std::string_view src, const std::string_view delimiter, + int splits = -1) { + std::vector res; + Split(&res, src, delimiter, splits); + return res; +} + /** * Split a string by whitespace into a vector. * Runs of consecutive whitespace are regarded as a single delimiter.