]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore/BlueFS: defer releasing extents explicitly
authorSage Weil <sage@redhat.com>
Tue, 6 Dec 2016 17:21:56 +0000 (12:21 -0500)
committerSage Weil <sage@redhat.com>
Thu, 15 Dec 2016 19:20:28 +0000 (14:20 -0500)
Don't rely on the Allocator to do this for us (that is
about to go away!).

Signed-off-by: Sage Weil <sage@redhat.com>
src/os/bluestore/BlueFS.cc
src/os/bluestore/BlueFS.h

index 3706d2d8e2542676edcb196ffa237d4b2fff9385..dff943395ee8c03e53afb2e965ee37723fdfeeae 100644 (file)
@@ -318,6 +318,7 @@ void BlueFS::_init_alloc()
 {
   dout(20) << __func__ << dendl;
   alloc.resize(MAX_BDEV);
+  pending_release.resize(MAX_BDEV);
   for (unsigned id = 0; id < bdev.size(); ++id) {
     if (!bdev[id]) {
       continue;
@@ -812,7 +813,7 @@ void BlueFS::_drop_link(FileRef file)
     assert(file->num_reading.load() == 0);
     log_t.op_file_remove(file->fnode.ino);
     for (auto& r : file->fnode.extents) {
-      alloc[r.bdev]->release(r.offset, r.length);
+      pending_release[r.bdev].insert(r.offset, r.length);
     }
     file_map.erase(file->fnode.ino);
     file->deleted = true;
@@ -1098,7 +1099,7 @@ void BlueFS::_compact_log_sync()
 
   dout(10) << __func__ << " release old log extents " << old_extents << dendl;
   for (auto& r : old_extents) {
-    alloc[r.bdev]->release(r.offset, r.length);
+    pending_release[r.bdev].insert(r.offset, r.length);
   }
 
   logger->inc(l_bluefs_log_compactions);
@@ -1240,7 +1241,7 @@ void BlueFS::_compact_log_async(std::unique_lock<std::mutex>& l)
   // 8. release old space
   dout(10) << __func__ << " release old log extents " << old_extents << dendl;
   for (auto& r : old_extents) {
-    alloc[r.bdev]->release(r.offset, r.length);
+    pending_release[r.bdev].insert(r.offset, r.length);
   }
 
   // delete the new log, remove from the dirty files list
@@ -1814,6 +1815,8 @@ void BlueFS::sync_metadata()
   }
   dout(10) << __func__ << dendl;
   utime_t start = ceph_clock_now(NULL);
+  vector<interval_set<uint64_t>> to_release(pending_release.size());
+  to_release.swap(pending_release);
   for (auto p : alloc) {
     if (p) {
       p->commit_start();
@@ -1825,6 +1828,11 @@ void BlueFS::sync_metadata()
       p->commit_finish();
     }
   }
+  for (unsigned i = 0; i < to_release.size(); ++i) {
+    for (auto p = to_release[i].begin(); p != to_release[i].end(); ++p) {
+      alloc[i]->release(p.get_start(), p.get_len());
+    }
+  }
 
   if (_should_compact_log()) {
     if (g_conf->bluefs_compact_log_sync) {
@@ -1887,7 +1895,7 @@ int BlueFS::open_for_write(
               << " already exists, truncate + overwrite" << dendl;
       file->fnode.size = 0;
       for (auto& p : file->fnode.extents) {
-        alloc[p.bdev]->release(p.offset, p.length);
+       pending_release[p.bdev].insert(p.offset, p.length);
       }
       file->fnode.extents.clear();
     }
index f3257e3812d7114380010b36f2e206c3ac56e5d1..ed4c9edbc21e91ebda100556f0388bdc6d5e7520 100644 (file)
@@ -251,6 +251,7 @@ private:
   vector<interval_set<uint64_t> > block_all;  ///< extents in bdev we own
   vector<uint64_t> block_total;               ///< sum of block_all
   vector<Allocator*> alloc;                   ///< allocators for bdevs
+  vector<interval_set<uint64_t>> pending_release; ///< extents to release
 
   void _init_logger();
   void _shutdown_logger();