return true;
}
-bool OSD::require_same_peer_instance(OpRequestRef& op, OSDMapRef& map)
+bool OSD::require_same_peer_instance(OpRequestRef& op, OSDMapRef& map,
+ bool is_fast_dispatch)
{
Message *m = op->get_req();
int from = m->get_source().num();
cluster_messenger->mark_down(con.get());
Session *s = static_cast<Session*>(con->get_priv());
if (s) {
- s->session_dispatch_lock.Lock();
+ if (!is_fast_dispatch)
+ 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();
+ if (!is_fast_dispatch)
+ s->session_dispatch_lock.Unlock();
s->put();
}
return false;
* require that we have same (or newer) map, and that
* the source is the pg primary.
*/
-bool OSD::require_same_or_newer_map(OpRequestRef& op, epoch_t epoch)
+bool OSD::require_same_or_newer_map(OpRequestRef& op, epoch_t epoch,
+ bool is_fast_dispatch)
{
Message *m = op->get_req();
dout(15) << "require_same_or_newer_map " << epoch << " (i am " << osdmap->get_epoch() << ") " << m << dendl;
// ok, our map is same or newer.. do they still exist?
if (m->get_connection()->get_messenger() == cluster_messenger &&
- !require_same_peer_instance(op, osdmap)) {
+ !require_same_peer_instance(op, osdmap, is_fast_dispatch)) {
return false;
}
}
op->get_req()->put();
- if (!require_same_or_newer_map(op, m->epoch)) return;
+ if (!require_same_or_newer_map(op, m->epoch, false))
+ return;
op->mark_started();
if (!require_osd_peer(op))
return;
- if (!require_same_or_newer_map(op, m->get_epoch())) return;
+ if (!require_same_or_newer_map(op, m->get_epoch(), false))
+ return;
op->mark_started();
return;
int from = m->get_source().num();
- if (!require_same_or_newer_map(op, m->get_epoch())) return;
+ if (!require_same_or_newer_map(op, m->get_epoch(), false))
+ return;
if (m->info.pgid.preferred() >= 0) {
dout(10) << "ignoring localized pg " << m->info.pgid << dendl;
return;
int from = m->get_source().num();
- if (!require_same_or_newer_map(op, m->get_epoch())) return;
+ if (!require_same_or_newer_map(op, m->get_epoch(), false))
+ return;
op->mark_started();
return;
int from = m->get_source().num();
- if (!require_same_or_newer_map(op, m->epoch)) return;
+ if (!require_same_or_newer_map(op, m->epoch, false))
+ return;
if (m->pgid.preferred() >= 0) {
dout(10) << "ignoring localized pg " << m->pgid << dendl;
if (!require_osd_peer(op))
return;
- if (!require_same_or_newer_map(op, m->query_epoch))
+ if (!require_same_or_newer_map(op, m->query_epoch, false))
return;
PG::CephPeeringEvtRef evt;
if (!require_osd_peer(op))
return;
- if (!require_same_or_newer_map(op, m->query_epoch))
+ if (!require_same_or_newer_map(op, m->query_epoch, false))
return;
PG::CephPeeringEvtRef evt;
dout(7) << "handle_pg_query from " << m->get_source() << " epoch " << m->get_epoch() << dendl;
int from = m->get_source().num();
- if (!require_same_or_newer_map(op, m->get_epoch())) return;
+ if (!require_same_or_newer_map(op, m->get_epoch(), false))
+ return;
op->mark_started();
dout(7) << "handle_pg_remove from " << m->get_source() << " on "
<< m->pg_list.size() << " pgs" << dendl;
- if (!require_same_or_newer_map(op, m->get_epoch())) return;
+ if (!require_same_or_newer_map(op, m->get_epoch(), false))
+ return;
op->mark_started();
if (!require_self_aliveness(op, m->map_epoch))
return;
if (!require_osd_peer(op))
- return false;
- if (map->get_epoch() >= m->map_epoch &&
- !require_same_peer_instance(op, osdmap))
- return false;
+ return;
+ if (osdmap->get_epoch() >= m->map_epoch &&
+ !require_same_peer_instance(op, osdmap, true))
+ return;
// must be a rep op.
assert(m->get_source().is_osd());