]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: extend the Allocator interface with bulk releases.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 5 Sep 2017 10:55:34 +0000 (12:55 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 29 Sep 2017 15:09:29 +0000 (17:09 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/os/bluestore/Allocator.h
src/os/bluestore/BlueStore.cc

index a93428d9c1b8655d5ff257d34756dc0e4e42205a..62850c4fa602d4d00b0dbc41736c4bb19ee28db4 100644 (file)
@@ -46,6 +46,18 @@ public:
   virtual void release(
     uint64_t offset, uint64_t length) = 0;
 
+  /* 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) {
+    /* TODO(rzarzynski): make this pure virtual and eradicate the single-op
+     * release() after switching all allocators. */
+    for (interval_set<uint64_t>::const_iterator p = release_set.begin();
+        p != release_set.end();
+        ++p) {
+      release(p.get_start(), p.get_len());
+    }
+  }
+
   virtual void dump() = 0;
 
   virtual void init_add_free(uint64_t offset, uint64_t length) = 0;
index 852c6ba14e3150c70aab6a412650cf15bb07e3b3..2ead998e6b7011c42a377a6f9fc7e10973e9776f 100644 (file)
@@ -8201,11 +8201,7 @@ void BlueStore::_txc_release_alloc(TransContext *txc)
   // update allocator with full released set
   if (!cct->_conf->bluestore_debug_no_reuse_blocks) {
     dout(10) << __func__ << " " << txc << " " << txc->released << dendl;
-    for (interval_set<uint64_t>::iterator p = txc->released.begin();
-        p != txc->released.end();
-        ++p) {
-      alloc->release(p.get_start(), p.get_len());
-    }
+    alloc->release(txc->released);
   }
 
   txc->allocated.clear();
@@ -8564,14 +8560,9 @@ void BlueStore::_kv_sync_thread()
        if (!bluefs_gift_extents.empty()) {
          _commit_bluefs_freespace(bluefs_gift_extents);
        }
-       for (auto p = bluefs_extents_reclaiming.begin();
-            p != bluefs_extents_reclaiming.end();
-            ++p) {
-         dout(20) << __func__ << " releasing old bluefs 0x" << std::hex
-                  << p.get_start() << "~" << p.get_len() << std::dec
-                  << dendl;
-         alloc->release(p.get_start(), p.get_len());
-       }
+       dout(20) << __func__ << " releasing old bluefs 0x" << std::hex
+                << bluefs_extents_reclaiming << std::dec << dendl;
+       alloc->release(bluefs_extents_reclaiming);
        bluefs_extents_reclaiming.clear();
       }