From: Abutalib Aghayev Date: Tue, 22 Jun 2021 17:58:00 +0000 (-0400) Subject: os/bluestore: Add a method to ZonedFreelistManager retrieve the set of zones X-Git-Tag: v17.1.0~1525^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=95d672ae0e29133951e607cf15df0a2db709ce22;p=ceph.git os/bluestore: Add a method to ZonedFreelistManager retrieve the set of zones recorded as being cleaned in the database. Signed-off-by: Abutalib Aghayev --- diff --git a/src/os/bluestore/ZonedFreelistManager.cc b/src/os/bluestore/ZonedFreelistManager.cc index 77ea5dfdd3c1..3b31e202fae6 100644 --- a/src/os/bluestore/ZonedFreelistManager.cc +++ b/src/os/bluestore/ZonedFreelistManager.cc @@ -314,6 +314,16 @@ int ZonedFreelistManager::_read_cfg(cfg_reader_t cfg_reader) { return 0; } +std::set ZonedFreelistManager::get_cleaning_in_progress_zones( + KeyValueDB *kvdb) const { + bufferlist bl; + std::set zones_to_clean; + if (kvdb->get(meta_prefix, CLEANING_IN_PROGRESS_KEY, &bl) == 0) { + decode(zones_to_clean, bl); + } + return zones_to_clean; +} + void ZonedFreelistManager::mark_zones_to_clean_free( const std::set& zones_to_clean, KeyValueDB *kvdb) { dout(10) << __func__ << dendl; @@ -325,14 +335,14 @@ void ZonedFreelistManager::mark_zones_to_clean_free( zone_state_t zone_state; write_zone_state_to_db(zone_num, zone_state, txn); } - txn->rmkey(meta_prefix, "cleaning_in_progress_zones"); + txn->rmkey(meta_prefix, CLEANING_IN_PROGRESS_KEY); kvdb->submit_transaction_sync(txn); } // Marks the zones currently being cleaned in the db. Should be called before // starting the cleaning. If we crash mid-cleaning, the recovery code will check -// if there is a key "cleaning_in_progress_zones" in the meta_prefix namespace, -// and if so, will read the zones and resume cleaning. +// if there is a key CLEANING_IN_PROGRESS_KEY in the meta_prefix namespace, and +// if so, will read the zones and resume cleaning. void ZonedFreelistManager::mark_zones_to_clean_in_progress( const std::set& zones_to_clean, KeyValueDB *kvdb) { dout(10) << __func__ << dendl; @@ -341,6 +351,6 @@ void ZonedFreelistManager::mark_zones_to_clean_in_progress( encode(zones_to_clean, bl); KeyValueDB::Transaction txn = kvdb->get_transaction(); - txn->set(meta_prefix, "cleaning_in_progress_zones", bl); + txn->set(meta_prefix, CLEANING_IN_PROGRESS_KEY, bl); kvdb->submit_transaction_sync(txn); } diff --git a/src/os/bluestore/ZonedFreelistManager.h b/src/os/bluestore/ZonedFreelistManager.h index a74a06a00f26..14ea9e39e76b 100644 --- a/src/os/bluestore/ZonedFreelistManager.h +++ b/src/os/bluestore/ZonedFreelistManager.h @@ -2,9 +2,7 @@ // vim: ts=8 sw=2 smarttab // -// A freelist manager for zoned devices. This iteration just keeps the write -// pointer per zone. Following iterations will add enough information to enable -// cleaning of zones. +// A freelist manager for zoned devices. // // Copyright (C) 2020 Abutalib Aghayev // @@ -24,6 +22,8 @@ using cfg_reader_t = std::function; +const string CLEANING_IN_PROGRESS_KEY = "cleaning_in_progress"; + class ZonedFreelistManager : public FreelistManager { std::string meta_prefix; ///< device size, zone size, etc. std::string info_prefix; ///< per zone write pointer, dead bytes @@ -102,6 +102,7 @@ public: std::vector>*) const override; std::vector get_zone_states(KeyValueDB *kvdb) const; + std::set get_cleaning_in_progress_zones(KeyValueDB *kvdb) const; void mark_zones_to_clean_free(const std::set& zones_to_clean, KeyValueDB *kvdb); void mark_zones_to_clean_in_progress(const std::set& zones_to_clean,