From: Sage Weil Date: Tue, 20 Feb 2018 21:20:39 +0000 (-0600) Subject: osd: make save osdmap accessor for OSDShard X-Git-Tag: v13.1.0~390^2~51 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=bfeae027aa938cb3a2382038ab6a9b24334ed460;p=ceph-ci.git osd: make save osdmap accessor for OSDShard The advance_pg needs to get the shard osdmap without racing against consume_map(). Signed-off-by: Sage Weil --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a18dd24312c..b3e89cd3d86 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -8796,7 +8796,7 @@ void OSD::dequeue_peering_evt( ThreadPool::TPHandle& handle) { PG::RecoveryCtx rctx = create_context(); - auto curmap = sdata->osdmap; + auto curmap = sdata->get_osdmap(); epoch_t need_up_thru = 0, same_interval_since = 0; if (!pg) { if (const MQuery *q = dynamic_cast(evt->evt.get())) { @@ -9281,8 +9281,12 @@ void OSDShard::consume_map( set *new_children) { Mutex::Locker l(sdata_op_ordering_lock); - OSDMapRef old_osdmap = std::move(osdmap); - osdmap = new_osdmap; + OSDMapRef old_osdmap; + { + Mutex::Locker l(osdmap_lock); + old_osdmap = std::move(osdmap); + osdmap = new_osdmap; + } dout(10) << new_osdmap->get_epoch() << " (was " << (old_osdmap ? old_osdmap->get_epoch() : 0) << ")" << dendl; diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 85d5daaf25d..658e8a31739 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1064,8 +1064,15 @@ struct OSDShard { string sdata_op_ordering_lock_name; Mutex sdata_op_ordering_lock; ///< protects all members below + string osdmap_lock_name; + Mutex osdmap_lock; OSDMapRef osdmap; + OSDMapRef get_osdmap() { + Mutex::Locker l(osdmap_lock); + return osdmap; + } + /// map of slots for each spg_t. maintains ordering of items dequeued /// from pqueue while _process thread drops shard lock to acquire the /// pg lock. stale slots are removed by consume_map. @@ -1141,6 +1148,8 @@ struct OSDShard { sdata_op_ordering_lock_name(shard_name + "::sdata_op_ordering_lock"), sdata_op_ordering_lock(sdata_op_ordering_lock_name.c_str(), false, true, false, cct), + osdmap_lock_name(shard_name + "::osdmap_lock"), + osdmap_lock(osdmap_lock_name.c_str(), false, false) { if (opqueue == io_queue::weightedpriority) { pqueue = std::make_unique< WeightedPriorityQueue>(