]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: add release(PExtentVector) helper to Allocator class to
authorIgor Fedotov <ifedotov@suse.com>
Mon, 7 May 2018 13:58:43 +0000 (16:58 +0300)
committerIgor Fedotov <ifedotov@suse.com>
Thu, 14 Mar 2019 17:36:59 +0000 (20:36 +0300)
free PExtentVector explicitly.

Signed-off-by: Igor Fedotov <ifedotov@suse.com>
(cherry picked from commit 328ea72a84edef4a6c4e0558dff52d0e85f05122)

src/os/bluestore/Allocator.cc
src/os/bluestore/Allocator.h
src/os/bluestore/BitMapAllocator.cc
src/os/bluestore/BlueFS.cc

index 8a4101eae2d817859debb0137ac1623cfd3fbe4e..059e088e1822b672ed0a8a1b3854e30af1258c87 100644 (file)
@@ -20,3 +20,12 @@ Allocator *Allocator::create(CephContext* cct, string type,
             << type << dendl;
   return nullptr;
 }
+
+void Allocator::release(const PExtentVector& release_vec)
+{
+  interval_set<uint64_t> release_set;
+  for (auto e : release_vec) {
+    release_set.insert(e.offset, e.length);
+  }
+  release(release_set);
+}
index 46a0a4ac4c9132389eefa7373b85a44f87663c70..ddf194f91483c5bfac08a92c2ed93cccfa71fb2c 100644 (file)
@@ -43,6 +43,7 @@ public:
   /* Bulk release. Implementations may override this method to handle the whole
    * set at once. This could save e.g. unnecessary mutex dance. */
   virtual void release(const interval_set<uint64_t>& release_set) = 0;
+  void release(const PExtentVector& release_set);
 
   virtual void dump() = 0;
 
index 9c7e9751674d049c4ac0bc54fb42e2b430383d36..823992216f3a952afa0c40686c1f23891e8c4112 100644 (file)
@@ -90,7 +90,19 @@ int64_t BitMapAllocator::allocate(
 
   assert(!max_alloc_size || max_alloc_size >= alloc_unit);
 
-  //FIXME: reproduce reserve/unreserve
+  {
+    int nblks = want_size / m_block_size; // apply floor
+    assert(!(want_size % m_block_size));
+    dout(10) << __func__ << " instance " << (uint64_t) this
+           << " num_used " << m_bit_alloc->get_used_blocks()
+           << " total " << m_bit_alloc->total_blocks()
+           << dendl;
+
+    if (!m_bit_alloc->reserve_blocks(nblks)) {
+      return -ENOSPC;
+    }
+  }
+
 
   dout(10) << __func__ <<" instance "<< (uint64_t) this
      << " want_size " << want_size
@@ -98,8 +110,23 @@ int64_t BitMapAllocator::allocate(
      << " hint " << hint
      << dendl;
   hint = hint % m_total_size; // make hint error-tolerant
-  return allocate_dis(want_size, alloc_unit / m_block_size,
+  auto res = allocate_dis(want_size, alloc_unit / m_block_size,
                       max_alloc_size, hint / m_block_size, extents);
+
+  if (res < want_size) {
+    auto unused = want_size - res;
+    int nblks = unused / m_block_size;
+    assert(!(unused % m_block_size));
+
+    dout(10) << __func__ << " instance " << (uint64_t) this
+            << " unused " << nblks
+            << " num used " << m_bit_alloc->get_used_blocks()
+            << " total " << m_bit_alloc->total_blocks()
+            << dendl;
+
+    m_bit_alloc->unreserve_blocks(nblks);
+  }
+  return res;
 }
 
 int64_t BitMapAllocator::allocate_dis(
index cb4dc11f02450326f28c7e750367de0e86ddfbf2..916138351a7695da0805834677d5cd6727457237 100644 (file)
@@ -1872,11 +1872,7 @@ int BlueFS::_allocate(uint8_t id, uint64_t len,
   }
   if (alloc_len < (int64_t)left) {
     if (alloc_len != 0) {
-      interval_set<uint64_t> to_release;
-      for (auto& p : extents) {
-        to_release.insert(p.offset, p.length);
-      }
-      alloc[id]->release(to_release);
+      alloc[id]->release(extents);
     }
     if (id != BDEV_SLOW) {
       if (bdev[id]) {