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;
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;
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);
}
// 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
//
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
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,