{
delete map_in_progress_cond;
delete class_handler;
- delete osdmap;
logger_remove(logger);
delete logger;
delete store;
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();
delete watch;
+ clear_map_cache();
+ osdmap = 0;
+
return r;
}
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()) {
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);
}
}
+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;
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);