]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: share osd->osdmap with map cache
authorSage Weil <sage.weil@dreamhost.com>
Mon, 28 Feb 2011 21:11:05 +0000 (13:11 -0800)
committerSage Weil <sage.weil@dreamhost.com>
Mon, 28 Feb 2011 21:11:12 +0000 (13:11 -0800)
Make OSD::osdmap just a shortcut map pointer to the most recent OSDMap, the
same one that's in the map cache.

Signed-off-by: Sage Weil <sage.weil@dreamhost.com>
src/osd/OSD.cc
src/osd/OSD.h

index e3a81a31fd4ae4746a61efae40c1a4b9a210f8e8..a347be26197b6273a4bca7df9ab8907d2e928bb1 100644 (file)
@@ -477,7 +477,6 @@ OSD::~OSD()
 {
   delete map_in_progress_cond;
   delete class_handler;
-  delete osdmap;
   logger_remove(logger);
   delete logger;
   delete store;
@@ -557,12 +556,7 @@ int OSD::init()
     derr << "OSD::init: unable to read current osdmap" << dendl;
     return -1;
   }
-  osdmap = new OSDMap;
-  if (superblock.current_epoch) {
-    bufferlist bl;
-    get_map_bl(superblock.current_epoch, bl);
-    osdmap->decode(bl);
-  }
+  osdmap = get_map(superblock.current_epoch);
 
   clear_temp();
 
@@ -818,6 +812,9 @@ int OSD::shutdown()
 
   delete watch;
 
+  clear_map_cache();
+  osdmap = 0;
+
   return r;
 }
 
@@ -2735,18 +2732,10 @@ void OSD::handle_osd_map(MOSDMap *m)
   if (session)
     session->put();
 
-  if (osdmap) {
-    dout(3) << "handle_osd_map epochs [" 
-            << m->get_first() << "," << m->get_last() 
-            << "], i have " << osdmap->get_epoch()
-            << dendl;
-  } else {
-    dout(3) << "handle_osd_map epochs [" 
-            << m->get_first() << "," << m->get_last() 
-            << "], i have none"
-            << dendl;
-    osdmap = new OSDMap;
-  }
+  dout(3) << "handle_osd_map epochs [" 
+         << m->get_first() << "," << m->get_last() 
+         << "], i have " << osdmap->get_epoch()
+         << dendl;
 
   // make sure there is something new, here, before we bother flushing the queues and such
   if (m->get_last() <= osdmap->get_epoch()) {
@@ -2895,13 +2884,7 @@ void OSD::handle_osd_map(MOSDMap *m)
     if (!logger_started)
       start_logger();
 
-    delete osdmap;
-
-    // horrible hack to separate live osdmap from cached maps (until we switch to shared_ptr)
-    bufferlist bl;
-    newmap->encode(bl);
-    osdmap = new OSDMap;
-    osdmap->decode(bl);
+    osdmap = newmap;
 
     superblock.current_epoch = cur;
     advance_map(t);
@@ -3464,6 +3447,15 @@ void OSD::trim_map_cache(epoch_t oldest)
   }
 }
 
+void OSD::clear_map_cache()
+{
+  while (!map_cache.empty()) {
+    OSDMap *o = map_cache.begin()->second;
+    delete o;
+    map_cache.erase(map_cache.begin());
+  }
+}
+
 bool OSD::get_inc_map(epoch_t e, OSDMap::Incremental &inc)
 {
   bufferlist bl;
index feba8c918613263316348fa663205f9710473b95..631a58261df543672ff62a4b3bf2a55d7d4f7dcb 100644 (file)
@@ -474,6 +474,7 @@ private:
   OSDMap* get_map(epoch_t e);
   void add_map(OSDMap *o);
   void trim_map_cache(epoch_t oldest);
+  void clear_map_cache();
   void keep_map_from(epoch_t from);
 
   bool get_map_bl(epoch_t e, bufferlist& bl);