From: Greg Farnum Date: Wed, 7 May 2014 05:23:06 +0000 (-0700) Subject: Merge remote-tracking branch 'origin/master' into wip-fast-dispatch X-Git-Tag: v0.81~57^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=5e5a0867b172bf9b515c4044b076d31f8fa9abbf;p=ceph.git Merge remote-tracking branch 'origin/master' into wip-fast-dispatch Conflicts: src/osd/OSD.cc --- 5e5a0867b172bf9b515c4044b076d31f8fa9abbf diff --cc src/osd/OSD.cc index 668b6556e76d,3274055261ef..220eac652723 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@@ -188,13 -188,12 +188,14 @@@ OSDService::OSDService(OSD *osd) scrub_wq(osd->scrub_wq), scrub_finalize_wq(osd->scrub_finalize_wq), rep_scrub_wq(osd->rep_scrub_wq), - 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), + recovery_gen_wq("recovery_gen_wq", cct->_conf->osd_recovery_thread_timeout, + &osd->recovery_tp), + op_gen_wq("op_gen_wq", cct->_conf->osd_recovery_thread_timeout, &osd->op_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"), + peer_map_epoch_lock("OSDService::peer_map_epoch_lock"), sched_scrub_lock("OSDService::sched_scrub_lock"), scrubs_pending(0), scrubs_active(0), agent_lock("OSD::agent_lock"), @@@ -1860,13 -1845,13 +1861,14 @@@ PG *OSD::_open_lock_pg assert(osd_lock.is_locked()); PG* pg = _make_pg(createmap, pgid); - - 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 + { + RWLock::WLocker l(pg_map_lock); + pg->lock(no_lockdep_check); + pg_map[pgid] = pg; + pg->get("PGMap"); // because it's in pg_map ++ service.pg_add_epoch(pg->info.pgid, createmap->get_epoch()); + wake_pg_waiters(pg, pgid); + } return pg; } @@@ -1896,8 -1881,7 +1898,9 @@@ void OSD::add_newly_split_pg(PG *pg, PG 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()); + wake_pg_waiters(pg, pg->info.pgid); + 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);