void OSDService::send_pg_created(pg_t pgid)
{
+ std::lock_guard l(pg_created_lock);
dout(20) << __func__ << dendl;
- if (osdmap->require_osd_release >= CEPH_RELEASE_LUMINOUS) {
+ auto o = get_osdmap();
+ if (o->require_osd_release >= CEPH_RELEASE_LUMINOUS) {
+ pg_created.insert(pgid);
monc->send_mon_message(new MOSDPGCreated(pgid));
}
}
+void OSDService::send_pg_created()
+{
+ std::lock_guard l(pg_created_lock);
+ dout(20) << __func__ << dendl;
+ auto o = get_osdmap();
+ if (o->require_osd_release >= CEPH_RELEASE_LUMINOUS) {
+ for (auto pgid : pg_created) {
+ monc->send_mon_message(new MOSDPGCreated(pgid));
+ }
+ }
+}
+
+void OSDService::prune_pg_created()
+{
+ std::lock_guard l(pg_created_lock);
+ dout(20) << __func__ << dendl;
+ auto o = get_osdmap();
+ auto i = pg_created.begin();
+ while (i != pg_created.end()) {
+ auto p = o->get_pg_pool(i->pool());
+ if (!p || !p->has_flag(pg_pool_t::FLAG_CREATING)) {
+ dout(20) << __func__ << " pruning " << *i << dendl;
+ i = pg_created.erase(i);
+ } else {
+ dout(20) << __func__ << " keeping " << *i << dendl;
+ ++i;
+ }
+ }
+}
+
+
// --------------------------------------
// dispatch
service.clear_sent_ready_to_merge();
service.send_pg_temp();
service.send_ready_to_merge();
+ service.send_pg_created();
requeue_failures();
send_failures();
ceph_assert(merge_pgs.empty());
}
+ service.prune_pg_created();
+
unsigned pushes_to_free = 0;
for (auto& shard : shards) {
shard->consume_map(osdmap, &pushes_to_free);
void requeue_pg_temp();
void send_pg_temp();
+ ceph::mutex pg_created_lock = ceph::make_mutex("OSDService::pg_created_lock");
+ set<pg_t> pg_created;
void send_pg_created(pg_t pgid);
+ void prune_pg_created();
+ void send_pg_created();
AsyncReserver<spg_t> snap_reserver;
void queue_recovery_context(PG *pg, GenContext<ThreadPool::TPHandle&> *c);
if ((state & (PG_STATE_ACTIVE|PG_STATE_PEERED)) &&
!(info.stats.state & (PG_STATE_ACTIVE|PG_STATE_PEERED)))
info.stats.last_became_peered = now;
- if (!(state & PG_STATE_CREATING) &&
- (info.stats.state & PG_STATE_CREATING)) {
- osd->send_pg_created(get_pgid().pgid);
- }
info.stats.state = state;
}
pg->state_set(PG_STATE_ACTIVE);
}
- // info.last_epoch_started is set during activate()
- if (pg->info.history.last_epoch_started == 0) {
+ if (pg->pool.info.has_flag(pg_pool_t::FLAG_CREATING)) {
pg->osd->send_pg_created(pgid);
}