]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
objecter: cancel tick event on shutdown
authorSage Weil <sage.weil@dreamhost.com>
Mon, 21 Nov 2011 17:19:26 +0000 (09:19 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Mon, 21 Nov 2011 17:19:40 +0000 (09:19 -0800)
Hopefully this is the root cause for

2011-11-20 23:57:41.555292 7f75dd743780 ceph version 0.38-205-g3b53b72
(commit:3b53b722b34b5284e6b8a5571a08d4b7ec276241), process ceph-fuse, pid
21223
 *  Caught signal (Segmentation fault) *
    in thread 7f75d9c6e700
    ceph version 0.38-205-g3b53b72
    (commit:3b53b722b34b5284e6b8a5571a08d4b7ec276241)
    1: /tmp/cephtest/binary/usr/local/bin/ceph-fuse() [0x6993a4]
    2: (()+0xfb40) [0x7f75dd0eeb40]
    3: (PerfCounters::set(int, unsigned long)+0x2a) [0x511bca]
    4: (Objecter::tick()+0x1f3) [0x653f43]
    5: (Objecter::C_Tick::finish(int)+0x15) [0x66aef5]
    6: (SafeTimer::timer_thread()+0x4b0) [0x5825c0]
    7: (SafeTimerThread::entry()+0x15) [0x586865]
    8: (Thread::_entry_func(void)+0x12) [0x52a832]
    9: (()+0x7971) [0x7f75dd0e6971]
    10: (clone()+0x6d) [0x7f75db97592d]

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/osdc/Objecter.cc
src/osdc/Objecter.h

index a781b57984239c03b384bf0fcc72767b4116b779..9dd8f1685e349c805ed6378a37f553138c22db76 100644 (file)
@@ -199,7 +199,7 @@ void Objecter::init()
     cct->get_perfcounters_collection()->add(logger);
   }
 
-  timer.add_event_after(cct->_conf->objecter_tick_interval, new C_Tick(this));
+  schedule_tick();
   maybe_request_map();
 }
 
@@ -211,6 +211,11 @@ void Objecter::shutdown()
     close_session(p->second);
   }
 
+  if (tick_event) {
+    timer.cancel_event(tick_event);
+    tick_event = NULL;
+  }
+
   if (logger) {
     cct->get_perfcounters_collection()->remove(logger);
     delete logger;
@@ -713,12 +718,22 @@ void Objecter::kick_requests(OSDSession *session)
   }
 }
 
+void Objecter::schedule_tick()
+{
+  assert(tick_event == NULL);
+  tick_event = new C_Tick(this);
+  timer.add_event_after(cct->_conf->objecter_tick_interval, tick_event);
+}
 
 void Objecter::tick()
 {
   ldout(cct, 10) << "tick" << dendl;
   assert(client_lock.is_locked());
 
+  // we are only called by C_Tick
+  assert(tick_event);
+  tick_event = NULL;
+
   set<OSDSession*> toping;
 
   // look for laggy requests
@@ -752,7 +767,7 @@ void Objecter::tick()
   }
     
   // reschedule
-  timer.add_event_after(cct->_conf->objecter_tick_interval, new C_Tick(this));
+  schedule_tick();
 }
 
 void Objecter::resend_mon_ops()
index 35bcb2aace39d8d29afdf419eef6e8c2c85ad05f..c4badd832c0e68b1e4958e20fcf2d56647e72d22 100644 (file)
@@ -340,7 +340,9 @@ class Objecter {
   public:
     C_Tick(Objecter *o) : ob(o) {}
     void finish(int r) { ob->tick(); }
-  };
+  } *tick_event;
+
+  void schedule_tick();
   void tick();
 
 public:
@@ -676,7 +678,7 @@ public:
     last_seen_osdmap_version(0),
     last_seen_pgmap_version(0),
     client_lock(l), timer(t),
-    logger(NULL),
+    logger(NULL), tick_event(NULL),
     num_homeless_ops(0),
     op_throttler(cct->_conf->objecter_inflight_op_bytes)
   { }