From: Sage Weil Date: Mon, 21 Nov 2011 17:19:26 +0000 (-0800) Subject: objecter: cancel tick event on shutdown X-Git-Tag: v0.39~27 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=cd2e523fba1d6cf8d15e7a349ad700b744f24ecf;p=ceph-ci.git objecter: cancel tick event on shutdown 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 --- diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index a781b579842..9dd8f1685e3 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -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 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() diff --git a/src/osdc/Objecter.h b/src/osdc/Objecter.h index 35bcb2aace3..c4badd832c0 100644 --- a/src/osdc/Objecter.h +++ b/src/osdc/Objecter.h @@ -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) { }