From dd6dec306cea6860b284e5e4feafd43f8b4e8854 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 23 Mar 2021 16:51:22 +0000 Subject: [PATCH] crimson/osd: reload obc also when handling ct_error::object_corrupted. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/pg.cc | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) 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] -- 2.47.3