using clean_space_ret = clean_space_ertr::future<>;
virtual clean_space_ret clean_space() = 0;
+ virtual const std::set<device_id_t>& get_device_ids() const = 0;
+
// test only
virtual bool check_usage() = 0;
clean_space_ret clean_space() final;
+ const std::set<device_id_t>& get_device_ids() const final {
+ return sm_group->get_device_ids();
+ }
+
// Testing interfaces
bool check_usage() final;
clean_space_ret clean_space() final;
+ const std::set<device_id_t>& get_device_ids() const final {
+ return rb_group->get_device_ids();
+ }
+
RandomBlockManager* get_rbm(paddr_t paddr) {
auto rbs = rb_group->get_rb_managers();
for (auto p : rbs) {
if (_cold_cleaner) {
cold_cleaner = std::move(_cold_cleaner);
cold_cleaner->set_background_callback(this);
+
+ cleaners_by_device_id.resize(DEVICE_ID_MAX, nullptr);
+ for (auto id : main_cleaner->get_device_ids()) {
+ cleaners_by_device_id[id] = main_cleaner.get();
+ }
+ for (auto id : cold_cleaner->get_device_ids()) {
+ cleaners_by_device_id[id] = cold_cleaner.get();
+ }
}
}
if (state < state_t::SCAN_SPACE) {
return;
}
- assert(main_cleaner);
- main_cleaner->mark_space_used(addr, len);
+
+ if (!has_cold_tier()) {
+ assert(main_cleaner);
+ main_cleaner->mark_space_used(addr, len);
+ } else {
+ auto id = addr.get_device_id();
+ assert(id < cleaners_by_device_id.size());
+ auto cleaner = cleaners_by_device_id[id];
+ assert(cleaner);
+ cleaner->mark_space_used(addr, len);
+ }
}
void mark_space_free(paddr_t addr, extent_len_t len) {
if (state < state_t::SCAN_SPACE) {
return;
}
- assert(main_cleaner);
- main_cleaner->mark_space_free(addr, len);
+
+ if (!has_cold_tier()) {
+ assert(main_cleaner);
+ main_cleaner->mark_space_free(addr, len);
+ } else {
+ auto id = addr.get_device_id();
+ assert(id < cleaners_by_device_id.size());
+ auto cleaner = cleaners_by_device_id[id];
+ assert(cleaner);
+ cleaner->mark_space_free(addr, len);
+ }
}
void commit_space_used(paddr_t addr, extent_len_t len) {
if (state < state_t::SCAN_SPACE) {
return;
}
- assert(main_cleaner);
- return main_cleaner->commit_space_used(addr, len);
+
+ if (!has_cold_tier()) {
+ assert(main_cleaner);
+ main_cleaner->commit_space_used(addr, len);
+ } else {
+ auto id = addr.get_device_id();
+ assert(id < cleaners_by_device_id.size());
+ auto cleaner = cleaners_by_device_id[id];
+ assert(cleaner);
+ cleaner->commit_space_used(addr, len);
+ }
}
seastar::future<> reserve_projected_usage(io_usage_t usage);
* cold tier (optional, see has_cold_tier())
*/
AsyncCleanerRef cold_cleaner;
+ std::vector<AsyncCleaner*> cleaners_by_device_id;
std::optional<seastar::future<>> process_join;
std::optional<seastar::promise<>> blocking_background;