OSDMapRef nextmap,
PG::RecoveryCtx *rctx)
{
+ // make sure to-be-split children are blocked in wq
+ op_shardedwq.prime_splits(childpgids);
+
unsigned pg_num = nextmap->get_pg_num(
parent->pg_id.pool());
parent->update_snap_mapper_bits(
}
}
+void OSD::ShardedOpWQ::prime_splits(const set<spg_t>& pgs)
+{
+ dout(20) << __func__ << " " << pgs << dendl;
+ for (auto pgid : pgs) {
+ unsigned shard_index = pgid.hash_to_shard(shard_list.size());
+ ShardData* sdata = shard_list[shard_index];
+ Mutex::Locker l(sdata->sdata_op_ordering_lock);
+ ShardData::pg_slot& slot = sdata->pg_slots[pgid];
+ slot.waiting_for_pg = true;
+ }
+}
+
void OSD::ShardedOpWQ::prune_pg_waiters(OSDMapRef osdmap, int whoami)
{
unsigned pushes_to_free = 0;
void _wake_pg_slot(spg_t pgid, ShardData *sdata, ShardData::pg_slot& slot,
unsigned *pushes_to_free);
+ /// prime slots for splitting pgs
+ void prime_splits(const set<spg_t>& pgs);
+
/// prune ops (and possibly pg_slots) for pgs that shouldn't be here
void prune_pg_waiters(OSDMapRef osdmap, int whoami);