From: Sage Weil Date: Tue, 5 Aug 2014 16:15:12 +0000 (-0700) Subject: Merge remote-tracking branch 'gh/wip-8880' X-Git-Tag: v0.85~96 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=bc1d2b8328006e6b45203f822d4b89c083c4f910;p=ceph.git Merge remote-tracking branch 'gh/wip-8880' Conflicts: src/osd/OSD.cc --- bc1d2b8328006e6b45203f822d4b89c083c4f910 diff --cc src/osd/OSD.cc index 534df4d19aac,058b867fa9bc..09432821f950 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@@ -6571,6 -6564,63 +6571,63 @@@ bool OSD::require_osd_peer(OpRequestRef return true; } + bool OSD::require_self_aliveness(OpRequestRef& op, epoch_t epoch) + { + epoch_t up_epoch = service.get_up_epoch(); + if (epoch < up_epoch) { + dout(7) << "from pre-up epoch " << epoch << " < " << up_epoch << dendl; + return false; + } + + if (!is_active()) { + dout(7) << "still in boot state, dropping message " << *op->get_req() << dendl; + return false; + } + + return true; + } + + bool OSD::require_same_peer_instance(OpRequestRef& op, OSDMapRef& map) + { + Message *m = op->get_req(); + int from = m->get_source().num(); + + if (!map->have_inst(from) || + (map->get_cluster_addr(from) != m->get_source_inst().addr)) { + dout(5) << "from dead osd." << from << ", marking down, " + << " msg was " << m->get_source_inst().addr + << " expected " << (map->have_inst(from) ? + map->get_cluster_addr(from) : entity_addr_t()) + << dendl; + ConnectionRef con = m->get_connection(); - cluster_messenger->mark_down(con.get()); ++ con->mark_down(); + Session *s = static_cast(con->get_priv()); + if (s) { + s->session_dispatch_lock.Lock(); + clear_session_waiting_on_map(s); + con->set_priv(NULL); // break ref <-> session cycle, if any + s->session_dispatch_lock.Unlock(); + s->put(); + } + return false; + } + return true; + } + + bool OSD::require_up_osd_peer(OpRequestRef& op, OSDMapRef& map, + epoch_t their_epoch) + { + if (!require_self_aliveness(op, their_epoch)) { + return false; + } else if (!require_osd_peer(op)) { + return false; + } else if (map->get_epoch() >= their_epoch && + !require_same_peer_instance(op, map)) { + return false; + } + return true; + } + /* * require that we have same (or newer) map, and that * the source is the pg primary.