From: xie xingguo Date: Sat, 6 Aug 2016 09:37:41 +0000 (+0800) Subject: osd: update reture type of get_pg_or_queue_for_pg() to PGRef X-Git-Tag: v11.0.1~410^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=047aacd61f425fe376f4638e8f5967db6ff5db93;p=ceph.git osd: update reture type of get_pg_or_queue_for_pg() to PGRef As the origin process drops the pg_map_lock and does not hold internal lock(which is not allowed), it is still a slight race condition with PG removal. Signed-off-by: xie xingguo --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 6b0782621ff..7fee91b10c9 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -3153,12 +3153,12 @@ PG *OSD::_create_lock_pg( return pg; } -PG *OSD::get_pg_or_queue_for_pg(const spg_t& pgid, OpRequestRef& op) +PGRef OSD::get_pg_or_queue_for_pg(const spg_t& pgid, OpRequestRef& op) { Session *session = static_cast( op->get_req()->get_connection()->get_priv()); if (!session) - return NULL; + return PGRef(); // get_pg_or_queue_for_pg is only called from the fast_dispatch path where // the session_dispatch_lock must already be held. assert(session->session_dispatch_lock.is_locked()); @@ -3179,7 +3179,7 @@ PG *OSD::get_pg_or_queue_for_pg(const spg_t& pgid, OpRequestRef& op) register_session_waiting_on_pg(session, pgid); } session->put(); - return out; + return PGRef(out); } PG *OSD::_lookup_lock_pg(spg_t pgid) @@ -8556,7 +8556,7 @@ void OSD::handle_op(OpRequestRef& op, OSDMapRef& osdmap) return; } - PG *pg = get_pg_or_queue_for_pg(pgid, op); + PGRef pg = get_pg_or_queue_for_pg(pgid, op); if (pg) { op->send_map_update = share_map.should_send; op->sent_epoch = m->get_map_epoch(); @@ -8644,7 +8644,7 @@ void OSD::handle_replica_op(OpRequestRef& op, OSDMapRef& osdmap) peer_session->put(); } - PG *pg = get_pg_or_queue_for_pg(m->pgid, op); + PGRef pg = get_pg_or_queue_for_pg(m->pgid, op); if (pg) { op->send_map_update = should_share_map; op->sent_epoch = m->map_epoch; @@ -8669,7 +8669,7 @@ bool OSD::op_is_discardable(MOSDOp *op) return false; } -void OSD::enqueue_op(PG *pg, OpRequestRef& op) +void OSD::enqueue_op(PGRef pg, OpRequestRef& op) { utime_t latency = ceph_clock_now(cct) - op->get_req()->get_recv_stamp(); dout(15) << "enqueue_op " << op << " prio " << op->get_req()->get_priority() diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 6cc4249f9f1..a0a938962ad 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1892,7 +1892,7 @@ private: } op_shardedwq; - void enqueue_op(PG *pg, OpRequestRef& op); + void enqueue_op(PGRef pg, OpRequestRef& op); void dequeue_op( PGRef pg, OpRequestRef op, ThreadPool::TPHandle &handle); @@ -2025,7 +2025,7 @@ protected: PGPool _get_pool(int id, OSDMapRef createmap); - PG *get_pg_or_queue_for_pg(const spg_t& pgid, OpRequestRef& op); + PGRef get_pg_or_queue_for_pg(const spg_t& pgid, OpRequestRef& op); PG *_lookup_lock_pg_with_map_lock_held(spg_t pgid); PG *_lookup_lock_pg(spg_t pgid); PG *_open_lock_pg(OSDMapRef createmap,