]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osdc/Objecter: make homeless_session a pointer
authorJohn Spray <john.spray@redhat.com>
Mon, 28 Jul 2014 16:22:59 +0000 (17:22 +0100)
committerJohn Spray <john.spray@redhat.com>
Mon, 25 Aug 2014 00:34:14 +0000 (01:34 +0100)
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 <john.spray@redhat.com>
src/osdc/Objecter.cc
src/osdc/Objecter.h

index 8ca3143e2474d261d5b5eeb36fe4a0f4cf107984..8f326b0d1735992266fdac680ea173f390590a61 100644 (file)
@@ -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) {
index e87b2ebc1a0f5e21c0ba707ea2d82fde14c76813..ab68e03ca1eed5aaf1244f7c16e8405a4183641d 100644 (file)
@@ -1480,7 +1480,7 @@ public:
   map<ceph_tid_t,PoolOp*>        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();