dout(20) << __func__ << " wake" << dendl;
} else {
l.unlock();
+ a->set_cleaning_zone(zone_to_clean);
_zoned_clean_zone(zone_to_clean);
- bdev->reset_zone(zone_to_clean);
- f->mark_zone_to_clean_free(zone_to_clean, db);
- //a->mark_zone_to_clean_free();
+ a->clear_cleaning_zone(zone_to_clean);
l.lock();
}
}
ldout(cct, 10) << " trying to allocate 0x"
<< std::hex << want_size << std::dec << dendl;
+ // FIXME: start search at last zone we successfully allocated from, so we
+ // avoid re-checking full zones so much
+
uint64_t zone_num = starting_zone_num;
for ( ; zone_num < num_zones; ++zone_num) {
- if (fits(want_size, zone_num)) {
- break;
+ if (zone_num == cleaning_zone) {
+ ldout(cct, 10) << " skipping zone 0x" << std::hex << zone_num
+ << " because we are cleaning it" << std::dec << dendl;
+ continue;
+ }
+ if (!fits(want_size, zone_num)) {
+ ldout(cct, 10) << " skipping zone 0x" << std::hex << zone_num
+ << " because there is not enough space: "
+ << " want_size = 0x" << want_size
+ << " available = 0x" << get_remaining_space(zone_num)
+ << std::dec
+ << dendl;
+ continue;
}
- ldout(cct, 10) << " skipping zone 0x" << std::hex << zone_num
- << " because there is not enough space: "
- << " want_size = 0x" << want_size
- << " available = 0x" << get_remaining_space(zone_num)
- << std::dec
- << dendl;
+ break;
}
if (zone_num == num_zones) {
uint64_t first_seq_zone_num;
uint64_t starting_zone_num;
uint64_t num_zones;
+ std::atomic<uint32_t> cleaning_zone = -1;
std::vector<zone_state_t> zone_states;
inline uint64_t get_offset(uint64_t zone_num) const {
uint64_t length)> notify) override;
int64_t pick_zone_to_clean(void);
+ void set_cleaning_zone(uint32_t zone) {
+ cleaning_zone = zone;
+ }
+ void clear_cleaning_zone(uint32_t zone) {
+ cleaning_zone = -1;
+ }
void init_from_zone_pointers(
std::vector<zone_state_t> _zone_states);