@@ -837,39 +837,42 @@ ReplicatedRecoveryBackend::_handle_pull_response(
837
837
pull_info.recovery_info .version = push_op.version ;
838
838
839
839
if (pull_info.recovery_progress .first ) {
840
- auto fut = pg.obc_loader .with_obc <RWState::RWNONE>(
841
- pull_info.recovery_info .soid ,
842
- [FNAME, this , &pull_info, &recovery_waiter, &push_op](auto , auto obc) {
843
- pull_info.obc = obc;
844
- recovery_waiter.obc = obc;
845
- obc->obs .oi .decode_no_oid (push_op.attrset .at (OI_ATTR),
846
- push_op.soid );
847
- auto ss_attr_iter = push_op.attrset .find (SS_ATTR);
848
- if (ss_attr_iter != push_op.attrset .end ()) {
849
- if (!obc->ssc ) {
850
- obc->ssc = new crimson::osd::SnapSetContext (
851
- push_op.soid .get_snapdir ());
852
- }
853
- try {
854
- obc->ssc ->snapset = SnapSet (ss_attr_iter->second );
855
- obc->ssc ->exists = true ;
856
- } catch (const buffer::error&) {
857
- WARNDPP (" unable to decode SnapSet" , pg);
858
- throw crimson::osd::invalid_argument ();
859
- }
860
- assert (!pull_info.obc ->ssc ->exists ||
861
- obc->ssc ->snapset .seq == pull_info.obc ->ssc ->snapset .seq );
862
- }
863
- pull_info.recovery_info .oi = obc->obs .oi ;
864
- if (pull_info.recovery_info .soid .snap &&
865
- pull_info.recovery_info .soid .snap < CEPH_NOSNAP) {
866
- recalc_subsets (pull_info.recovery_info ,
867
- pull_info.obc ->ssc );
868
- }
869
- return crimson::osd::PG::load_obc_ertr::now ();
870
- }, false ).handle_error_interruptible (crimson::ct_error::assert_all{});
871
- co_await std::move (fut);
872
- };
840
+ auto obc_manager = pg.obc_loader .get_obc_manager (pull_info.recovery_info .soid );
841
+ co_await pg.obc_loader .load_and_lock (
842
+ obc_manager, RWState::RWNONE
843
+ ).handle_error_interruptible (
844
+ crimson::ct_error::assert_all (" unexpected error" )
845
+ );
846
+
847
+ auto obc = obc_manager.get_obc ();
848
+ pull_info.obc = obc;
849
+ recovery_waiter.obc = obc;
850
+ // TODO: move to ObjectContextLoader once constructing obc from attrset is supported
851
+ obc->obs .oi .decode_no_oid (push_op.attrset .at (OI_ATTR),
852
+ push_op.soid );
853
+ auto ss_attr_iter = push_op.attrset .find (SS_ATTR);
854
+ if (ss_attr_iter != push_op.attrset .end ()) {
855
+ if (!obc->ssc ) {
856
+ obc->ssc = new crimson::osd::SnapSetContext (
857
+ push_op.soid .get_snapdir ());
858
+ }
859
+ try {
860
+ obc->ssc ->snapset = SnapSet (ss_attr_iter->second );
861
+ obc->ssc ->exists = true ;
862
+ } catch (const buffer::error&) {
863
+ WARNDPP (" unable to decode SnapSet" , pg);
864
+ throw crimson::osd::invalid_argument ();
865
+ }
866
+ assert (!pull_info.obc ->ssc ->exists ||
867
+ obc->ssc ->snapset .seq == pull_info.obc ->ssc ->snapset .seq );
868
+ }
869
+ pull_info.recovery_info .oi = obc->obs .oi ;
870
+ if (pull_info.recovery_info .soid .snap &&
871
+ pull_info.recovery_info .soid .snap < CEPH_NOSNAP) {
872
+ recalc_subsets (pull_info.recovery_info ,
873
+ pull_info.obc ->ssc );
874
+ }
875
+ }
873
876
874
877
const bool first = pull_info.recovery_progress .first ;
875
878
pull_info.recovery_progress = push_op.after_progress ;
0 commit comments