diff options
author | Sage Weil <sage@inktank.com> | 2013-05-30 21:43:50 -0700 |
---|---|---|
committer | Sage Weil <sage@inktank.com> | 2013-06-02 14:09:51 -0700 |
commit | 3372235d307172b404a48e4c4d24702a96116d00 (patch) | |
tree | 3c3c3e9a3500b4d6421a056b7d54ae07e71f4f87 | |
parent | d284eaf9ce7d2022ba62562236d5fa41c26c1eb3 (diff) | |
download | ceph-3372235d307172b404a48e4c4d24702a96116d00.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>
(cherry picked from commit df2d06db6f3f7e858bdadcc8cd2b0ade432df413)
-rw-r--r-- | src/ceph_mon.cc | 17 |
1 files changed, 9 insertions, 8 deletions
diff --git a/src/ceph_mon.cc b/src/ceph_mon.cc index 36f6c133cf0..5e820df90f2 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(); @@ -532,6 +532,7 @@ int main(int argc, const char **argv) shutdown_async_signal_handler(); delete mon; + delete store; delete messenger; delete client_throttler; delete daemon_throttler; |