return -EOPNOTSUPP;
}
-void PGMapUpdater::check_osd_map(const OSDMap::Incremental &osd_inc,
- std::set<int> *need_check_down_pg_osds,
- std::map<int,utime_t> *last_osd_report,
- PGMap *pg_map,
- PGMap::Incremental *pending_inc)
-{
- for (const auto &p : osd_inc.new_weight) {
- if (p.second == CEPH_OSD_OUT) {
- dout(10) << __func__ << " osd." << p.first << " went OUT" << dendl;
- pending_inc->stat_osd_out(p.first);
- }
- }
-
- // this is conservative: we want to know if any osds (maybe) got marked down.
- for (const auto &p : osd_inc.new_state) {
- if (p.second & CEPH_OSD_UP) { // true if marked up OR down,
- // but we're too lazy to check
- // which
- need_check_down_pg_osds->insert(p.first);
-
- // clear out the last_osd_report for this OSD
- auto report = last_osd_report->find(p.first);
- if (report != last_osd_report->end()) {
- last_osd_report->erase(report);
- }
-
- // clear out osd_stat slow request histogram
- dout(20) << __func__ << " clearing osd." << p.first
- << " request histogram" << dendl;
- pending_inc->stat_osd_down_up(p.first, *pg_map);
- }
-
- if (p.second & CEPH_OSD_EXISTS) {
- // whether it was created *or* destroyed, we can safely drop
- // it's osd_stat_t record.
- dout(10) << __func__ << " osd." << p.first
- << " created or destroyed" << dendl;
- pending_inc->rm_stat(p.first);
- }
- }
-}
-
void PGMapUpdater::check_osd_map(
CephContext *cct,
const OSDMap& osdmap,
}
}
-void PGMapUpdater::register_pg(
- const OSDMap &osd_map,
- pg_t pgid, epoch_t epoch,
- bool new_pool,
- const PGMap &pg_map,
- PGMap::Incremental *pending_inc)
-{
- pg_t parent;
- int split_bits = 0;
- auto parent_stat = pg_map.pg_stat.end();
- if (!new_pool) {
- parent = pgid;
- while (1) {
- // remove most significant bit
- int msb = cbits(parent.ps());
- if (!msb)
- break;
- parent.set_ps(parent.ps() & ~(1<<(msb-1)));
- split_bits++;
- dout(30) << " is " << pgid << " parent " << parent << " ?" << dendl;
- parent_stat = pg_map.pg_stat.find(parent);
- if (parent_stat != pg_map.pg_stat.end() &&
- parent_stat->second.state != PG_STATE_CREATING) {
- dout(10) << " parent is " << parent << dendl;
- break;
- }
- }
- }
-
- pg_stat_t &stats = pending_inc->pg_stat_updates[pgid];
- stats.state = PG_STATE_CREATING;
- stats.created = epoch;
- stats.parent = parent;
- stats.parent_split_bits = split_bits;
- stats.mapping_epoch = epoch;
-
- if (parent_stat != pg_map.pg_stat.end()) {
- const pg_stat_t &ps = parent_stat->second;
- stats.last_fresh = ps.last_fresh;
- stats.last_active = ps.last_active;
- stats.last_change = ps.last_change;
- stats.last_peered = ps.last_peered;
- stats.last_clean = ps.last_clean;
- stats.last_unstale = ps.last_unstale;
- stats.last_undegraded = ps.last_undegraded;
- stats.last_fullsized = ps.last_fullsized;
- stats.last_scrub_stamp = ps.last_scrub_stamp;
- stats.last_deep_scrub_stamp = ps.last_deep_scrub_stamp;
- stats.last_clean_scrub_stamp = ps.last_clean_scrub_stamp;
- } else {
- utime_t now = osd_map.get_modified();
- stats.last_fresh = now;
- stats.last_active = now;
- stats.last_change = now;
- stats.last_peered = now;
- stats.last_clean = now;
- stats.last_unstale = now;
- stats.last_undegraded = now;
- stats.last_fullsized = now;
- stats.last_scrub_stamp = now;
- stats.last_deep_scrub_stamp = now;
- stats.last_clean_scrub_stamp = now;
- }
-
- osd_map.pg_to_up_acting_osds(
- pgid,
- &stats.up,
- &stats.up_primary,
- &stats.acting,
- &stats.acting_primary);
-
- if (split_bits == 0) {
- dout(10) << __func__ << " will create " << pgid
- << " primary " << stats.acting_primary
- << " acting " << stats.acting
- << dendl;
- } else {
- dout(10) << __func__ << " will create " << pgid
- << " primary " << stats.acting_primary
- << " acting " << stats.acting
- << " parent " << parent
- << " by " << split_bits << " bits"
- << dendl;
- }
-}
-
-void PGMapUpdater::register_new_pgs(
- const OSDMap &osd_map,
- const PGMap &pg_map,
- PGMap::Incremental *pending_inc)
-{
- epoch_t epoch = osd_map.get_epoch();
- dout(10) << __func__ << " checking pg pools for osdmap epoch " << epoch
- << ", last_pg_scan " << pg_map.last_pg_scan << dendl;
-
- int created = 0;
- const auto &pools = osd_map.get_pools();
-
- for (const auto &p : pools) {
- int64_t poolid = p.first;
- const pg_pool_t &pool = p.second;
- int ruleno = osd_map.crush->find_rule(pool.get_crush_rule(),
- pool.get_type(), pool.get_size());
- if (ruleno < 0 || !osd_map.crush->rule_exists(ruleno))
- continue;
-
- if (pool.get_last_change() <= pg_map.last_pg_scan ||
- pool.get_last_change() <= pending_inc->pg_scan) {
- dout(10) << " no change in pool " << poolid << " " << pool << dendl;
- continue;
- }
-
- dout(10) << __func__ << " scanning pool " << poolid
- << " " << pool << dendl;
-
- // first pgs in this pool
- bool new_pool = pg_map.pg_pool_sum.count(poolid) == 0;
-
- for (ps_t ps = 0; ps < pool.get_pg_num(); ps++) {
- pg_t pgid(ps, poolid, -1);
- if (pg_map.pg_stat.count(pgid)) {
- dout(20) << "register_new_pgs have " << pgid << dendl;
- continue;
- }
- created++;
- register_pg(osd_map, pgid, pool.get_last_change(), new_pool,
- pg_map, pending_inc);
- }
- }
-
- int removed = 0;
- for (const auto &p : pg_map.creating_pgs) {
- if (p.preferred() >= 0) {
- dout(20) << " removing creating_pg " << p
- << " because it is localized and obsolete" << dendl;
- pending_inc->pg_remove.insert(p);
- ++removed;
- } else if (!osd_map.have_pg_pool(p.pool())) {
- dout(20) << " removing creating_pg " << p
- << " because containing pool deleted" << dendl;
- pending_inc->pg_remove.insert(p);
- ++removed;
- }
- }
-
- // deleted pools?
- for (const auto &p : pg_map.pg_stat) {
- if (!osd_map.have_pg_pool(p.first.pool())) {
- dout(20) << " removing pg_stat " << p.first << " because "
- << "containing pool deleted" << dendl;
- pending_inc->pg_remove.insert(p.first);
- ++removed;
- } else if (p.first.preferred() >= 0) {
- dout(20) << " removing localized pg " << p.first << dendl;
- pending_inc->pg_remove.insert(p.first);
- ++removed;
- }
- }
-
- // we don't want to redo this work if we can avoid it.
- pending_inc->pg_scan = epoch;
-
- dout(10) << "register_new_pgs registered " << created << " new pgs, removed "
- << removed << " uncreated pgs" << dendl;
-}
-
-
-void PGMapUpdater::update_creating_pgs(
- const OSDMap &osd_map,
- const PGMap &pg_map,
- PGMap::Incremental *pending_inc)
-{
- dout(10) << __func__ << " to " << pg_map.creating_pgs.size()
- << " pgs, osdmap epoch " << osd_map.get_epoch()
- << dendl;
-
- unsigned changed = 0;
- for (auto p = pg_map.creating_pgs.begin();
- p != pg_map.creating_pgs.end();
- ++p) {
- pg_t pgid = *p;
- pg_t on = pgid;
- auto q = pg_map.pg_stat.find(pgid);
- assert(q != pg_map.pg_stat.end());
- const pg_stat_t *s = &q->second;
-
- if (s->parent_split_bits)
- on = s->parent;
-
- vector<int> up, acting;
- int up_primary, acting_primary;
- osd_map.pg_to_up_acting_osds(
- on,
- &up,
- &up_primary,
- &acting,
- &acting_primary);
-
- if (up != s->up ||
- up_primary != s->up_primary ||
- acting != s->acting ||
- acting_primary != s->acting_primary) {
- pg_stat_t *ns = &pending_inc->pg_stat_updates[pgid];
- if (osd_map.get_epoch() > ns->reported_epoch) {
- dout(20) << __func__ << " " << pgid << " "
- << " acting_primary: " << s->acting_primary
- << " -> " << acting_primary
- << " acting: " << s->acting << " -> " << acting
- << " up_primary: " << s->up_primary << " -> " << up_primary
- << " up: " << s->up << " -> " << up
- << dendl;
-
- // only initialize if it wasn't already a pending update
- if (ns->reported_epoch == 0)
- *ns = *s;
-
- // note epoch if the target of the create message changed
- if (acting_primary != ns->acting_primary)
- ns->mapping_epoch = osd_map.get_epoch();
-
- ns->up = up;
- ns->up_primary = up_primary;
- ns->acting = acting;
- ns->acting_primary = acting_primary;
-
- ++changed;
- } else {
- dout(20) << __func__ << " " << pgid << " has pending update from newer"
- << " epoch " << ns->reported_epoch
- << dendl;
- }
- }
- }
- if (changed) {
- dout(10) << __func__ << " " << changed << " pgs changed primary" << dendl;
- }
-}
-
static void _try_mark_pg_stale(
const OSDMap& osdmap,
pg_t pgid,