From: Greg Farnum Date: Thu, 20 Mar 2014 22:55:50 +0000 (-0700) Subject: OSD: add _should_share_map function X-Git-Tag: v0.81~57^2~23 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=b53cec43d1f78efc3e671f898750294acc5ad243;p=ceph.git OSD: add _should_share_map function Just copy _share_map_incoming and rip out all the parts that actually update data structures. Signed-off-by: Greg Farnum --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 24c2e877f32..c83d94ad747 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -4637,6 +4637,45 @@ void OSD::forget_peer_epoch(int peer, epoch_t as_of) } } +bool OSD::_should_share_map(entity_name_t name, Connection *con, + epoch_t epoch, OSDMapRef& osdmap, Session *session) +{ + bool should_send = false; + dout(20) << "_should_share_map " + << name << " " << con->get_peer_addr() + << " " << epoch << dendl; + + // does client have old map? + if (name.is_client()) { + bool message_sendmap = epoch < osdmap->get_epoch(); + if (message_sendmap && session) { + dout(20) << "client session last_sent_epoch: " + << session->last_sent_epoch + << " versus osdmap epoch " << osdmap->get_epoch() << dendl; + if (session->last_sent_epoch < osdmap->get_epoch()) { + should_send = true; + } // else we don't need to send it out again + } + } + + if (con->get_messenger() == cluster_messenger && + osdmap->is_up(name.num()) && + (osdmap->get_cluster_addr(name.num()) == con->get_peer_addr() || + osdmap->get_hb_back_addr(name.num()) == con->get_peer_addr())) { + // remember + epoch_t has = get_peer_epoch(name.num()); + + // share? + if (has < osdmap->get_epoch()) { + dout(10) << name << " " << con->get_peer_addr() + << " has old map " << epoch << " < " + << osdmap->get_epoch() << dendl; + should_send = true; + } + } + + return should_send; +} bool OSD::_share_map_incoming( entity_name_t name, diff --git a/src/osd/OSD.h b/src/osd/OSD.h index 2c0eb5ca55b..6dfd1e8b30b 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -1337,6 +1337,8 @@ private: epoch_t note_peer_epoch(int p, epoch_t e); void forget_peer_epoch(int p, epoch_t e); + bool _should_share_map(entity_name_t name, Connection *con, epoch_t epoch, + OSDMapRef& osdmap, Session *session); bool _share_map_incoming(entity_name_t name, Connection *con, epoch_t epoch, OSDMapRef& osdmap, Session *session); void _share_map_outgoing(int peer, Connection *con,