summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSage Weil <sage@inktank.com>2013-05-30 21:43:50 -0700
committerSage Weil <sage@inktank.com>2013-05-30 21:43:50 -0700
commitdf2d06db6f3f7e858bdadcc8cd2b0ade432df413 (patch)
treefe81c66cafb6cb077714972192dba3dfb90c9b2e
parentcf9aa7a0037e56eada8b3c1bb59d59d0bfe7bba5 (diff)
downloadceph-df2d06db6f3f7e858bdadcc8cd2b0ade432df413.tar.gz
mon: destroy MonitorDBStore before g_ceph_context
Put it on the heap so that we can destroy it before the g_ceph_context cct that it references. This fixes a crash like *** Caught signal (Segmentation fault) ** in thread 4034a80 ceph version 0.63-204-gcf9aa7a (cf9aa7a0037e56eada8b3c1bb59d59d0bfe7bba5) 1: ceph-mon() [0x59932a] 2: (()+0xfcb0) [0x4e41cb0] 3: (Mutex::Lock(bool)+0x1b) [0x6235bb] 4: (PerfCountersCollection::remove(PerfCounters*)+0x27) [0x6a0877] 5: (LevelDBStore::~LevelDBStore()+0x1b) [0x582b2b] 6: (LevelDBStore::~LevelDBStore()+0x9) [0x582da9] 7: (main()+0x1386) [0x48db16] 8: (__libc_start_main()+0xed) [0x658076d] 9: ceph-mon() [0x4909ad] Signed-off-by: Sage Weil <sage@inktank.com>
-rw-r--r--src/ceph_mon.cc17
1 files changed, 9 insertions, 8 deletions
diff --git a/src/ceph_mon.cc b/src/ceph_mon.cc
index 1a83db1ce44..53d8a692c13 100644
--- a/src/ceph_mon.cc
+++ b/src/ceph_mon.cc
@@ -301,8 +301,8 @@ int main(int argc, const char **argv)
}
}
- MonitorDBStore store(g_conf->mon_data);
- err = store.open(std::cerr);
+ MonitorDBStore *store = new MonitorDBStore(g_conf->mon_data);
+ err = store->open(std::cerr);
if (err < 0) {
cerr << argv[0] << ": error opening mon data store at '"
<< g_conf->mon_data << "': " << cpp_strerror(err) << std::endl;
@@ -311,7 +311,7 @@ int main(int argc, const char **argv)
assert(err == 0);
bufferlist magicbl;
- err = store.get(Monitor::MONITOR_NAME, "magic", magicbl);
+ err = store->get(Monitor::MONITOR_NAME, "magic", magicbl);
if (!magicbl.length()) {
cerr << "unable to read magic from mon data.. did you run mkcephfs?" << std::endl;
prefork.exit(1);
@@ -322,7 +322,7 @@ int main(int argc, const char **argv)
prefork.exit(1);
}
- err = Monitor::check_features(&store);
+ err = Monitor::check_features(store);
if (err < 0) {
cerr << "error checking features: " << cpp_strerror(err) << std::endl;
prefork.exit(1);
@@ -340,7 +340,7 @@ int main(int argc, const char **argv)
}
// get next version
- version_t v = store.get("monmap", "last_committed");
+ version_t v = store->get("monmap", "last_committed");
cout << "last committed monmap epoch is " << v << ", injected map will be " << (v+1) << std::endl;
v++;
@@ -362,7 +362,7 @@ int main(int argc, const char **argv)
t.put("monmap", v, mapbl);
t.put("monmap", "latest", final);
t.put("monmap", "last_committed", v);
- store.apply_transaction(t);
+ store->apply_transaction(t);
cout << "done." << std::endl;
prefork.exit(0);
@@ -374,7 +374,7 @@ int main(int argc, const char **argv)
// note that even if we don't find a viable monmap, we should go ahead
// and try to build it up in the next if-else block.
bufferlist mapbl;
- int err = obtain_monmap(store, mapbl);
+ int err = obtain_monmap(*store, mapbl);
if (err >= 0) {
try {
monmap.decode(mapbl);
@@ -497,7 +497,7 @@ int main(int argc, const char **argv)
prefork.exit(1);
// start monitor
- mon = new Monitor(g_ceph_context, g_conf->name.get_id(), &store,
+ mon = new Monitor(g_ceph_context, g_conf->name.get_id(), store,
messenger, &monmap);
err = mon->preinit();
@@ -531,6 +531,7 @@ int main(int argc, const char **argv)
shutdown_async_signal_handler();
delete mon;
+ delete store;
delete messenger;
delete client_throttler;
delete daemon_throttler;