]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
os/bluestore: Write_v2 changes
authorAdam Kupczyk <akupczyk@ibm.com>
Thu, 1 Aug 2024 11:54:21 +0000 (11:54 +0000)
committerAdam Kupczyk <akupczyk@ibm.com>
Wed, 7 Aug 2024 10:55:46 +0000 (10:55 +0000)
1) moved stats and blobs update to Writer::do_write
2) preallocate space in Writer:_split_data
3) fixed Writer::_write_expand_l that could check one extent too much

Signed-off-by: Adam Kupczyk <akupczyk@ibm.com>
src/os/bluestore/BlueStore.cc
src/os/bluestore/Writer.cc

index d35a59a46398119d9737ad8756c94fe8c6d06091..f3710349cea0d1e5ceda96984bad4136f63c8e6a 100644 (file)
@@ -17379,14 +17379,6 @@ int BlueStore::_do_write_v2(
   o->extent_map.fault_range(db, offset, length);
   BlueStore::Writer wr(this, txc, &wctx, o);
   wr.do_write(offset, bl);
-  // equivalent of wctx_finish
-  // do_write updates allocations itself
-  // update statfs
-  txc->statfs_delta += wr.statfs_delta;
-  // update shared blobs
-  for (auto b: wr.shared_changed) {
-    txc->write_shared_blob(b);
-  }
   o->extent_map.compress_extent_map(offset, length);
   o->extent_map.dirty_range(offset, length);
   o->extent_map.maybe_reshard(offset, offset + length);
index 4b9733470b13bb37f490d456898ca2224ebe3390..725f1526213806fa69760e6224b9c37d9c9915d6 100644 (file)
@@ -1101,11 +1101,12 @@ std::pair<bool, uint32_t> BlueStore::Writer::_write_expand_l(
   bool     new_data_pad = true; // unless otherwise stated, we pad
   exmp_it it = onode->extent_map.seek_lextent(logical_offset);
   // it can be extent in which we are interested in
-  if (it == onode->extent_map.extent_map.end()) {
+  if (it == onode->extent_map.extent_map.end() ||
+    it->logical_offset >= logical_offset) {
     if (it == onode->extent_map.extent_map.begin()) {
       goto done;
     }
-    --it; //step back to first element
+    --it; //step back to the first extent to consider
   }
   do {
     if (it->logical_end() < off_stop) {
@@ -1247,6 +1248,8 @@ void BlueStore::Writer::_split_data(
   bufferlist& data,
   blob_vec& bd)
 {
+  ceph_assert(bd.empty());
+  bd.reserve(data.length() / wctx->target_blob_size + 2);
   auto lof = location;
   uint32_t end_offset = location + data.length();
   while (lof < end_offset) {
@@ -1371,6 +1374,12 @@ void BlueStore::Writer::do_write(
   if (onode->onode.size < ref_end)
     onode->onode.size = ref_end;
   _collect_released_allocated();
+  // update statfs
+  txc->statfs_delta += statfs_delta;
+  // update shared blobs
+  for (auto b: shared_changed) {
+    txc->write_shared_blob(b);
+  }
   dout(25) << "result: " << std::endl << onode->print(pp_mode) << dendl;
 }