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 map_epoch = PG::peek_map_epoch(store, coll_t(pgid), service.infos_oid, &bl);
PG *pg = _open_lock_pg(map_epoch == 0 ? osdmap : service.get_map(map_epoch), pgid);
+ // there can be no waiters here, so we don't call wake_pg_waiters
// read pg state, log
pg->read_state(store, bl);
pg->queue_peering_event(evt);
pg->unlock();
+ wake_pg_waiters(pg, pgid);
return;
}
case RES_SELF: {
pg->queue_peering_event(evt);
pg->unlock();
+ wake_pg_waiters(pg, resurrected);
return;
}
case RES_PARENT: {
//parent->queue_peering_event(evt);
parent->queue_null(osdmap->get_epoch(), osdmap->get_epoch());
parent->unlock();
+ wake_pg_waiters(parent, resurrected);
return;
}
}
pg->publish_stats_to_osd();
pg->unlock();
num_created++;
+ wake_pg_waiters(pg, pgid);
}
dispatch_context(rctx, pg, osdmap);
}
};
res_result _try_resurrect_pg(
OSDMapRef curmap, spg_t pgid, spg_t *resurrected, PGRef *old_pg_state);
+
+ /**
+ * After unlocking the pg, the user must ensure that wake_pg_waiters
+ * is called.
+ */
PG *_create_lock_pg(
OSDMapRef createmap,
spg_t pgid,