]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/ZonedAllocator: handle alloc/release spanning zones
authorSage Weil <sage@newdream.net>
Thu, 23 Sep 2021 15:23:11 +0000 (10:23 -0500)
committerSage Weil <sage@newdream.net>
Fri, 29 Oct 2021 13:56:42 +0000 (09:56 -0400)
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 <sage@newdream.net>
src/os/bluestore/ZonedFreelistManager.cc

index 092e8d540aa907ffcb27c3cc296ced04328dfe89..8f7f05ab425e4ac26698fbb32e25af1591d0152f 100644 (file)
@@ -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(