return pg;
}
- PG *OSD::get_pg_or_queue_for_pg(spg_t pgid, OpRequestRef op)
+ PG *OSD::get_pg_or_queue_for_pg(const spg_t& pgid, OpRequestRef& op)
{
- RWLock::RLocker l(pg_map_lock);
- Session *session = static_cast<Session*>(
- op->get_req()->get_connection()->get_priv());
-
+ {
+ RWLock::RLocker l(pg_map_lock);
+ ceph::unordered_map<spg_t, PG*>::iterator i = pg_map.find(pgid);
+ if (i != pg_map.end())
+ return i->second;
+ }
+ RWLock::WLocker l(pg_map_lock);
ceph::unordered_map<spg_t, PG*>::iterator i = pg_map.find(pgid);
- if (i == pg_map.end())
- session->waiting_for_pg[pgid];
-
- map<spg_t, list<OpRequestRef> >::iterator wlistiter =
- session->waiting_for_pg.find(pgid);
-
- PG *out = NULL;
- if (wlistiter == session->waiting_for_pg.end()) {
- out = i->second;
+ if (i != pg_map.end()) {
+ return i->second;
} else {
- wlistiter->second.push_back(op);
- register_session_waiting_on_pg(session, pgid);
+ waiting_for_pg[pgid].push_back(op);
+ return NULL;
}
- session->put();
- return out;
}
bool OSD::_have_pg(spg_t pgid)