From: Xuehan Xu Date: Sun, 23 Apr 2023 06:22:52 +0000 (+0000) Subject: crimson/os/seastore/object_data_handler: don't reserve lba space when truncating... X-Git-Tag: v18.2.1~104^2~7 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=02973cf47f82ab2ba2d4a071aaf76d016f3f1b8c;p=ceph.git crimson/os/seastore/object_data_handler: don't reserve lba space when truncating objects to zero size Signed-off-by: Xuehan Xu (cherry picked from commit 826bb50fb3c4d279fa06a648940aebf78303f82d) --- diff --git a/src/crimson/os/seastore/object_data_handler.cc b/src/crimson/os/seastore/object_data_handler.cc index 5d1336e1aae8e..09b8c79c23a6a 100644 --- a/src/crimson/os/seastore/object_data_handler.cc +++ b/src/crimson/os/seastore/object_data_handler.cc @@ -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) {