From adbedc9bde75cdeccf395afde01200e799e7fa9f Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 12 Dec 2017 16:20:44 -0600 Subject: [PATCH] osd: drop advance_pg() split_pgs arg We can do the same work inside the function and simplify the code. Signed-off-by: Sage Weil --- src/osd/OSD.cc | 82 ++++++++++++++++++++++++-------------------------- src/osd/OSD.h | 3 +- 2 files changed, 41 insertions(+), 44 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a903484efb0..a85510ce8b5 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7656,16 +7656,47 @@ void OSD::check_osdmap_features() } } +struct C_CompleteSplits : public Context { + OSD *osd; + set pgs; + C_CompleteSplits(OSD *osd, const set &in) + : osd(osd), pgs(in) {} + void finish(int r) override { + Mutex::Locker l(osd->osd_lock); + if (osd->is_stopping()) + return; + PG::RecoveryCtx rctx = osd->create_context(); + for (set::iterator i = pgs.begin(); + i != pgs.end(); + ++i) { + osd->pg_map_lock.get_write(); + (*i)->lock(); + PG *pg = i->get(); + osd->add_newly_split_pg(pg, &rctx); + if (!((*i)->is_deleting())) { + set to_complete; + to_complete.insert((*i)->get_pgid()); + osd->service.complete_split(to_complete); + } + osd->pg_map_lock.put_write(); + osd->dispatch_context_transaction(rctx, pg); + osd->wake_pg_waiters(*i); + (*i)->unlock(); + } + + osd->dispatch_context(rctx, 0, osd->service.get_osdmap()); + } +}; + void OSD::advance_pg( epoch_t osd_epoch, PG *pg, ThreadPool::TPHandle &handle, - PG::RecoveryCtx *rctx, - set *new_pgs) + PG::RecoveryCtx *rctx) { assert(pg->is_locked()); OSDMapRef lastmap = pg->get_osdmap(); assert(lastmap->get_epoch() < osd_epoch); - + set new_pgs; // any split children for (epoch_t next_epoch = pg->get_osdmap()->get_epoch() + 1; next_epoch <= osd_epoch; ++next_epoch) { @@ -7695,7 +7726,7 @@ void OSD::advance_pg( &children)) { service.mark_split_in_progress(pg->pg_id, children); split_pgs( - pg, children, new_pgs, lastmap, nextmap, + pg, children, &new_pgs, lastmap, nextmap, rctx); } @@ -7704,6 +7735,10 @@ void OSD::advance_pg( } pg->handle_activate_map(rctx); service.pg_update_epoch(pg->pg_id, lastmap->get_epoch()); + + if (!new_pgs.empty()) { + rctx->on_applied->add(new C_CompleteSplits(this, new_pgs)); + } } void OSD::consume_map() @@ -8991,38 +9026,6 @@ void OSD::dequeue_op( } -struct C_CompleteSplits : public Context { - OSD *osd; - set pgs; - C_CompleteSplits(OSD *osd, const set &in) - : osd(osd), pgs(in) {} - void finish(int r) override { - Mutex::Locker l(osd->osd_lock); - if (osd->is_stopping()) - return; - PG::RecoveryCtx rctx = osd->create_context(); - for (set::iterator i = pgs.begin(); - i != pgs.end(); - ++i) { - osd->pg_map_lock.get_write(); - (*i)->lock(); - PG *pg = i->get(); - osd->add_newly_split_pg(pg, &rctx); - if (!((*i)->is_deleting())) { - set to_complete; - to_complete.insert((*i)->get_pgid()); - osd->service.complete_split(to_complete); - } - osd->pg_map_lock.put_write(); - osd->dispatch_context_transaction(rctx, pg); - osd->wake_pg_waiters(*i); - (*i)->unlock(); - } - - osd->dispatch_context(rctx, 0, osd->service.get_osdmap()); - } -}; - void OSD::dequeue_peering_evt( PG *pg, PGPeeringEventRef evt, @@ -9030,17 +9033,12 @@ void OSD::dequeue_peering_evt( { auto curmap = service.get_osdmap(); PG::RecoveryCtx rctx = create_context(); - set split_pgs; if (curmap->get_epoch() > pg->get_osdmap()->get_epoch()) { - advance_pg(curmap->get_epoch(), pg, handle, &rctx, &split_pgs); + advance_pg(curmap->get_epoch(), pg, handle, &rctx); } pg->do_peering_event(evt, &rctx); auto need_up_thru = pg->get_need_up_thru(); auto same_interval_since = pg->get_same_interval_since(); - if (!split_pgs.empty()) { - rctx.on_applied->add(new C_CompleteSplits(this, split_pgs)); - split_pgs.clear(); - } dispatch_context_transaction(rctx, pg, &handle); bool deleted = pg->is_deleted(); pg->unlock(); diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 3a22bdda35e..2d10d6f3b03 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1780,8 +1780,7 @@ private: void advance_pg( epoch_t advance_to, PG *pg, ThreadPool::TPHandle &handle, - PG::RecoveryCtx *rctx, - set *split_pgs); + PG::RecoveryCtx *rctx); void consume_map(); void activate_map(); -- 2.39.5