diff options
author | Sage Weil <sage.weil@dreamhost.com> | 2011-11-21 09:19:26 -0800 |
---|---|---|
committer | Sage Weil <sage.weil@dreamhost.com> | 2011-11-21 09:19:40 -0800 |
commit | cd2e523fba1d6cf8d15e7a349ad700b744f24ecf (patch) | |
tree | a5e54840d8f018a524aa3a7e7924ab081b23a122 | |
parent | 3b53b722b34b5284e6b8a5571a08d4b7ec276241 (diff) | |
download | ceph-cd2e523fba1d6cf8d15e7a349ad700b744f24ecf.tar.gz |
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 <sage.weil@dreamhost.com>
-rw-r--r-- | src/osdc/Objecter.cc | 19 | ||||
-rw-r--r-- | src/osdc/Objecter.h | 6 |
2 files changed, 21 insertions, 4 deletions
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<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() 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) { } |