From: Greg Farnum Date: Fri, 4 Apr 2014 21:52:04 +0000 (-0700) Subject: OSD: don't share_map_incoming() directly from handle_replica_op() X-Git-Tag: v0.81~57^2~11 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5268e51b79da4f6c90968c1c69c291a309cb17f6;p=ceph.git OSD: don't share_map_incoming() directly from handle_replica_op() Let the op_tp handle it, or our C_SendMap callback in the op_gen_wq. Signed-off-by: Greg Farnum --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 4c84dfad3786..4080e5075d32 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7687,23 +7687,31 @@ void OSD::handle_replica_op(OpRequestRef op, OSDMapRef osdmap) assert(m->get_source().is_osd()); // share our map with sender, if they're old + bool should_share_map = false; Session *peer_session = static_cast(m->get_connection()->get_priv()); if (peer_session) { peer_session->sent_epoch_lock.Lock(); } - service.share_map_incoming( - m->get_source(), m->get_connection().get(), m->map_epoch, - osdmap, - NULL); + should_share_map = service.should_share_map( + m->get_source(), m->get_connection().get(), m->map_epoch, + osdmap, + peer_session ? &peer_session->last_sent_epoch : NULL); if (peer_session) { peer_session->sent_epoch_lock.Unlock(); peer_session->put(); } PG *pg = get_pg_or_queue_for_pg(m->pgid, op); - if (pg) + if (pg) { + op->send_map_update = should_share_map; + op->sent_epoch = m->map_epoch; enqueue_op(pg, op); + } else if (should_share_map) { + C_SendMap *send_map = new C_SendMap(this, m, m->get_connection(), + osdmap, m->map_epoch); + service.op_gen_wq.queue(send_map); + } } bool OSD::op_is_discardable(MOSDOp *op)