From bfeae027aa938cb3a2382038ab6a9b24334ed460 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 20 Feb 2018 15:20:39 -0600 Subject: [PATCH] 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 --- src/osd/OSD.cc | 10 +++++++--- src/osd/OSD.h | 9 +++++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index a18dd24312c31..b3e89cd3d8642 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 85d5daaf25d8f..658e8a317390b 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>( -- 2.39.5