From: John Spray Date: Mon, 28 Jul 2014 16:22:59 +0000 (+0100) Subject: osdc/Objecter: make homeless_session a pointer X-Git-Tag: v0.86~213^2~43 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=27aed2d216727fe0d45eea1d2f3bb3a713a5f279;p=ceph.git osdc/Objecter: make homeless_session a pointer Have a non-pointer member that's a RefCountedObject was awkward, e.g. tripping nref==0 assertion during destruction. Rather than play games with refcount during destruction, just make it a new/delete instance instead. Signed-off-by: John Spray --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index 8ca3143e2474..8f326b0d1735 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -708,7 +708,7 @@ void Objecter::handle_osd_map(MOSDMap *m) logger->set(l_osdc_map_epoch, osdmap->get_epoch()); was_full = was_full || osdmap_full_flag(); - _scan_requests(&homeless_session, skipped_map, was_full, + _scan_requests(homeless_session, skipped_map, was_full, need_resend, need_resend_linger, need_resend_command); @@ -743,7 +743,7 @@ void Objecter::handle_osd_map(MOSDMap *m) << m->get_last() << dendl; osdmap->decode(m->maps[m->get_last()]); - _scan_requests(&homeless_session, false, false, + _scan_requests(homeless_session, false, false, need_resend, need_resend_linger, need_resend_command); } else { @@ -1138,7 +1138,7 @@ int Objecter::_get_session(int osd, OSDSession **session, RWLock::Context& lc) assert(rwlock.is_locked()); if (osd < 0) { - *session = &homeless_session; + *session = homeless_session; return 0; } @@ -1747,8 +1747,8 @@ start: s->lock.unlock(); } - if (homeless_session.ops.find(tid) != homeless_session.ops.end()) { - ret = op_cancel(&homeless_session, tid, r); + if (homeless_session->ops.find(tid) != homeless_session->ops.end()) { + ret = op_cancel(homeless_session, tid, r); } rwlock.unlock(); @@ -3219,7 +3219,7 @@ void Objecter::_dump_active() _dump_active(s); s->lock.unlock(); } - _dump_active(&homeless_session); + _dump_active(homeless_session); } void Objecter::dump_active() @@ -3279,7 +3279,7 @@ void Objecter::dump_ops(Formatter *fmt) s->lock.unlock(); } rwlock.unlock(); - _dump_ops(&homeless_session, fmt); + _dump_ops(homeless_session, fmt); fmt->close_section(); // ops array } @@ -3309,7 +3309,7 @@ void Objecter::dump_linger_ops(Formatter *fmt) s->lock.unlock(); } rwlock.unlock(); - _dump_linger_ops(&homeless_session, fmt); + _dump_linger_ops(homeless_session, fmt); fmt->close_section(); // linger_ops array } @@ -3345,7 +3345,7 @@ void Objecter::dump_command_ops(Formatter *fmt) s->lock.unlock(); } rwlock.unlock(); - _dump_command_ops(&homeless_session, fmt); + _dump_command_ops(homeless_session, fmt); fmt->close_section(); // command_ops array } @@ -3514,9 +3514,9 @@ int Objecter::submit_command(CommandOp *c, ceph_tid_t *ptid) ceph_tid_t tid = last_tid.inc(); ldout(cct, 10) << "_submit_command " << tid << " " << c->cmd << dendl; c->tid = tid; - homeless_session.command_ops[tid] = c; + homeless_session->command_ops[tid] = c; num_homeless_ops.inc(); - c->session = &homeless_session; + c->session = homeless_session; (void)_calc_command_target(c); _assign_command_session(c); if (osd_timeout > 0) { diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index e87b2ebc1a0f..ab68e03ca1ee 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -1480,7 +1480,7 @@ public: map pool_ops; atomic_t num_homeless_ops; - OSDSession homeless_session; + OSDSession *homeless_session; // ops waiting for an osdmap with a new pool or confirmation that // the pool does not exist (may be expanded to other uses later) @@ -1601,7 +1601,7 @@ public: logger(NULL), tick_event(NULL), m_request_state_hook(NULL), num_homeless_ops(0), - homeless_session(cct, -1), + homeless_session(new OSDSession(cct, -1)), mon_timeout(mon_timeout), osd_timeout(osd_timeout), op_throttle_bytes(cct, "objecter_bytes", cct->_conf->objecter_inflight_op_bytes), @@ -1612,6 +1612,7 @@ public: assert(!tick_event); assert(!m_request_state_hook); assert(!logger); + homeless_session->put(); } void init();