void PGMonitor::update_from_paxos(bool *need_bootstrap)
{
+ if (did_delete)
+ return;
+
+ if (get_value("deleted")) {
+ did_delete = true;
+ dout(10) << __func__ << " deleted, clearing in-memory PGMap" << dendl;
+ pg_map = PGMap();
+ return;
+ }
+
version_t version = get_last_committed();
if (version == pg_map.version)
return;
void PGMonitor::post_paxos_update()
{
+ if (did_delete)
+ return;
dout(10) << __func__ << dendl;
OSDMap& osdmap = mon->osdmon()->osdmap;
if (mon->monmap->get_required_features().contains_all(
{
if (!mon->is_leader())
return;
+ if (did_delete)
+ return;
utime_t now(ceph_clock_now());
utime_t timeo(g_conf->mon_osd_report_timeout, 0);
void PGMonitor::create_pending()
{
+ do_delete = false;
pending_inc = PGMap::Incremental();
pending_inc.version = pg_map.version + 1;
if (pg_map.version == 0) {
void PGMonitor::encode_pending(MonitorDBStore::TransactionRef t)
{
+ string prefix = pgmap_meta_prefix;
+ if (do_delete) {
+ dout(1) << __func__ << " clearing pgmap data at v" << pending_inc.version
+ << dendl;
+ do_delete = false;
+ for (auto key : { "version", "stamp", "last_osdmap_epoch",
+ "last_pg_scan", "full_ratio", "nearfull_ratio" }) {
+ t->erase(prefix, key);
+ }
+ for (auto& p : pg_map.pg_stat) {
+ t->erase(prefix, stringify(p.first));
+ }
+ for (auto& p : pg_map.osd_stat) {
+ t->erase(prefix, stringify(p.first));
+ }
+ put_last_committed(t, pending_inc.version);
+ put_value(t, "deleted", 1);
+ return;
+ }
+
version_t version = pending_inc.version;
dout(10) << __func__ << " v " << version << dendl;
assert(get_last_committed() + 1 == version);
uint64_t features = mon->get_quorum_con_features();
- string prefix = pgmap_meta_prefix;
-
t->put(prefix, "version", pending_inc.version);
{
bufferlist bl;
if (mon->is_peon())
return; // whatever.
+ if (did_delete)
+ return;
+
if (pg_map.last_osdmap_epoch >= epoch) {
dout(10) << __func__ << " already seen " << pg_map.last_osdmap_epoch
<< " >= " << epoch << dendl;
return;
}
+ const OSDMap& osdmap = mon->osdmon()->osdmap;
+ if (!did_delete && osdmap.require_osd_release >= CEPH_RELEASE_LUMINOUS) {
+ // delete all my data
+ dout(1) << __func__ << " will clear pg_map data" << dendl;
+ do_delete = true;
+ propose_pending();
+ return;
+ }
+
// osds that went up or down
set<int> need_check_down_pg_osds;
// apply latest map(s)
- const OSDMap& osdmap = mon->osdmon()->osdmap;
epoch = std::max(epoch, osdmap.get_epoch());
for (epoch_t e = pg_map.last_osdmap_epoch+1;
e <= epoch;
t->put(get_service_name(), key, bl);
}
+ /**
+ * Put integer value @v into the key @p key.
+ *
+ * @param t A transaction to which we will add this put operation
+ * @param key The key to which we will add the value
+ * @param v An integer
+ */
+ void put_value(MonitorDBStore::TransactionRef t,
+ const string& key, version_t v) {
+ t->put(get_service_name(), key, v);
+ }
+
/**
* @}
*/