From: Radoslaw Zarzynski Date: Tue, 23 Mar 2021 16:51:22 +0000 (+0000) Subject: crimson/osd: reload obc also when handling ct_error::object_corrupted. X-Git-Tag: v17.1.0~1984^2~15 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dd6dec306cea6860b284e5e4feafd43f8b4e8854;p=ceph-ci.git crimson/osd: reload obc also when handling ct_error::object_corrupted. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 82f15ee14be..99d704bf207 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -743,9 +743,18 @@ PG::do_osd_ops_iertr::future PG::do_osd_ops_execute( }); }).safe_then_interruptible_tuple([success_func=std::move(success_func)] { return std::move(success_func)(); - }, crimson::ct_error::object_corrupted::handle([m, obc, this] { - return repair_object(m, obc->obs.oi.soid, obc->obs.oi.version).then_interruptible([] { - return do_osd_ops_iertr::future{crimson::ct_error::eagain::make()}; + }, crimson::ct_error::object_corrupted::handle( + [m, obc, rollbacker, this] (const std::error_code& e) mutable { + // this is a path for EIO. it's special because we want to fix the obejct + // and try again. that is, the layer above `PG::do_osd_ops` is supposed to + // restart the execution. + return rollbacker.rollback_obc_if_modified(e).then_interruptible( + [m, obc, this] { + return repair_object(m, + obc->obs.oi.soid, + obc->obs.oi.version).then_interruptible([] { + return do_osd_ops_iertr::future{crimson::ct_error::eagain::make()}; + }); }); }), OpsExecuter::osd_op_errorator::all_same_way( [rollbacker, failure_func=std::move(failure_func), m]