]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Add a method to ZonedFreelistManager retrieve the set of zones
authorAbutalib Aghayev <agayev@psu.edu>
Tue, 22 Jun 2021 17:58:00 +0000 (13:58 -0400)
committerAbutalib Aghayev <agayev@psu.edu>
Tue, 22 Jun 2021 17:58:00 +0000 (13:58 -0400)
recorded as being cleaned in the database.

Signed-off-by: Abutalib Aghayev <agayev@psu.edu>
src/os/bluestore/ZonedFreelistManager.cc
src/os/bluestore/ZonedFreelistManager.h

index 77ea5dfdd3c1df154f06eb65c0d5408f3ba1ec13..3b31e202fae689a1215d2c19a44213d87323bb7b 100644 (file)
@@ -314,6 +314,16 @@ int ZonedFreelistManager::_read_cfg(cfg_reader_t cfg_reader) {
   return 0;
 }
 
+std::set<uint64_t> ZonedFreelistManager::get_cleaning_in_progress_zones(
+    KeyValueDB *kvdb) const {
+  bufferlist bl;
+  std::set<uint64_t> 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<uint64_t>& 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<uint64_t>& 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);
 }
index a74a06a00f26fc0add73d1c7fe263e849b447851..14ea9e39e76b861d4732999359fc78413dd52bf6 100644 (file)
@@ -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<int(const std::string&, std::string*)>;
 
+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<std::pair<string, string>>*) const override;
 
   std::vector<zone_state_t> get_zone_states(KeyValueDB *kvdb) const;
+  std::set<uint64_t> get_cleaning_in_progress_zones(KeyValueDB *kvdb) const;
   void mark_zones_to_clean_free(const std::set<uint64_t>& zones_to_clean, 
                                KeyValueDB *kvdb);
   void mark_zones_to_clean_in_progress(const std::set<uint64_t>& zones_to_clean,