]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore/object_data_handler: don't reserve lba space when truncating...
authorXuehan Xu <xxhdx1985126@gmail.com>
Sun, 23 Apr 2023 06:22:52 +0000 (06:22 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Thu, 19 Oct 2023 07:13:17 +0000 (07:13 +0000)
Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
(cherry picked from commit 826bb50fb3c4d279fa06a648940aebf78303f82d)

src/crimson/os/seastore/object_data_handler.cc

index 5d1336e1aae8ebb9504ab241d741510b65db7fa1..09b8c79c23a6a925419a65e0cc152a10c53108c9 100644 (file)
@@ -223,12 +223,16 @@ struct overwrite_ops_t {
 overwrite_ops_t prepare_ops_list(
   lba_pin_list_t &pins_to_remove,
   extent_to_write_list_t &to_write) {
-  assert(to_write.size() != 0 && pins_to_remove.size() != 0);
+  assert(pins_to_remove.size() != 0);
   overwrite_ops_t ops;
   ops.to_remove.swap(pins_to_remove);
+  if (to_write.empty()) {
+    logger().debug("empty to_write");
+    return ops;
+  }
+  long unsigned int visitted = 0;
   auto& front = to_write.front();
   auto& back = to_write.back();
-  long unsigned int visitted = 0;
 
   // prepare overwrite, happens in one original extent.
   if (ops.to_remove.size() == 1 &&
@@ -238,9 +242,9 @@ overwrite_ops_t prepare_ops_list(
       assert(front.addr == front.pin->get_key());
       assert(back.addr > back.pin->get_key());
       ops.to_remap.push_back(extent_to_remap_t::create_overwrite(
-        std::move(front.pin),
-        front.len,
-        back.addr - front.addr - front.len));
+       std::move(front.pin),
+       front.len,
+       back.addr - front.addr - front.len));
       ops.to_remove.pop_front();
   } else {
     // prepare to_remap, happens in one or multiple extents
@@ -249,20 +253,20 @@ overwrite_ops_t prepare_ops_list(
       assert(to_write.size() > 1);
       assert(front.addr == front.pin->get_key());
       ops.to_remap.push_back(extent_to_remap_t::create_remap(
-        std::move(front.pin),
-        0,
-        front.len));
+       std::move(front.pin),
+       0,
+       front.len));
       ops.to_remove.pop_front();
     }
     if (back.is_existing()) {
       visitted++;
       assert(to_write.size() > 1);
       assert(back.addr + back.len ==
-        back.pin->get_key() + back.pin->get_length());
+       back.pin->get_key() + back.pin->get_length());
       ops.to_remap.push_back(extent_to_remap_t::create_remap(
-        std::move(back.pin),
-        back.addr - back.pin->get_key(),
-        back.len));
+       std::move(back.pin),
+       back.addr - back.pin->get_key(),
+       back.len));
       ops.to_remove.pop_back();
     }
   }
@@ -273,12 +277,12 @@ overwrite_ops_t prepare_ops_list(
       visitted++;
       assert(region.to_write.has_value());
       ops.to_insert.push_back(extent_to_insert_t::create_data(
-        region.addr, region.len, region.to_write));
+       region.addr, region.len, region.to_write));
     } else if (region.is_zero()) {
       visitted++;
       assert(!(region.to_write.has_value()));
       ops.to_insert.push_back(extent_to_insert_t::create_zero(
-        region.addr, region.len));
+       region.addr, region.len));
     }
   }
 
@@ -962,6 +966,11 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation(
       ).si_then([ctx, size, &pins, &object_data, &to_write](auto _pins) {
        _pins.swap(pins);
        ceph_assert(pins.size());
+       if (!size) {
+         // no need to reserve region if we are truncating the object's
+         // size to 0
+         return clear_iertr::now();
+       }
        auto &pin = *pins.front();
        ceph_assert(pin.get_key() >= object_data.get_reserved_data_base());
        ceph_assert(
@@ -1023,7 +1032,6 @@ ObjectDataHandler::clear_ret ObjectDataHandler::trim_data_reservation(
           }
        }
       }).si_then([ctx, size, &to_write, &object_data, &pins] {
-        assert(to_write.size());
         return seastar::do_with(
           prepare_ops_list(pins, to_write),
           [ctx, size, &object_data](auto &ops) {