From: Sage Weil Date: Wed, 2 Apr 2014 21:29:08 +0000 (-0700) Subject: osd: track per-pg epochs, min X-Git-Tag: v0.80.6~33^2~8 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=229a346d824d84c361d7963a356af5251adc9e2e;p=ceph.git osd: track per-pg epochs, min Add some simple tracking so that we can quickly determine what the min pg osdmap epoch is. Signed-off-by: Sage Weil (cherry picked from commit 81e4c47722255ac3d46f701a80e104cc390e766c) --- diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 51fdfa94d900..747894acf6dc 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -191,6 +191,7 @@ OSDService::OSDService(OSD *osd) : push_wq("push_wq", cct->_conf->osd_recovery_thread_timeout, &osd->recovery_tp), gen_wq("gen_wq", cct->_conf->osd_recovery_thread_timeout, &osd->recovery_tp), class_handler(osd->class_handler), + pg_epoch_lock("OSDService::pg_epoch_lock"), publish_lock("OSDService::publish_lock"), pre_publish_lock("OSDService::pre_publish_lock"), sched_scrub_lock("OSDService::sched_scrub_lock"), scrubs_pending(0), @@ -1854,6 +1855,8 @@ PG *OSD::_open_lock_pg( pg_map[pgid] = pg; + service.pg_add_epoch(pg->info.pgid, createmap->get_epoch()); + pg->lock(no_lockdep_check); pg->get("PGMap"); // because it's in pg_map return pg; @@ -1885,6 +1888,7 @@ void OSD::add_newly_split_pg(PG *pg, PG::RecoveryCtx *rctx) epoch_t e(service.get_osdmap()->get_epoch()); pg->get("PGMap"); // For pg_map pg_map[pg->info.pgid] = pg; + service.pg_add_epoch(pg->info.pgid, pg->get_osdmap()->get_epoch()); dout(10) << "Adding newly split pg " << *pg << dendl; vector up, acting; pg->get_osdmap()->pg_to_up_acting_osds(pg->info.pgid.pgid, up, acting); @@ -5795,6 +5799,7 @@ void OSD::advance_pg( lastmap = nextmap; handle.reset_tp_timeout(); } + service.pg_update_epoch(pg->info.pgid, lastmap->get_epoch()); pg->handle_activate_map(rctx); } @@ -7178,6 +7183,8 @@ void OSD::_remove_pg(PG *pg) ); remove_wq.queue(make_pair(PGRef(pg), deleting)); + service.pg_remove_epoch(pg->info.pgid); + // remove from map pg_map.erase(pg->info.pgid); pg->put("PGMap"); // since we've taken it out of map diff --git a/src/osd/OSD.h b/src/osd/OSD.h index d652db7da569..a8a1d08625f1 100644 --- a/src/osd/OSD.h +++ b/src/osd/OSD.h @@ -334,6 +334,42 @@ public: void dequeue_pg(PG *pg, list *dequeued); + // -- map epoch lower bound -- + Mutex pg_epoch_lock; + multiset pg_epochs; + map pg_epoch; + + void pg_add_epoch(spg_t pgid, epoch_t epoch) { + Mutex::Locker l(pg_epoch_lock); + map::iterator t = pg_epoch.find(pgid); + assert(t == pg_epoch.end()); + pg_epoch[pgid] = epoch; + pg_epochs.insert(epoch); + } + void pg_update_epoch(spg_t pgid, epoch_t epoch) { + Mutex::Locker l(pg_epoch_lock); + map::iterator t = pg_epoch.find(pgid); + assert(t != pg_epoch.end()); + pg_epochs.erase(t->second); + t->second = epoch; + pg_epochs.insert(epoch); + } + void pg_remove_epoch(spg_t pgid) { + Mutex::Locker l(pg_epoch_lock); + map::iterator t = pg_epoch.find(pgid); + if (t != pg_epoch.end()) { + pg_epochs.erase(t->second); + pg_epoch.erase(t); + } + } + epoch_t get_min_pg_epoch() { + Mutex::Locker l(pg_epoch_lock); + if (pg_epochs.empty()) + return 0; + else + return *pg_epochs.begin(); + } + // -- superblock -- Mutex publish_lock, pre_publish_lock; // pre-publish orders before publish OSDSuperblock superblock;