return crimson::ct_error::file_too_large::make();
}
- const bool existing = maybe_create_new_object(os, txn, delta_stats);
- if (existing && op.extent.length < os.oi.size) {
- txn.truncate(coll->get_cid(), ghobject_t{os.oi.soid}, op.extent.length);
- truncate_update_size_and_usage(delta_stats, os.oi, op.extent.truncate_size);
- osd_op_params.clean_regions.mark_data_region_dirty(op.extent.length,
- os.oi.size - op.extent.length);
- }
- if (op.extent.length) {
- txn.write(coll->get_cid(), ghobject_t{os.oi.soid}, 0, op.extent.length,
- osd_op.indata, op.flags);
- update_size_and_usage(delta_stats, os.oi, 0,
- op.extent.length, true);
- osd_op_params.clean_regions.mark_data_region_dirty(0,
- std::max((uint64_t) op.extent.length, os.oi.size));
- }
- return seastar::now();
+ return _writefull(
+ os,
+ op.extent.truncate_size,
+ osd_op.indata,
+ txn,
+ osd_op_params,
+ delta_stats,
+ op.flags);
}
+ using mocked_load_clone_obc_ertr = crimson::errorator<
+ crimson::ct_error::enoent,
+ crimson::ct_error::object_corrupted>;
+ using mocked_lock_clone_obc_iertr =
+ ::crimson::interruptible::interruptible_errorator<
+ ::crimson::osd::IOInterruptCondition,
+ mocked_load_clone_obc_ertr>;
+
+ static mocked_lock_clone_obc_iertr::future<crimson::osd::ObjectContextRef>
+ mocked_load_clone_obc(const auto& coid)
+ {
+ return crimson::ct_error::enoent::make();
+ }
+
+ static auto head2clone(const hobject_t& hoid)
+ {
+ // TODO: transform hoid into coid
+ return hoid;
+ }
+
+ PGBackend::rollback_iertr::future<> PGBackend::rollback(
+ const SnapSet &ss,
+ ObjectState& os,
+ const OSDOp& osd_op,
+ ceph::os::Transaction& txn,
+ osd_op_params_t& osd_op_params,
+ object_stat_sum_t& delta_stats)
+ {
+ assert(os.oi.soid.is_head());
+ logger().debug("{} deleting {} and rolling back to old snap {}",
+ __func__, os.oi.soid, osd_op.op.snap.snapid);
+ return mocked_load_clone_obc(
+ head2clone(os.oi.soid)
+ ).safe_then_interruptible([](auto clone_obc) {
+ // TODO: implement me!
+ static_cast<void>(clone_obc);
+ return remove_iertr::now();
+ }, crimson::ct_error::enoent::handle([this, &os, &txn, &delta_stats] {
+ // there's no snapshot here, or there's no object.
+ // if there's no snapshot, we delete the object; otherwise, do nothing.
+ logger().debug("rollback: deleting head on {}"
+ " because got ENOENT|whiteout on obc lookup",
+ os.oi.soid);
+ return remove(os, txn, delta_stats, true /*whiteout*/);
+ }), mocked_load_clone_obc_ertr::assert_all{
+ "unexpected error code in rollback"
+ });
+ }
+
PGBackend::append_ierrorator::future<> PGBackend::append(
ObjectState& os,
OSDOp& osd_op,