From 821f8970e2daabfb1c81331c5fa88d08e76d2d32 Mon Sep 17 00:00:00 2001 From: shosseinimotlagh Date: Mon, 8 Jan 2024 09:14:04 -0800 Subject: [PATCH] SDSTOR-12187 : PartitionUtilization Endpoint Expose volume used size divided by AM total size --- conanfile.py | 2 +- src/api/vol_interface.hpp | 1 + src/homeblks/home_blks.cpp | 5 +++++ src/homeblks/home_blks.hpp | 1 + src/homeblks/homeblks_http_server.cpp | 21 +++++++++++++++++++++ src/homeblks/homeblks_http_server.hpp | 1 + 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/conanfile.py b/conanfile.py index b54c1c458..fd14f01ef 100644 --- a/conanfile.py +++ b/conanfile.py @@ -2,7 +2,7 @@ class HomestoreConan(ConanFile): name = "homestore" - version = "3.6.12" + version = "3.6.13" homepage = "https://github.corp.ebay.com/SDS/homestore" description = "HomeStore" diff --git a/src/api/vol_interface.hpp b/src/api/vol_interface.hpp index a9278f797..d406abe36 100644 --- a/src/api/vol_interface.hpp +++ b/src/api/vol_interface.hpp @@ -316,6 +316,7 @@ class VolInterface { virtual const char* get_name(const VolumePtr& vol) = 0; virtual uint64_t get_size(const VolumePtr& vol) = 0; + virtual uint64_t get_used_size(const VolumePtr& vol) = 0; virtual uint64_t get_page_size(const VolumePtr& vol) = 0; virtual boost::uuids::uuid get_uuid(std::shared_ptr< Volume > vol) = 0; virtual sisl::blob at_offset(const boost::intrusive_ptr< BlkBuffer >& buf, uint32_t offset) = 0; diff --git a/src/homeblks/home_blks.cpp b/src/homeblks/home_blks.cpp index f2422d69e..821590f5c 100644 --- a/src/homeblks/home_blks.cpp +++ b/src/homeblks/home_blks.cpp @@ -634,6 +634,11 @@ bool HomeBlks::verify_index_bm() { return true; } +uint64_t HomeBlks::get_used_size(const VolumePtr& vol) { + /* Update per volume status */ + return vol->get_used_size().used_total_size; +} + sisl::status_response HomeBlks::get_status(const sisl::status_request& request) { sisl::status_response response; /* Update per volume status */ diff --git a/src/homeblks/home_blks.hpp b/src/homeblks/home_blks.hpp index 9a82b93e7..66e1cb865 100644 --- a/src/homeblks/home_blks.hpp +++ b/src/homeblks/home_blks.hpp @@ -232,6 +232,7 @@ class HomeBlks : public VolInterface, public HomeStore< BLKSTORE_BUFFER_TYPE > { virtual const char* get_name(const VolumePtr& vol) override; virtual uint64_t get_page_size(const VolumePtr& vol) override; virtual uint64_t get_size(const VolumePtr& vol) override; + virtual uint64_t get_used_size(const VolumePtr& vol) override; virtual boost::uuids::uuid get_uuid(VolumePtr vol) override; virtual sisl::blob at_offset(const blk_buf_t& buf, uint32_t offset) override; diff --git a/src/homeblks/homeblks_http_server.cpp b/src/homeblks/homeblks_http_server.cpp index 6e7e15e75..cd0745b23 100644 --- a/src/homeblks/homeblks_http_server.cpp +++ b/src/homeblks/homeblks_http_server.cpp @@ -75,6 +75,8 @@ void HomeBlksHttpServer::setup_routes() { iomgr::url_t::localhost); http_server_ptr->setup_route(Http::Method::Get, "/api/v1/getStatus", Routes::bind(&HomeBlksHttpServer::get_status, this)); + http_server_ptr->setup_route(Http::Method::Get, "/api/v1/utilization/:volumeUUID", + Routes::bind(&HomeBlksHttpServer::get_utilization, this)); http_server_ptr->setup_route(Http::Method::Get, "/api/v1/verifyBitmap", Routes::bind(&HomeBlksHttpServer::verify_bitmap, this), iomgr::url_t::localhost); http_server_ptr->setup_route(Http::Method::Get, "/api/v1/dumpDiskMetaBlks", @@ -151,7 +153,26 @@ void HomeBlksHttpServer::set_log_level(const Pistache::Rest::Request& request, response.send(Pistache::Http::Code::Ok, resp); } +void HomeBlksHttpServer::get_utilization(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response) +{ + const std::string vol_uuid{request.param(":volumeUUID").as()}; + if (vol_uuid.length() == 0) { + response.send(Pistache::Http::Code::Bad_Request, "empty vol_uuid!"); + return; + } + boost::uuids::string_generator gen; + boost::uuids::uuid uuid = gen(vol_uuid); + const auto vol = VolInterface::get_instance()->lookup_volume(uuid); + if (!vol) { + response.send(Pistache::Http::Code::Bad_Request, "vol not found!"); + return; + } + const auto total_data_size = VolInterface::get_instance()->get_system_capacity().initial_total_data_meta_size; + const auto vol_used = VolInterface::get_instance()->get_used_size(vol); + auto resp = std::to_string(static_cast (vol_used) / total_data_size); + response.send(Pistache::Http::Code::Ok, resp); +} void HomeBlksHttpServer::get_log_level(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response) { std::string logmodule; diff --git a/src/homeblks/homeblks_http_server.hpp b/src/homeblks/homeblks_http_server.hpp index cf25de5f7..5701bb682 100644 --- a/src/homeblks/homeblks_http_server.hpp +++ b/src/homeblks/homeblks_http_server.hpp @@ -51,6 +51,7 @@ class HomeBlksHttpServer { void verify_metablk_store(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response); void wakeup_init(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response); void copy_vol(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response); + void get_utilization(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response); #ifdef _PRERELEASE void set_safe_mode(const Pistache::Rest::Request& request, Pistache::Http::ResponseWriter response);