dout(10) << __func__ << " no pools, no pg_temp priming" << dendl;
} else if (all) {
PrimeTempJob job(next, this);
- mapper.queue(&job, g_conf()->mon_osd_mapping_pgs_per_chunk);
+ mapper.queue(&job, g_conf()->mon_osd_mapping_pgs_per_chunk, {});
if (job.wait_for(g_conf()->mon_osd_prime_pg_temp_max_time)) {
dout(10) << __func__ << " done in " << job.get_duration() << dendl;
} else {
OSDMap::clean_temps(cct, osdmap, tmp, &pending_inc);
// clean inappropriate pg_upmap/pg_upmap_items (if any)
- osdmap.maybe_remove_pg_upmaps(cct, osdmap, tmp, &pending_inc);
+ {
+ // check every upmapped pg for now
+ // until we could reliably identify certain cases to ignore,
+ // which is obviously the hard part TBD..
+ vector<pg_t> pgs_to_check;
+ tmp.get_upmap_pgs(&pgs_to_check);
+ if (pgs_to_check.size() < g_conf()->mon_clean_pg_upmaps_per_chunk * 2) {
+ // not enough pgs, do it inline
+ tmp.clean_pg_upmaps(cct, &pending_inc);
+ } else {
+ CleanUpmapJob job(cct, tmp, pending_inc);
+ mapper.queue(&job, g_conf()->mon_clean_pg_upmaps_per_chunk, pgs_to_check);
+ job.wait();
+ }
+ }
// update creating pgs first so that we can remove the created pgid and
// process the pool flag removal below in the same osdmap epoch.
pending_inc.new_pools[pool_id] = p;
}
+void OSDMonitor::do_set_pool_opt(int64_t pool_id,
+ pool_opts_t::key_t opt,
+ pool_opts_t::value_t val)
+{
+ auto p = pending_inc.new_pools.try_emplace(
+ pool_id, *osdmap.get_pg_pool(pool_id));
+ p.first->second.opts.set(opt, val);
+}
+
unsigned OSDMonitor::scan_for_creating_pgs(
const mempool::osdmap::map<int64_t,pg_pool_t>& pools,
const mempool::osdmap::set<int64_t>& removed_pools,
if (p.type != pg_pool_t::TYPE_ERASURE) {
if (n < 1 || n > p.size) {
- ss << "pool min_size must be between 1 and " << (int)p.size;
+ ss << "pool min_size must be between 1 and size, which is set to " << (int)p.size;
return -EINVAL;
}
} else {
}
if (n < k || n > p.size) {
- ss << "pool min_size must be between " << k << " and " << (int)p.size;
+ ss << "pool min_size must be between " << k << " and size, which is set to " << (int)p.size;
return -EINVAL;
}
}
return -EPERM;
}
}
- // set targets; mgr will adjust pg_num_actual and pgp_num later.
- // make pgp_num track pg_num if it already matches. if it is set
- // differently, leave it different and let the user control it
- // manually.
- if (p.get_pg_num_target() == p.get_pgp_num_target()) {
- p.set_pgp_num_target(n);
+ if (osdmap.require_osd_release < CEPH_RELEASE_NAUTILUS) {
+ // pre-nautilus osdmap format; increase pg_num directly
+ assert(n > (int)p.get_pg_num());
+ // force pre-nautilus clients to resend their ops, since they
+ // don't understand pg_num_target changes form a new interval
+ p.last_force_op_resend_prenautilus = pending_inc.epoch;
+ // force pre-luminous clients to resend their ops, since they
+ // don't understand that split PGs now form a new interval.
+ p.last_force_op_resend_preluminous = pending_inc.epoch;
+ p.set_pg_num(n);
+ } else {
+ // set targets; mgr will adjust pg_num_actual and pgp_num later.
+ // make pgp_num track pg_num if it already matches. if it is set
+ // differently, leave it different and let the user control it
+ // manually.
+ if (p.get_pg_num_target() == p.get_pgp_num_target()) {
+ p.set_pgp_num_target(n);
+ }
+ p.set_pg_num_target(n);
}
- p.set_pg_num_target(n);
} else if (var == "pgp_num_actual") {
if (p.has_flag(pg_pool_t::FLAG_NOPGCHANGE)) {
ss << "pool pgp_num change is disabled; you must unset nopgchange flag for the pool first";
ss << "specified pgp_num " << n << " > pg_num " << p.get_pg_num_target();
return -EINVAL;
}
- p.set_pgp_num_target(n);
+ if (osdmap.require_osd_release < CEPH_RELEASE_NAUTILUS) {
+ // pre-nautilus osdmap format; increase pgp_num directly
+ p.set_pgp_num(n);
+ } else {
+ p.set_pgp_num_target(n);
+ }
} else if (var == "pg_autoscale_mode") {
n = pg_pool_t::get_pg_autoscale_mode_by_name(val);
if (n < 0) {
ss << "specified invalid mode " << val;
return -EINVAL;
}
+ if (osdmap.require_osd_release < CEPH_RELEASE_NAUTILUS) {
+ ss << "must set require_osd_release to nautilus or later before setting pg_autoscale_mode";
+ return -EINVAL;
+ }
p.pg_autoscale_mode = n;
} else if (var == "crush_rule") {
int id = osdmap.crush->get_rule_id(val);