From: Sage Weil Date: Thu, 23 Sep 2021 15:23:11 +0000 (-0500) Subject: os/bluestore/ZonedAllocator: handle alloc/release spanning zones X-Git-Tag: v17.1.0~535^2~18 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=09c2753175466f22aa236fe2afe84179c9899e02;p=ceph.git os/bluestore/ZonedAllocator: handle alloc/release spanning zones The same txn may allocate the end of one zone and the start of the next. These get combined in an interval_set in bluestore and submitted as one extent to the freelist. Ensure that we spread the allocate (or release) over the appropriate zones. Signed-off-by: Sage Weil --- diff --git a/src/os/bluestore/ZonedFreelistManager.cc b/src/os/bluestore/ZonedFreelistManager.cc index 092e8d540aa90..8f7f05ab425e4 100644 --- a/src/os/bluestore/ZonedFreelistManager.cc +++ b/src/os/bluestore/ZonedFreelistManager.cc @@ -236,12 +236,17 @@ void ZonedFreelistManager::allocate( uint64_t length, KeyValueDB::Transaction txn) { - uint64_t zone_num = offset / zone_size; - dout(10) << __func__ << " 0x" << std::hex << offset << "~" << length - << " zone 0x" << zone_num << std::dec << dendl; - zone_state_t zone_state; - zone_state.increment_write_pointer(length); - write_zone_state_to_db(zone_num, zone_state, txn); + while (length > 0) { + uint64_t zone_num = offset / zone_size; + uint64_t this_len = std::min(length, zone_size - offset % zone_size); + dout(10) << __func__ << " 0x" << std::hex << offset << "~" << this_len + << " zone 0x" << zone_num << std::dec << dendl; + zone_state_t zone_state; + zone_state.increment_write_pointer(this_len); + write_zone_state_to_db(zone_num, zone_state, txn); + offset += this_len; + length -= this_len; + } } // Increments the number of dead bytes in a zone and writes the updated value to @@ -255,12 +260,17 @@ void ZonedFreelistManager::release( uint64_t length, KeyValueDB::Transaction txn) { - uint64_t zone_num = offset / zone_size; - dout(10) << __func__ << " 0x" << std::hex << offset << "~" << length - << " zone 0x" << zone_num << std::dec << dendl; - zone_state_t zone_state; - zone_state.increment_num_dead_bytes(length); - write_zone_state_to_db(zone_num, zone_state, txn); + while (length > 0) { + uint64_t zone_num = offset / zone_size; + uint64_t this_len = std::min(length, zone_size - offset % zone_size); + dout(10) << __func__ << " 0x" << std::hex << offset << "~" << this_len + << " zone 0x" << zone_num << std::dec << dendl; + zone_state_t zone_state; + zone_state.increment_num_dead_bytes(this_len); + write_zone_state_to_db(zone_num, zone_state, txn); + length -= this_len; + offset += this_len; + } } void ZonedFreelistManager::get_meta(