diff --git a/conanfile.py b/conanfile.py index 50286ff..1465e1b 100644 --- a/conanfile.py +++ b/conanfile.py @@ -9,7 +9,7 @@ class HomeObjectConan(ConanFile): name = "homeobject" - version = "2.2.3" + version = "2.2.4" homepage = "https://github.com/eBay/HomeObject" description = "Blob Store built on HomeReplication" @@ -49,7 +49,7 @@ def build_requirements(self): def requirements(self): self.requires("sisl/[^12.2]@oss/master", transitive_headers=True) - self.requires("homestore/[^6.6]@oss/master") + self.requires("homestore/[>=6.6.18]@oss/master") self.requires("iomgr/[^11.3]@oss/master") self.requires("lz4/1.9.4", override=True) self.requires("openssl/3.3.1", override=True) diff --git a/src/lib/homestore_backend/hs_homeobject.hpp b/src/lib/homestore_backend/hs_homeobject.hpp index 5cfe9e9..513fc36 100644 --- a/src/lib/homestore_backend/hs_homeobject.hpp +++ b/src/lib/homestore_backend/hs_homeobject.hpp @@ -629,6 +629,13 @@ class HSHomeObject : public HomeObjectImpl { */ void destroy_shards(pg_id_t pg_id); + /** + * @brief Cleans up resources associated with the PG identified by pg_id on HomeStore side. + * + * @param pg_id The ID of the PG to be + */ + void destroy_hs_resources(pg_id_t pg_id); + /** * @brief destroy index table for the PG located using a pg_id. * diff --git a/src/lib/homestore_backend/hs_pg_manager.cpp b/src/lib/homestore_backend/hs_pg_manager.cpp index ff0cab6..a79e908 100644 --- a/src/lib/homestore_backend/hs_pg_manager.cpp +++ b/src/lib/homestore_backend/hs_pg_manager.cpp @@ -316,7 +316,7 @@ std::optional< pg_id_t > HSHomeObject::get_pg_id_with_group_id(homestore::group_ void HSHomeObject::pg_destroy(pg_id_t pg_id) { mark_pg_destroyed(pg_id); destroy_shards(pg_id); - chunk_selector_->reset_pg_chunks(pg_id); + destroy_hs_resources(pg_id); destroy_pg_index_table(pg_id); destroy_pg_superblk(pg_id); @@ -340,6 +340,28 @@ void HSHomeObject::mark_pg_destroyed(pg_id_t pg_id) { hs_pg->pg_sb_.write(); } +void HSHomeObject::destroy_hs_resources(pg_id_t pg_id) { + // Step 1: purge on repl dev + auto lg = std::scoped_lock(_pg_lock); + auto iter = _pg_map.find(pg_id); + if (iter == _pg_map.end()) { + LOGW("destroy repl dev with unknown pg_id {}", pg_id); + return; + } + + auto& pg = iter->second; + auto group_id = pg->pg_info_.replica_set_uuid; + auto v = hs_repl_service().get_repl_dev(group_id); + if (v.hasError()) { + LOGW("get repl dev for group_id={} has failed", boost::uuids::to_string(group_id)); + return; + } + v.value()->purge(); + + // Step 2: reset pg chunks + chunk_selector_->reset_pg_chunks(pg_id); +} + void HSHomeObject::destroy_pg_index_table(pg_id_t pg_id) { auto lg = std::scoped_lock(_pg_lock); auto iter = _pg_map.find(pg_id);