diff --git a/include/providers/base_provider.hpp b/include/providers/base_provider.hpp index e1b2dc85..feeb17c7 100644 --- a/include/providers/base_provider.hpp +++ b/include/providers/base_provider.hpp @@ -95,6 +95,9 @@ protected: return fm_; } + [[nodiscard]] virtual auto get_used_drive_space_impl() const + -> std::uint64_t = 0; + [[nodiscard]] virtual auto remove_directory_impl(const std::string &api_path) -> api_error = 0; @@ -159,6 +162,8 @@ public: [[nodiscard]] auto get_total_item_count() const -> std::uint64_t override; + [[nodiscard]] auto get_used_drive_space() const -> std::uint64_t override; + [[nodiscard]] auto is_file_writeable(const std::string &api_path) const -> bool override; diff --git a/include/providers/s3/s3_provider.hpp b/include/providers/s3/s3_provider.hpp index f8c1a8fe..fa6f0f8d 100644 --- a/include/providers/s3/s3_provider.hpp +++ b/include/providers/s3/s3_provider.hpp @@ -80,6 +80,9 @@ protected: directory_item_list &list) const -> api_error override; + [[nodiscard]] auto get_used_drive_space_impl() const + -> std::uint64_t override; + [[nodiscard]] auto remove_directory_impl(const std::string &api_path) -> api_error override; @@ -107,8 +110,6 @@ public: return provider_type::s3; } - [[nodiscard]] auto get_used_drive_space() const -> std::uint64_t override; - [[nodiscard]] auto is_direct_only() const -> bool override { return false; } [[nodiscard]] auto is_directory(const std::string &api_path, diff --git a/include/providers/sia/sia_provider.hpp b/include/providers/sia/sia_provider.hpp index 6e6349eb..4a533e10 100644 --- a/include/providers/sia/sia_provider.hpp +++ b/include/providers/sia/sia_provider.hpp @@ -58,6 +58,9 @@ protected: directory_item_list &list) const -> api_error override; + [[nodiscard]] auto get_used_drive_space_impl() const + -> std::uint64_t override; + [[nodiscard]] auto remove_directory_impl(const std::string &api_path) -> api_error override; @@ -85,8 +88,6 @@ public: [[nodiscard]] auto get_total_drive_space() const -> std::uint64_t override; - [[nodiscard]] auto get_used_drive_space() const -> std::uint64_t override; - [[nodiscard]] auto is_direct_only() const -> bool override { return false; } [[nodiscard]] auto is_directory(const std::string &api_path, diff --git a/src/providers/base_provider.cpp b/src/providers/base_provider.cpp index 50c3e5e4..49021f2c 100644 --- a/src/providers/base_provider.cpp +++ b/src/providers/base_provider.cpp @@ -460,6 +460,19 @@ auto base_provider::get_total_item_count() const -> std::uint64_t { return ret; } +auto base_provider::get_used_drive_space() const -> std::uint64_t { + try { + auto used_space = get_used_drive_space_impl(); + get_file_mgr()->update_used_space(used_space); + return used_space; + } catch (const std::exception &ex) { + utils::error::raise_error(__FUNCTION__, ex, + "failed to get used drive space"); + } + + return 0U; +} + auto base_provider::is_file_writeable(const std::string &api_path) const -> bool { bool exists{}; diff --git a/src/providers/s3/s3_provider.cpp b/src/providers/s3/s3_provider.cpp index 2ec62be5..a39d04a8 100644 --- a/src/providers/s3/s3_provider.cpp +++ b/src/providers/s3/s3_provider.cpp @@ -539,7 +539,7 @@ auto s3_provider::get_total_drive_space() const -> std::uint64_t { return std::numeric_limits::max() / std::int64_t(2); } -auto s3_provider::get_used_drive_space() const -> std::uint64_t { +auto s3_provider::get_used_drive_space_impl() const -> std::uint64_t { std::string response_data; long response_code{}; if (not get_object_list(response_data, response_code)) { diff --git a/src/providers/sia/sia_provider.cpp b/src/providers/sia/sia_provider.cpp index cd3630c8..50686f73 100644 --- a/src/providers/sia/sia_provider.cpp +++ b/src/providers/sia/sia_provider.cpp @@ -351,42 +351,32 @@ auto sia_provider::get_total_drive_space() const -> std::uint64_t { return 0U; } -auto sia_provider::get_used_drive_space() const -> std::uint64_t { - // TODO adjust size based on open files - try { - curl::requests::http_get get{}; - get.allow_timeout = true; - get.path = "/api/bus/stats/objects"; +auto sia_provider::get_used_drive_space_impl() const -> std::uint64_t { + curl::requests::http_get get{}; + get.allow_timeout = true; + get.path = "/api/bus/stats/objects"; - json object_data{}; - get.response_handler = [&object_data](const data_buffer &data, - long response_code) { - if (response_code == http_error_codes::ok) { - object_data = nlohmann::json::parse(data.begin(), data.end()); - } - }; - - long response_code{}; - stop_type stop_requested{}; - if (not get_comm().make_request(get, response_code, stop_requested)) { - return 0U; + json object_data{}; + get.response_handler = [&object_data](const data_buffer &data, + long response_code) { + if (response_code == http_error_codes::ok) { + object_data = nlohmann::json::parse(data.begin(), data.end()); } + }; - if (response_code != http_error_codes::ok) { - utils::error::raise_error(__FUNCTION__, response_code, - "failed to get used drive space"); - return 0U; - } - - auto used_space = object_data["totalObjectsSize"].get(); - get_file_mgr()->update_used_space(used_space); - return used_space; - } catch (const std::exception &ex) { - utils::error::raise_error(__FUNCTION__, ex, - "failed to get used drive space"); + long response_code{}; + stop_type stop_requested{}; + if (not get_comm().make_request(get, response_code, stop_requested)) { + return 0U; } - return 0U; + if (response_code != http_error_codes::ok) { + utils::error::raise_error(__FUNCTION__, response_code, + "failed to get used drive space"); + return 0U; + } + + return object_data["totalObjectsSize"].get(); } auto sia_provider::is_directory(const std::string &api_path, bool &exists) const