From 0a45b51760c1bd6a6eb55a9936cbe022501158a2 Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Thu, 19 Dec 2024 09:54:29 -0600 Subject: [PATCH] refactor remote mount --- repertory/librepertory/include/app_config.hpp | 82 ++---- .../include/comm/packet/packet_client.hpp | 24 +- .../librepertory/include/types/remote.hpp | 60 ++++- repertory/librepertory/src/app_config.cpp | 148 +++-------- .../src/comm/packet/packet_client.cpp | 29 +-- .../drives/fuse/remotefuse/remote_client.cpp | 7 +- .../winfsp/remotewinfsp/remote_client.cpp | 7 +- repertory/repertory/include/cli/mount.hpp | 21 +- repertory/repertory_test/src/config_test.cpp | 243 ++++++++---------- 9 files changed, 253 insertions(+), 368 deletions(-) diff --git a/repertory/librepertory/include/app_config.hpp b/repertory/librepertory/include/app_config.hpp index ebaa96f4..08953c9f 100644 --- a/repertory/librepertory/include/app_config.hpp +++ b/repertory/librepertory/include/app_config.hpp @@ -24,6 +24,7 @@ #include "events/event_system.hpp" #include "events/events.hpp" +#include "types/remote.hpp" #include "types/repertory.hpp" #include "utils/error_utils.hpp" @@ -39,7 +40,7 @@ public: [[nodiscard]] static auto default_data_directory(const provider_type &prov) -> std::string; - [[nodiscard]] static auto default_remote_port(const provider_type &prov) + [[nodiscard]] static auto default_remote_api_port(const provider_type &prov) -> std::uint16_t; [[nodiscard]] static auto default_rpc_port(const provider_type &prov) @@ -76,7 +77,6 @@ private: std::atomic eviction_delay_mins_; std::atomic eviction_uses_accessed_time_; std::atomic high_freq_interval_secs_; - std::atomic is_remote_mount_; std::atomic low_freq_interval_secs_; std::atomic max_cache_size_bytes_; std::atomic max_upload_count_; @@ -85,14 +85,9 @@ private: std::atomic online_check_retry_secs_; std::atomic orphaned_file_retention_days_; atomic preferred_download_type_; - std::atomic read_ahead_count_; std::atomic remote_client_pool_size_; - atomic remote_host_name_or_ip_; - std::atomic remote_max_connections_; - std::atomic remote_port_; - std::atomic remote_receive_timeout_secs_; - std::atomic remote_send_timeout_secs_; - atomic remote_token_; + std::atomic remote_api_port_; + atomic remote_encryption_token_; std::atomic retry_read_count_; std::atomic ring_buffer_file_size_; std::atomic task_wait_ms_; @@ -104,6 +99,7 @@ private: atomic hc_; std::string log_directory_; mutable std::recursive_mutex read_write_mutex_; + atomic remote_config_; atomic s3_config_; atomic sia_config_; std::uint64_t version_{REPERTORY_CONFIG_VERSION}; @@ -221,10 +217,6 @@ public: [[nodiscard]] auto get_host_config() const -> host_config { return hc_; } - [[nodiscard]] auto get_is_remote_mount() const -> bool { - return is_remote_mount_; - } - [[nodiscard]] auto get_json() const -> json; [[nodiscard]] auto get_log_directory() const -> std::string { @@ -266,38 +258,21 @@ public: return prov_; } - [[nodiscard]] auto get_read_ahead_count() const -> std::uint8_t { - return std::max(static_cast(1U), read_ahead_count_.load()); - } - [[nodiscard]] auto get_remote_client_pool_size() const -> std::uint8_t { return std::max(static_cast(5U), remote_client_pool_size_.load()); } - [[nodiscard]] auto get_remote_host_name_or_ip() const -> std::string { - return remote_host_name_or_ip_; + [[nodiscard]] auto get_remote_api_port() const -> std::uint16_t { + return remote_api_port_; } - [[nodiscard]] auto get_remote_max_connections() const -> std::uint8_t { - return std::max(static_cast(1U), - remote_max_connections_.load()); + [[nodiscard]] auto get_remote_config() const -> remote::remote_config { + return remote_config_; } - [[nodiscard]] auto get_remote_port() const -> std::uint16_t { - return remote_port_; - } - - [[nodiscard]] auto get_remote_receive_timeout_secs() const -> std::uint16_t { - return remote_receive_timeout_secs_; - } - - [[nodiscard]] auto get_remote_send_timeout_secs() const -> std::uint16_t { - return remote_send_timeout_secs_; - } - - [[nodiscard]] auto get_remote_token() const -> std::string { - return remote_token_; + [[nodiscard]] auto get_remote_encryption_token() const -> std::string { + return remote_encryption_token_; } [[nodiscard]] auto get_retry_read_count() const -> std::uint16_t { @@ -396,8 +371,6 @@ public: void set_host_config(host_config cfg); - void set_is_remote_mount(bool is_remote_mount); - void set_low_frequency_interval_secs(std::uint16_t low_frequency_interval_secs) { set_value(low_freq_interval_secs_, low_frequency_interval_secs); @@ -425,12 +398,8 @@ public: set_value(orphaned_file_retention_days_, orphaned_file_retention_days); } - void set_preferred_download_type(const download_type &dt) { - set_value(preferred_download_type_, download_type_to_string(dt)); - } - - void set_read_ahead_count(std::uint8_t read_ahead_count) { - set_value(read_ahead_count_, read_ahead_count); + void set_preferred_download_type(const download_type &type) { + set_value(preferred_download_type_, download_type_to_string(type)); } void set_remote_client_pool_size(std::uint8_t remote_client_pool_size) { @@ -441,29 +410,14 @@ public: set_value(ring_buffer_file_size_, ring_buffer_file_size); } - void set_remote_host_name_or_ip(const std::string &remote_host_name_or_ip) { - set_value(remote_host_name_or_ip_, remote_host_name_or_ip); + void set_remote_api_port(std::uint16_t remote_api_port) { + set_value(remote_api_port_, remote_api_port); } - void set_remote_max_connections(std::uint8_t remote_max_connections) { - set_value(remote_max_connections_, remote_max_connections); - } + void set_remote_config(remote::remote_config cfg); - void set_remote_port(std::uint16_t remote_port) { - set_value(remote_port_, remote_port); - } - - void - set_remote_receive_timeout_secs(std::uint16_t remote_receive_timeout_secs) { - set_value(remote_receive_timeout_secs_, remote_receive_timeout_secs); - } - - void set_remote_send_timeout_secs(std::uint16_t remote_send_timeout_secs) { - set_value(remote_send_timeout_secs_, remote_send_timeout_secs); - } - - void set_remote_token(const std::string &remote_token) { - set_value(remote_token_, remote_token); + void set_remote_encryption_token(const std::string &remote_encryption_token) { + set_value(remote_encryption_token_, remote_encryption_token); } void set_retry_read_count(std::uint16_t retry_read_count) { diff --git a/repertory/librepertory/include/comm/packet/packet_client.hpp b/repertory/librepertory/include/comm/packet/packet_client.hpp index 99949de2..9e67e387 100644 --- a/repertory/librepertory/include/comm/packet/packet_client.hpp +++ b/repertory/librepertory/include/comm/packet/packet_client.hpp @@ -23,6 +23,7 @@ #define REPERTORY_INCLUDE_COMM_PACKET_PACKET_CLIENT_HPP_ #include "comm/packet/packet.hpp" +#include "types/remote.hpp" using boost::asio::ip::tcp; @@ -36,9 +37,7 @@ private: }; public: - packet_client(std::string host_name_or_ip, std::uint8_t max_connections, - std::uint16_t port, std::uint16_t receive_timeout, - std::uint16_t send_timeout, std::string encryption_token); + packet_client(remote::remote_config cfg); ~packet_client(); @@ -49,12 +48,7 @@ public: private: boost::asio::io_context io_context_; - std::string host_name_or_ip_; - std::uint8_t max_connections_; - std::uint16_t port_; - std::uint16_t receive_timeout_; - std::uint16_t send_timeout_; - std::string encryption_token_; + remote::remote_config cfg_; std::string unique_id_; private: @@ -75,21 +69,21 @@ private: void put_client(std::shared_ptr &cli); - [[nodiscard]] auto read_packet(client &cli, - packet &response) -> packet::error_type; + [[nodiscard]] auto read_packet(client &cli, packet &response) + -> packet::error_type; void resolve(); public: - [[nodiscard]] auto send(std::string_view method, - std::uint32_t &service_flags) -> packet::error_type; + [[nodiscard]] auto send(std::string_view method, std::uint32_t &service_flags) + -> packet::error_type; [[nodiscard]] auto send(std::string_view method, packet &request, std::uint32_t &service_flags) -> packet::error_type; [[nodiscard]] auto send(std::string_view method, packet &request, - packet &response, - std::uint32_t &service_flags) -> packet::error_type; + packet &response, std::uint32_t &service_flags) + -> packet::error_type; }; } // namespace repertory diff --git a/repertory/librepertory/include/types/remote.hpp b/repertory/librepertory/include/types/remote.hpp index 52cddfd4..85bb5fda 100644 --- a/repertory/librepertory/include/types/remote.hpp +++ b/repertory/librepertory/include/types/remote.hpp @@ -32,6 +32,36 @@ inline constexpr const auto PACKET_SERVICE_FLAGS{PACKET_SERVICE_FUSE}; #endif // defined(_WIN32) namespace repertory::remote { +struct remote_config final { + std::uint16_t api_port{}; + std::string encryption_token; + std::string host_name_or_ip; + std::uint8_t max_connections{20U}; + std::uint32_t recv_timeout_ms{120U * 1000U}; + std::uint32_t send_timeout_ms{30U * 1000U}; + + auto operator==(const remote_config &cfg) const noexcept -> bool { + if (&cfg != this) { + return api_port == cfg.api_port && + encryption_token == cfg.encryption_token && + host_name_or_ip == cfg.host_name_or_ip && + max_connections == cfg.max_connections && + recv_timeout_ms == cfg.recv_timeout_ms && + send_timeout_ms == cfg.send_timeout_ms; + } + + return true; + } + + auto operator!=(const remote_config &cfg) const noexcept -> bool { + if (&cfg != this) { + return not(cfg == *this); + } + + return false; + } +}; + using block_count = std::uint64_t; using block_size = std::uint32_t; using file_handle = std::uint64_t; @@ -155,9 +185,35 @@ struct statfs_x final : public statfs { #if !defined(_WIN32) [[nodiscard]] auto create_open_flags(std::uint32_t flags) -> open_flags; -[[nodiscard]] auto -create_os_open_flags(const open_flags &flags) -> std::uint32_t; +[[nodiscard]] auto create_os_open_flags(const open_flags &flags) + -> std::uint32_t; #endif // !defined(_WIN32) } // namespace repertory::remote +NLOHMANN_JSON_NAMESPACE_BEGIN +template <> struct adl_serializer { + static void to_json(json &data, + const repertory::remote::remote_config &value) { + data = { + {"ApiPort", value.api_port}, + {"EncryptionToken", value.encryption_token}, + {"HostNameOrIp", value.host_name_or_ip}, + {"ReceiveTimeoutMs", value.recv_timeout_ms}, + {"SendTimeoutMs", value.send_timeout_ms}, + {"MaxConnections", value.max_connections}, + }; + } + + static void from_json(const json &data, + repertory::remote::remote_config &value) { + data.at("ApiPort").get_to(value.api_port); + data.at("EncryptionToken").get_to(value.encryption_token); + data.at("HostNameOrIp").get_to(value.host_name_or_ip); + data.at("ReceiveTimeoutMs").get_to(value.recv_timeout_ms); + data.at("SendTimeoutMs").get_to(value.send_timeout_ms); + data.at("MaxConnections").get_to(value.max_connections); + } +}; +NLOHMANN_JSON_NAMESPACE_END + #endif // REPERTORY_INCLUDE_TYPES_REMOTE_HPP_ diff --git a/repertory/librepertory/src/app_config.cpp b/repertory/librepertory/src/app_config.cpp index 513cda6b..d7610847 100644 --- a/repertory/librepertory/src/app_config.cpp +++ b/repertory/librepertory/src/app_config.cpp @@ -43,13 +43,12 @@ constexpr const auto default_med_freq_interval_secs{2U * 60U}; constexpr const auto default_min_download_timeout_secs{5U}; constexpr const auto default_online_check_retry_secs{60U}; constexpr const auto default_orphaned_file_retention_days{15U}; -constexpr const auto default_read_ahead_count{4U}; constexpr const auto default_remote_client_pool_size{10U}; constexpr const auto default_remote_host_name_or_ip{""}; constexpr const auto default_remote_max_connections{20U}; constexpr const auto default_remote_receive_timeout_secs{120U}; constexpr const auto default_remote_send_timeout_secs{30U}; -constexpr const auto default_remote_token{""}; +constexpr const auto default_remote_encryption_token{""}; constexpr const auto default_retry_read_count{6U}; constexpr const auto default_ring_buffer_file_size{512U}; constexpr const auto default_task_wait_ms{100U}; @@ -78,7 +77,6 @@ app_config::app_config(const provider_type &prov, eviction_delay_mins_(default_eviction_delay_mins), eviction_uses_accessed_time_(false), high_freq_interval_secs_(default_high_freq_interval_secs), - is_remote_mount_(false), low_freq_interval_secs_(default_low_freq_interval_secs), max_cache_size_bytes_(default_max_cache_size_bytes), max_upload_count_(default_max_upload_count), @@ -88,14 +86,9 @@ app_config::app_config(const provider_type &prov, orphaned_file_retention_days_(default_orphaned_file_retention_days), preferred_download_type_( download_type_to_string(download_type::fallback)), - read_ahead_count_(default_read_ahead_count), remote_client_pool_size_(default_remote_client_pool_size), - remote_host_name_or_ip_(default_remote_host_name_or_ip), - remote_max_connections_(default_remote_max_connections), - remote_port_(default_remote_port(prov)), - remote_receive_timeout_secs_(default_remote_receive_timeout_secs), - remote_send_timeout_secs_(default_remote_send_timeout_secs), - remote_token_(default_remote_token), + remote_api_port_(default_remote_api_port(prov)), + remote_encryption_token_(default_remote_encryption_token), retry_read_count_(default_retry_read_count), ring_buffer_file_size_(default_ring_buffer_file_size), task_wait_ms_(default_task_wait_ms) { @@ -182,7 +175,7 @@ auto app_config::default_data_directory(const provider_type &prov) return data_directory; } -auto app_config::default_remote_port(const provider_type &prov) +auto app_config::default_remote_api_port(const provider_type &prov) -> std::uint16_t { static const std::array(provider_type::unknown)> @@ -237,19 +230,13 @@ auto app_config::get_json() const -> json { {"OnlineCheckRetrySeconds", online_check_retry_secs_}, {"OrphanedFileRetentionDays", orphaned_file_retention_days_}, {"PreferredDownloadType", preferred_download_type_}, - {"ReadAheadCount", read_ahead_count_}, { "RemoteMount", { {"EnableRemoteMount", enable_remote_mount_}, - {"IsRemoteMount", is_remote_mount_}, - {"RemoteClientPoolSize", remote_client_pool_size_}, - {"RemoteMaxConnections", remote_max_connections_}, - {"RemoteHostNameOrIp", remote_host_name_or_ip_}, - {"RemotePort", remote_port_}, - {"RemoteReceiveTimeoutSeconds", remote_receive_timeout_secs_}, - {"RemoteSendTimeoutSeconds", remote_send_timeout_secs_}, - {"RemoteToken", remote_token_}, + {"ClientPoolSize", remote_client_pool_size_}, + {"ApiPort", remote_api_port_}, + {"EncryptionToken", remote_encryption_token_}, }, }, {"RetryReadCount", retry_read_count_}, @@ -271,7 +258,7 @@ auto app_config::get_json() const -> json { ret.erase("OnlineCheckRetrySeconds"); ret.erase("OrphanedFileRetentionDays"); ret.erase("PreferredDownloadType"); - ret.erase("ReadAheadCount"); + ret.erase("RemoteConfig"); ret.erase("RetryReadCount"); ret.erase("RingBufferFileSize"); ret.erase("S3Config"); @@ -279,15 +266,16 @@ auto app_config::get_json() const -> json { } else if (prov_ == provider_type::s3) { ret.erase("EncryptConfig"); ret.erase("HostConfig"); + ret.erase("RemoteConfig"); ret.erase("SiaConfig"); } else if (prov_ == provider_type::sia) { ret.erase("EncryptConfig"); + ret.erase("RemoteConfig"); ret.erase("S3Config"); } else if (prov_ == provider_type::remote) { ret.erase("ChunkDownloaderTimeoutSeconds"); ret.erase("DatabaseType"); ret.erase("EnableChunkDownloaderTimeout"); - ret.erase("EnableChunkDownloaderTimeout"); ret.erase("EnableMaxCacheSize"); ret.erase("EncryptConfig"); ret.erase("EvictionDelayMinutes"); @@ -300,7 +288,7 @@ auto app_config::get_json() const -> json { ret.erase("OnlineCheckRetrySeconds"); ret.erase("OrphanedFileRetentionDays"); ret.erase("PreferredDownloadType"); - ret.erase("ReadAheadCount"); + ret.erase("RemoteMount"); ret.erase("RetryReadCount"); ret.erase("RingBufferFileSize"); ret.erase("S3Config"); @@ -434,35 +422,17 @@ auto app_config::get_value_by_name(const std::string &name) const return download_type_to_string(download_type_from_string( preferred_download_type_, download_type::fallback)); } - if (name == "ReadAheadCount") { - return std::to_string(get_read_ahead_count()); - } - if (name == "RemoteMount.EnableRemoteMount") { + if (name == "RemoteMount.Enable") { return utils::string::from_bool(get_enable_remote_mount()); } - if (name == "RemoteMount.IsRemoteMount") { - return utils::string::from_bool(get_is_remote_mount()); - } - if (name == "RemoteMount.RemoteClientPoolSize") { + if (name == "RemoteMount.ClientPoolSize") { return std::to_string(get_remote_client_pool_size()); } - if (name == "RemoteMount.RemoteHostNameOrIp") { - return get_remote_host_name_or_ip(); + if (name == "RemoteMount.ApiPort") { + return std::to_string(get_remote_api_port()); } - if (name == "RemoteMount.RemoteMaxConnections") { - return std::to_string(get_remote_max_connections()); - } - if (name == "RemoteMount.RemotePort") { - return std::to_string(get_remote_port()); - } - if (name == "RemoteMount.RemoteReceiveTimeoutSeconds") { - return std::to_string(get_remote_receive_timeout_secs()); - } - if (name == "RemoteMount.RemoteSendTimeoutSeconds") { - return std::to_string(get_remote_send_timeout_secs()); - } - if (name == "RemoteMount.RemoteToken") { - return get_remote_token(); + if (name == "RemoteMount.EncryptionToken") { + return get_remote_encryption_token(); } if (name == "RetryReadCount") { return std::to_string(get_retry_read_count()); @@ -576,7 +546,6 @@ auto app_config::load() -> bool { ret = false; } - get_value(json_document, "ReadAheadCount", read_ahead_count_, ret); get_value(json_document, "RingBufferFileSize", ring_buffer_file_size_, ret); get_value(json_document, "TaskWaitMillis", task_wait_ms_, ret); @@ -603,22 +572,13 @@ auto app_config::load() -> bool { preferred_download_type_, ret); get_value(json_document, "RetryReadCount", retry_read_count_, ret); if (json_document.find("RemoteMount") != json_document.end()) { - auto remoteMount = json_document["RemoteMount"]; - get_value(remoteMount, "EnableRemoteMount", enable_remote_mount_, + auto remoteMount = json_document.at("RemoteMount"); + get_value(remoteMount, "Enable", enable_remote_mount_, ret); + get_value(remoteMount, "ClientPoolSize", remote_client_pool_size_, + ret); + get_value(remoteMount, "ApiPort", remote_api_port_, ret); + get_value(remoteMount, "EncryptionToken", remote_encryption_token_, ret); - get_value(remoteMount, "IsRemoteMount", is_remote_mount_, ret); - get_value(remoteMount, "RemoteClientPoolSize", - remote_client_pool_size_, ret); - get_value(remoteMount, "RemoteHostNameOrIp", - remote_host_name_or_ip_, ret); - get_value(remoteMount, "RemoteMaxConnections", - remote_max_connections_, ret); - get_value(remoteMount, "RemotePort", remote_port_, ret); - get_value(remoteMount, "RemoteReceiveTimeoutSeconds", - remote_receive_timeout_secs_, ret); - get_value(remoteMount, "RemoteSendTimeoutSeconds", - remote_send_timeout_secs_, ret); - get_value(remoteMount, "RemoteToken", remote_token_, ret); } else { ret = false; } @@ -677,11 +637,6 @@ void app_config::save() { } void app_config::set_enable_remote_mount(bool enable_remote_mount) { - if (get_is_remote_mount()) { - set_value(enable_remote_mount_, false); - return; - } - set_value(enable_remote_mount_, enable_remote_mount); } @@ -691,19 +646,14 @@ void app_config::set_encrypt_config(encrypt_config cfg) { void app_config::set_host_config(host_config cfg) { set_value(hc_, cfg); } +void app_config::set_remote_config(remote::remote_config cfg) { + set_value(remote_config_, cfg); +} + void app_config::set_s3_config(s3_config cfg) { set_value(s3_config_, cfg); } void app_config::set_sia_config(sia_config cfg) { set_value(sia_config_, cfg); } -void app_config::set_is_remote_mount(bool is_remote_mount) { - if (get_enable_remote_mount()) { - set_value(is_remote_mount_, false); - return; - } - - set_value(is_remote_mount_, is_remote_mount); -} - auto app_config::set_value_by_name(const std::string &name, const std::string &value) -> std::string { REPERTORY_USES_FUNCTION_NAME(); @@ -839,45 +789,21 @@ auto app_config::set_value_by_name(const std::string &name, download_type_from_string(value, download_type::fallback)); return download_type_to_string(get_preferred_download_type()); } - if (name == "ReadAheadCount") { - set_read_ahead_count(utils::string::to_uint8(value)); - return std::to_string(get_read_ahead_count()); + if (name == "RemoteMount.ApiPort") { + set_remote_api_port(utils::string::to_uint16(value)); + return std::to_string(get_remote_api_port()); } - if (name == "RemoteMount.EnableRemoteMount") { - set_enable_remote_mount(utils::string::to_bool(value)); - return utils::string::from_bool(get_enable_remote_mount()); - } - if (name == "RemoteMount.IsRemoteMount") { - set_is_remote_mount(utils::string::to_bool(value)); - return utils::string::from_bool(get_is_remote_mount()); - } - if (name == "RemoteMount.RemoteClientPoolSize") { + if (name == "RemoteMount.ClientPoolSize") { set_remote_client_pool_size(utils::string::to_uint8(value)); return std::to_string(get_remote_client_pool_size()); } - if (name == "RemoteMount.RemoteHostNameOrIp") { - set_remote_host_name_or_ip(value); - return get_remote_host_name_or_ip(); + if (name == "RemoteMount.Enable") { + set_enable_remote_mount(utils::string::to_bool(value)); + return utils::string::from_bool(get_enable_remote_mount()); } - if (name == "RemoteMount.RemoteMaxConnections") { - set_remote_max_connections(utils::string::to_uint8(value)); - return std::to_string(get_remote_max_connections()); - } - if (name == "RemoteMount.RemotePort") { - set_remote_port(utils::string::to_uint16(value)); - return std::to_string(get_remote_port()); - } - if (name == "RemoteMount.RemoteReceiveTimeoutSeconds") { - set_remote_receive_timeout_secs(utils::string::to_uint16(value)); - return std::to_string(get_remote_receive_timeout_secs()); - } - if (name == "RemoteMount.RemoteSendTimeoutSeconds") { - set_remote_send_timeout_secs(utils::string::to_uint16(value)); - return std::to_string(get_remote_send_timeout_secs()); - } - if (name == "RemoteMount.RemoteToken") { - set_remote_token(value); - return get_remote_token(); + if (name == "RemoteMount.EncryptionToken") { + set_remote_encryption_token(value); + return get_remote_encryption_token(); } if (name == "RetryReadCount") { set_retry_read_count(utils::string::to_uint16(value)); diff --git a/repertory/librepertory/src/comm/packet/packet_client.cpp b/repertory/librepertory/src/comm/packet/packet_client.cpp index 4c240176..bc9c3b68 100644 --- a/repertory/librepertory/src/comm/packet/packet_client.cpp +++ b/repertory/librepertory/src/comm/packet/packet_client.cpp @@ -38,18 +38,8 @@ E_SIMPLE2(packet_client_timeout, error, true, ); // clang-format on -packet_client::packet_client(std::string host_name_or_ip, - std::uint8_t max_connections, std::uint16_t port, - std::uint16_t receive_timeout, - std::uint16_t send_timeout, - std::string encryption_token) - : host_name_or_ip_(std::move(host_name_or_ip)), - max_connections_(max_connections == 0U ? 20U : max_connections), - port_(port), - receive_timeout_(receive_timeout), - send_timeout_(send_timeout), - encryption_token_(std::move(encryption_token)), - unique_id_(utils::create_uuid_string()) {} +packet_client::packet_client(remote::remote_config cfg) + : cfg_(std::move(cfg)), unique_id_(utils::create_uuid_string()) {} packet_client::~packet_client() { allow_connections_ = false; @@ -115,7 +105,7 @@ auto packet_client::get_client() -> std::shared_ptr { void packet_client::put_client(std::shared_ptr &cli) { mutex_lock clientsLock(clients_mutex_); - if (clients_.size() < max_connections_) { + if (clients_.size() < cfg_.max_connections) { clients_.emplace_back(cli); } } @@ -144,7 +134,7 @@ auto packet_client::read_packet(client &cli, packet &response) read_buffer(); response = std::move(buffer); - auto ret = response.decrypt(encryption_token_); + auto ret = response.decrypt(cfg_.encryption_token); if (ret == 0) { ret = response.decode(cli.nonce); } @@ -157,8 +147,9 @@ void packet_client::resolve() { return; } - resolve_results_ = tcp::resolver(io_context_) - .resolve(host_name_or_ip_, std::to_string(port_)); + resolve_results_ = + tcp::resolver(io_context_) + .resolve(cfg_.host_name_or_ip, std::to_string(cfg_.api_port)); } auto packet_client::send(std::string_view method, std::uint32_t &service_flags) @@ -193,7 +184,7 @@ auto packet_client::send(std::string_view method, packet &request, if (current_client) { try { request.encode_top(current_client->nonce); - request.encrypt(encryption_token_); + request.encrypt(cfg_.encryption_token); timeout request_timeout( [method, current_client]() { @@ -201,7 +192,7 @@ auto packet_client::send(std::string_view method, packet &request, "request", std::string{method}); packet_client::close(*current_client); }, - std::chrono::seconds(send_timeout_)); + std::chrono::milliseconds(cfg_.send_timeout_ms)); std::uint32_t offset{}; while (offset < request.get_size()) { @@ -223,7 +214,7 @@ auto packet_client::send(std::string_view method, packet &request, "response", std::string{method}); packet_client::close(*current_client); }, - std::chrono::seconds(receive_timeout_)); + std::chrono::milliseconds(cfg_.recv_timeout_ms)); ret = read_packet(*current_client, response); response_timeout.disable(); diff --git a/repertory/librepertory/src/drives/fuse/remotefuse/remote_client.cpp b/repertory/librepertory/src/drives/fuse/remotefuse/remote_client.cpp index 8c7848bb..ae2361ad 100644 --- a/repertory/librepertory/src/drives/fuse/remotefuse/remote_client.cpp +++ b/repertory/librepertory/src/drives/fuse/remotefuse/remote_client.cpp @@ -27,12 +27,7 @@ namespace repertory::remote_fuse { remote_client::remote_client(const app_config &config) - : config_(config), - packet_client_( - config.get_remote_host_name_or_ip(), - config.get_remote_max_connections(), config.get_remote_port(), - config.get_remote_receive_timeout_secs(), - config.get_remote_send_timeout_secs(), config.get_remote_token()) {} + : config_(config), packet_client_(config.get_remote_config()) {} auto remote_client::fuse_access(const char *path, const std::int32_t &mask) -> packet::error_type { diff --git a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp index f403dedb..ef7f8bb2 100644 --- a/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp +++ b/repertory/librepertory/src/drives/winfsp/remotewinfsp/remote_client.cpp @@ -47,12 +47,7 @@ E_SIMPLE3(remote_winfsp_client_event, debug, true, // clang-format on remote_client::remote_client(const app_config &config) - : config_(config), - packet_client_( - config.get_remote_host_name_or_ip(), - config.get_remote_max_connections(), config.get_remote_port(), - config.get_remote_receive_timeout_secs(), - config.get_remote_send_timeout_secs(), config.get_remote_token()) {} + : config_(config), packet_client_(config.get_remote_config()) {} auto remote_client::winfsp_can_delete(PVOID file_desc, PWSTR file_name) -> packet::error_type { diff --git a/repertory/repertory/include/cli/mount.hpp b/repertory/repertory/include/cli/mount.hpp index 88aaed58..f9de39d1 100644 --- a/repertory/repertory/include/cli/mount.hpp +++ b/repertory/repertory/include/cli/mount.hpp @@ -71,11 +71,10 @@ mount(std::vector args, std::string data_directory, if (generate_config) { app_config config(prov, data_directory); if (prov == provider_type::remote) { - config.set_enable_remote_mount(false); - config.set_is_remote_mount(true); - config.set_remote_host_name_or_ip(remote_host); - config.set_remote_port(remote_port); - config.save(); + auto cfg = config.get_remote_config(); + cfg.host_name_or_ip = remote_host; + cfg.api_port = remote_port; + config.set_remote_config(cfg); } else if (prov == provider_type::sia && config.get_sia_config().bucket.empty()) { config.set_value_by_name("SiaConfig.Bucket", unique_id); @@ -128,12 +127,12 @@ mount(std::vector args, std::string data_directory, if (prov == provider_type::remote) { std::uint16_t port{0U}; if (utils::get_next_available_port(config.get_api_port(), port)) { - config.set_remote_host_name_or_ip(remote_host); - config.set_remote_port(remote_port); + auto cfg = config.get_remote_config(); + cfg.host_name_or_ip = remote_host; + cfg.api_port = remote_port; + config.set_remote_config(cfg); config.set_api_port(port); - config.set_is_remote_mount(true); - config.set_enable_remote_mount(false); - config.save(); + try { remote_drive drive( config, @@ -161,8 +160,6 @@ mount(std::vector args, std::string data_directory, config.set_value_by_name("SiaConfig.Bucket", unique_id); } - config.set_is_remote_mount(false); - try { auto provider = create_provider(prov, config); repertory_drive drive(config, lock, *provider); diff --git a/repertory/repertory_test/src/config_test.cpp b/repertory/repertory_test/src/config_test.cpp index 0aae9bb1..54e26590 100644 --- a/repertory/repertory_test/src/config_test.cpp +++ b/repertory/repertory_test/src/config_test.cpp @@ -86,17 +86,11 @@ const auto DEFAULT_SIA_CONFIG = "{\n" " \"OnlineCheckRetrySeconds\": 60,\n" " \"OrphanedFileRetentionDays\": 15,\n" " \"PreferredDownloadType\": \"fallback\",\n" - " \"ReadAheadCount\": 4,\n" " \"RemoteMount\": {\n" - " \"EnableRemoteMount\": false,\n" - " \"IsRemoteMount\": false,\n" - " \"RemoteClientPoolSize\": 10,\n" - " \"RemoteHostNameOrIp\": \"\",\n" - " \"RemoteMaxConnections\": 20,\n" - " \"RemotePort\": 20000,\n" - " \"RemoteReceiveTimeoutSeconds\": 120,\n" - " \"RemoteSendTimeoutSeconds\": 30,\n" - " \"RemoteToken\": \"\"\n" + " \"Enable\": false,\n" + " \"ClientPoolSize\": 10,\n" + " \"ApiPort\": 20000,\n" + " \"EncryptionToken\": \"\"\n" " },\n" " \"RetryReadCount\": 6,\n" " \"RingBufferFileSize\": 512,\n" @@ -133,17 +127,11 @@ const auto DEFAULT_S3_CONFIG = "{\n" " \"OnlineCheckRetrySeconds\": 60,\n" " \"OrphanedFileRetentionDays\": 15,\n" " \"PreferredDownloadType\": \"fallback\",\n" - " \"ReadAheadCount\": 4,\n" " \"RemoteMount\": {\n" - " \"EnableRemoteMount\": false,\n" - " \"IsRemoteMount\": false,\n" - " \"RemoteClientPoolSize\": 10,\n" - " \"RemoteHostNameOrIp\": \"\",\n" - " \"RemoteMaxConnections\": 20,\n" - " \"RemotePort\": 20100,\n" - " \"RemoteReceiveTimeoutSeconds\": 120,\n" - " \"RemoteSendTimeoutSeconds\": 30,\n" - " \"RemoteToken\": \"\"\n" + " \"Enable\": false,\n" + " \"ClientPoolSize\": 10,\n" + " \"ApiPort\": 20100,\n" + " \"EncryptionToken\": \"\"\n" " },\n" " \"RetryReadCount\": 6,\n" " \"RingBufferFileSize\": 512,\n" @@ -169,7 +157,7 @@ TEST_F(config_test, sia_default_settings) { for (int i = 0; i < 2; i++) { app_config config(provider_type::sia, sia_directory); - config.set_remote_token(""); + config.set_remote_encryption_token(""); config.set_api_auth(""); EXPECT_TRUE(config.set_value_by_name("HostConfig.ApiPassword", "").empty()); json data; @@ -189,7 +177,7 @@ TEST_F(config_test, s3_default_settings) { for (int i = 0; i < 2; i++) { app_config config(provider_type::s3, s3_directory); - config.set_remote_token(""); + config.set_remote_encryption_token(""); config.set_api_auth(""); json data; EXPECT_TRUE(utils::file::read_json_file(config_file, data)); @@ -504,20 +492,6 @@ TEST_F(config_test, orphaned_file_retention_days_maximum_value) { } } -TEST_F(config_test, read_ahead_count) { - std::uint8_t original_value{}; - { - app_config config(provider_type::sia, sia_directory); - original_value = config.get_read_ahead_count(); - config.set_read_ahead_count(original_value + 5); - EXPECT_EQ(original_value + 5, config.get_read_ahead_count()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(original_value + 5, config.get_read_ahead_count()); - } -} - TEST_F(config_test, get_cache_directory) { { app_config config(provider_type::sia, sia_directory); @@ -668,99 +642,102 @@ TEST_F(config_test, enable_remote_mount) { } } -TEST_F(config_test, is_remote_mount) { - bool original_value{}; - { - app_config config(provider_type::sia, sia_directory); - original_value = config.get_is_remote_mount(); - config.set_is_remote_mount(not original_value); - EXPECT_EQ(not original_value, config.get_is_remote_mount()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(not original_value, config.get_is_remote_mount()); - } -} +// TEST_F(config_test, is_remote_mount) { +// bool original_value{}; +// { +// app_config config(provider_type::sia, sia_directory); +// original_value = config.get_is_remote_mount(); +// config.set_is_remote_mount(not original_value); +// EXPECT_EQ(not original_value, config.get_is_remote_mount()); +// } +// { +// app_config config(provider_type::sia, sia_directory); +// EXPECT_EQ(not original_value, config.get_is_remote_mount()); +// } +// } -TEST_F(config_test, enable_remote_mount_fails_if_remote_mount_is_true) { - app_config config(provider_type::sia, sia_directory); - config.set_is_remote_mount(true); - config.set_enable_remote_mount(true); - EXPECT_FALSE(config.get_enable_remote_mount()); - EXPECT_TRUE(config.get_is_remote_mount()); -} +// TEST_F(config_test, enable_remote_mount_fails_if_remote_mount_is_true) { +// app_config config(provider_type::sia, sia_directory); +// config.set_is_remote_mount(true); +// config.set_enable_remote_mount(true); +// EXPECT_FALSE(config.get_enable_remote_mount()); +// EXPECT_TRUE(config.get_is_remote_mount()); +// } -TEST_F(config_test, set_is_remote_mount_fails_if_enable_remote_mount_is_true) { - app_config config(provider_type::sia, sia_directory); - config.set_enable_remote_mount(true); - config.set_is_remote_mount(true); - EXPECT_FALSE(config.get_is_remote_mount()); - EXPECT_TRUE(config.get_enable_remote_mount()); -} +// TEST_F(config_test, set_is_remote_mount_fails_if_enable_remote_mount_is_true) +// { +// app_config config(provider_type::sia, sia_directory); +// config.set_enable_remote_mount(true); +// config.set_is_remote_mount(true); +// EXPECT_FALSE(config.get_is_remote_mount()); +// EXPECT_TRUE(config.get_enable_remote_mount()); +// } -TEST_F(config_test, remote_host_name_or_ip) { - { - app_config config(provider_type::sia, sia_directory); - config.set_remote_host_name_or_ip("my.host.name"); - EXPECT_STREQ("my.host.name", config.get_remote_host_name_or_ip().c_str()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_STREQ("my.host.name", config.get_remote_host_name_or_ip().c_str()); - } -} +// TEST_F(config_test, remote_host_name_or_ip) { +// { +// app_config config(provider_type::sia, sia_directory); +// config.set_remote_host_name_or_ip("my.host.name"); +// EXPECT_STREQ("my.host.name", +// config.get_remote_host_name_or_ip().c_str()); +// } +// { +// app_config config(provider_type::sia, sia_directory); +// EXPECT_STREQ("my.host.name", +// config.get_remote_host_name_or_ip().c_str()); +// } +// } -TEST_F(config_test, remote_port) { +TEST_F(config_test, remote_api_port) { std::uint16_t original_value{}; { app_config config(provider_type::sia, sia_directory); - original_value = config.get_remote_port(); - config.set_remote_port(original_value + 5); - EXPECT_EQ(original_value + 5, config.get_remote_port()); + original_value = config.get_remote_api_port(); + config.set_remote_api_port(original_value + 5); + EXPECT_EQ(original_value + 5, config.get_remote_api_port()); } { app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(original_value + 5, config.get_remote_port()); + EXPECT_EQ(original_value + 5, config.get_remote_api_port()); } } -TEST_F(config_test, remote_receive_timeout_secs) { - std::uint16_t original_value{}; - { - app_config config(provider_type::sia, sia_directory); - original_value = config.get_remote_receive_timeout_secs(); - config.set_remote_receive_timeout_secs(original_value + 5); - EXPECT_EQ(original_value + 5, config.get_remote_receive_timeout_secs()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(original_value + 5, config.get_remote_receive_timeout_secs()); - } -} +// TEST_F(config_test, remote_receive_timeout_secs) { +// std::uint16_t original_value{}; +// { +// app_config config(provider_type::sia, sia_directory); +// original_value = config.get_remote_receive_timeout_secs(); +// config.set_remote_receive_timeout_secs(original_value + 5); +// EXPECT_EQ(original_value + 5, config.get_remote_receive_timeout_secs()); +// } +// { +// app_config config(provider_type::sia, sia_directory); +// EXPECT_EQ(original_value + 5, config.get_remote_receive_timeout_secs()); +// } +// } -TEST_F(config_test, remote_send_timeout_secs) { - std::uint16_t original_value{}; - { - app_config config(provider_type::sia, sia_directory); - original_value = config.get_remote_send_timeout_secs(); - config.set_remote_send_timeout_secs(original_value + 5); - EXPECT_EQ(original_value + 5, config.get_remote_send_timeout_secs()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(original_value + 5, config.get_remote_send_timeout_secs()); - } -} +// TEST_F(config_test, remote_send_timeout_secs) { +// std::uint16_t original_value{}; +// { +// app_config config(provider_type::sia, sia_directory); +// original_value = config.get_remote_send_timeout_secs(); +// config.set_remote_send_timeout_secs(original_value + 5); +// EXPECT_EQ(original_value + 5, config.get_remote_send_timeout_secs()); +// } +// { +// app_config config(provider_type::sia, sia_directory); +// EXPECT_EQ(original_value + 5, config.get_remote_send_timeout_secs()); +// } +// } -TEST_F(config_test, remote_token) { +TEST_F(config_test, remote_encryption_token) { { app_config config(provider_type::sia, sia_directory); - config.set_remote_token("myToken"); - EXPECT_STREQ("myToken", config.get_remote_token().c_str()); + config.set_remote_encryption_token("myToken"); + EXPECT_STREQ("myToken", config.get_remote_encryption_token().c_str()); } { app_config config(provider_type::sia, sia_directory); - EXPECT_STREQ("myToken", config.get_remote_token().c_str()); + EXPECT_STREQ("myToken", config.get_remote_encryption_token().c_str()); } } @@ -790,31 +767,31 @@ TEST_F(config_test, remote_client_pool_size_minimum_value) { } } -TEST_F(config_test, remote_max_connections) { - std::uint8_t original_value{}; - { - app_config config(provider_type::sia, sia_directory); - original_value = config.get_remote_max_connections(); - config.set_remote_max_connections(original_value + 5); - EXPECT_EQ(original_value + 5, config.get_remote_max_connections()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(original_value + 5, config.get_remote_max_connections()); - } -} +// TEST_F(config_test, remote_max_connections) { +// std::uint8_t original_value{}; +// { +// app_config config(provider_type::sia, sia_directory); +// original_value = config.get_remote_max_connections(); +// config.set_remote_max_connections(original_value + 5); +// EXPECT_EQ(original_value + 5, config.get_remote_max_connections()); +// } +// { +// app_config config(provider_type::sia, sia_directory); +// EXPECT_EQ(original_value + 5, config.get_remote_max_connections()); +// } +// } -TEST_F(config_test, remote_max_connections_minimum_value) { - { - app_config config(provider_type::sia, sia_directory); - config.set_remote_max_connections(0); - EXPECT_EQ(1, config.get_remote_max_connections()); - } - { - app_config config(provider_type::sia, sia_directory); - EXPECT_EQ(1, config.get_remote_max_connections()); - } -} +// TEST_F(config_test, remote_max_connections_minimum_value) { +// { +// app_config config(provider_type::sia, sia_directory); +// config.set_remote_max_connections(0); +// EXPECT_EQ(1, config.get_remote_max_connections()); +// } +// { +// app_config config(provider_type::sia, sia_directory); +// EXPECT_EQ(1, config.get_remote_max_connections()); +// } +// } TEST_F(config_test, retry_read_count) { std::uint16_t original_value{};