non-plain format. This is consistent with the behavior for a pool
which used to hold images, but contains none. Scripts relying on
this behavior should be updated.
+
+- The MDS requires a new OSD operation TMAP2OMAP, added in this release. When
+ upgrading, be sure to upgrade and restart the ceph-osd daemons before the
+ ceph-mds daemon. The MDS will refuse to start if any up OSDs do not support
+ the new feature.
#define CEPH_FEATURE_CRUSH_V2 (1ULL<<36) /* new indep; SET_* steps */
#define CEPH_FEATURE_EXPORT_PEER (1ULL<<37)
#define CEPH_FEATURE_OSD_ERASURE_CODES (1ULL<<38)
+#define CEPH_FEATURE_OSD_TMAP2OMAP (1ULL<<38) /* overlap with EC */
/*
* The introduction of CEPH_FEATURE_OSD_SNAPMAPPER caused the feature
return 0;
}
+ objecter->init_locked();
+
+ monc->sub_want("mdsmap", 0, 0);
+ monc->renew_subs();
+
+ mds_lock.Unlock();
+
+ // verify that osds support tmap2omap
+ while (true) {
+ objecter->maybe_request_map();
+ objecter->wait_for_osd_map();
+ uint64_t osd_features = objecter->osdmap->get_up_osd_features();
+ if (osd_features & CEPH_FEATURE_OSD_TMAP2OMAP)
+ break;
+ derr << "*** one or more OSDs do not support TMAP2OMAP; upgrade OSDs before starting MDS (or downgrade MDS) ***" << dendl;
+ sleep(10);
+ }
+
+ mds_lock.Lock();
+ if (want_state == CEPH_MDS_STATE_DNE) {
+ suicide(); // we could do something more graceful here
+ }
+
timer.init();
if (wanted_state==MDSMap::STATE_BOOT && g_conf->mds_standby_replay)
whoami = -1;
messenger->set_myname(entity_name_t::MDS(whoami));
- objecter->init_locked();
-
- monc->sub_want("mdsmap", 0, 0);
- monc->renew_subs();
-
// schedule tick
reset_tick();
bool keep_balanced_budget;
bool honor_osdmap_full;
+public:
void maybe_request_map();
+private:
version_t last_seen_osdmap_version;
version_t last_seen_pgmap_version;