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"),
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;
}
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<int> up, acting;
pg->get_osdmap()->pg_to_up_acting_osds(pg->info.pgid.pgid, up, acting);