{
Session *session = static_cast<Session*>(
op->get_req()->get_connection()->get_priv());
- assert(session);
+ if (!session)
+ return NULL;
// get_pg_or_queue_for_pg is only called from the fast_dispatch path where
// the session_dispatch_lock must already be held.
assert(session->session_dispatch_lock.is_locked());
}
OSDMapRef nextmap = service.get_nextmap_reserved();
Session *session = static_cast<Session*>(m->get_connection()->get_priv());
- assert(session);
- {
- Mutex::Locker l(session->session_dispatch_lock);
- update_waiting_for_pg(session, nextmap);
- session->waiting_on_map.push_back(op);
- dispatch_session_waiting(session, nextmap);
+ if (session) {
+ {
+ Mutex::Locker l(session->session_dispatch_lock);
+ update_waiting_for_pg(session, nextmap);
+ session->waiting_on_map.push_back(op);
+ dispatch_session_waiting(session, nextmap);
+ }
+ session->put();
}
- session->put();
service.release_map(nextmap);
}
if (m->get_type() == CEPH_MSG_OSD_MAP) {
MOSDMap *mm = static_cast<MOSDMap*>(m);
Session *s = static_cast<Session*>(m->get_connection()->get_priv());
- s->received_map_lock.Lock();
- s->received_map_epoch = mm->get_last();
- s->received_map_lock.Unlock();
- s->put();
+ if (s) {
+ s->received_map_lock.Lock();
+ s->received_map_epoch = mm->get_last();
+ s->received_map_lock.Unlock();
+ s->put();
+ }
}
}
}
if (msg_epoch > osdmap->get_epoch()) {
Session *s = static_cast<Session*>(op->get_req()->
get_connection()->get_priv());
- s->received_map_lock.Lock();
- epoch_t received_epoch = s->received_map_epoch;
- s->received_map_lock.Unlock();
- if (received_epoch < msg_epoch) {
- osdmap_subscribe(msg_epoch, false);
+ if (s) {
+ s->received_map_lock.Lock();
+ epoch_t received_epoch = s->received_map_epoch;
+ s->received_map_lock.Unlock();
+ if (received_epoch < msg_epoch) {
+ osdmap_subscribe(msg_epoch, false);
+ }
+ s->put();
}
- s->put();
return false;
}
op->send_map_update = should_share_map;
op->sent_epoch = m->map_epoch;
enqueue_op(pg, op);
- } else if (should_share_map) {
+ } else if (should_share_map && m->get_connection()->is_connected()) {
C_SendMap *send_map = new C_SendMap(this, m->get_source(),
m->get_connection(),
osdmap, m->map_epoch);