summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage.weil@dreamhost.com>2011-11-21 09:19:26 -0800
committerSage Weil <sage.weil@dreamhost.com>2011-11-21 09:19:40 -0800
commitcd2e523fba1d6cf8d15e7a349ad700b744f24ecf (patch)
treea5e54840d8f018a524aa3a7e7924ab081b23a122
parent3b53b722b34b5284e6b8a5571a08d4b7ec276241 (diff)
downloadceph-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.cc19
-rw-r--r--src/osdc/Objecter.h6
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)
{ }