]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/ZonedAllocator: fix allocate() search
authorSage Weil <sage@newdream.net>
Mon, 18 Oct 2021 17:30:29 +0000 (12:30 -0500)
committerSage Weil <sage@newdream.net>
Fri, 29 Oct 2021 13:56:42 +0000 (09:56 -0400)
Signed-off-by: Sage Weil <sage@newdream.net>
src/os/bluestore/ZonedAllocator.cc
src/os/bluestore/ZonedAllocator.h

index 71ca51fe30c6001d2ae32fbae8f8649e717b2833..0a535e361ce7891a031c3eea2dba1fdba6330a3b 100644 (file)
@@ -66,11 +66,12 @@ int64_t ZonedAllocator::allocate(
   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 left = num_zones - first_seq_zone_num;
   uint64_t zone_num = starting_zone_num;
-  for ( ; zone_num < num_zones; ++zone_num) {
+  for ( ; left > 0; ++zone_num, --left) {
+    if (zone_num == num_zones) {
+      zone_num = first_seq_zone_num;
+    }
     if (zone_num == cleaning_zone) {
       ldout(cct, 10) << " skipping zone 0x" << std::hex << zone_num
                     << " because we are cleaning it" << std::dec << dendl;
@@ -88,7 +89,7 @@ int64_t ZonedAllocator::allocate(
     break;
   }
 
-  if (zone_num == num_zones) {
+  if (left == 0) {
     ldout(cct, 10) << " failed to allocate" << dendl;
     return -ENOSPC;
   }
@@ -160,8 +161,6 @@ void ZonedAllocator::init_from_zone_pointers(
   for (size_t i = first_seq_zone_num; i < num_zones; ++i) {
     num_sequential_free += zone_size - (zone_states[i].write_pointer % zone_size);
   }
-  uint64_t conventional_size = first_seq_zone_num * zone_size;
-  uint64_t sequential_size = size - conventional_size;
   ldout(cct, 10) << "free 0x" << std::hex << num_sequential_free
                 << " / 0x" << sequential_size << std::dec
                 << dendl;
index 9de9c8440bf4c6509798e67e62fd0753a7120422..685af9228fb14f688aeab6b9cd1e9f6b1d273162 100644 (file)
@@ -81,6 +81,7 @@ public:
     return zone_states[zone].num_dead_bytes;
   }
   uint64_t get_live_bytes(uint32_t zone) {
+    std::scoped_lock l(lock);
     return zone_states[zone].write_pointer - zone_states[zone].num_dead_bytes;
   }