]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: destroy MonitorDBStore before g_ceph_context
authorSage Weil <sage@inktank.com>
Fri, 31 May 2013 04:43:50 +0000 (21:43 -0700)
committerSage Weil <sage@inktank.com>
Sun, 2 Jun 2013 21:09:51 +0000 (14:09 -0700)
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)

src/ceph_mon.cc

index 36f6c133cf090d3da5cfb20c0571f6d2b24fb3b7..5e820df90f29d32ad17a6b09a2b89afa61a6c5db 100644 (file)
@@ -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;