DEFINE_CEPH_FEATURE(21, 2, OSDMAP_PG_UPMAP) // overlap
DEFINE_CEPH_FEATURE(21, 2, CRUSH_CHOOSE_ARGS) // overlap
DEFINE_CEPH_FEATURE_RETIRED(22, 1, BACKFILL_RESERVATION, JEWEL, LUMINOUS)
-// available
+DEFINE_CEPH_FEATURE(22, 3, STRETCH_MODE)
DEFINE_CEPH_FEATURE(23, 1, MSG_AUTH) // 3.19 req (unless nocephx_require_signatures)
DEFINE_CEPH_FEATURE_RETIRED(24, 1, RECOVERY_RESERVATION, JEWEL, LUMINOUS)
DEFINE_CEPH_FEATURE(24, 2, RECOVERY_RESERVATION_2)
CEPH_FEATURE_CEPHX_V2 | \
CEPH_FEATURE_OSD_PGLOG_HARDLIMIT | \
CEPH_FEATUREMASK_SERVER_OCTOPUS | \
+ CEPH_FEATUREMASK_STRETCH_MODE | \
CEPH_FEATUREMASK_OSD_REPOP_MLCOD | \
CEPH_FEATUREMASK_SERVER_PACIFIC | \
0ULL)
return false;
}
{
- struct Plugger {
- Paxos *p;
- Plugger(Paxos *p) : p(p) { p->plug(); }
- ~Plugger() { p->unplug(); }
- } plugger(paxos);
if (monmap.stretch_mode_enabled) {
ss << "stretch mode is already engaged";
err = -EINVAL;
err = -EINVAL;
goto reply;
}
+ //okay, initial arguments make sense, check pools and cluster state
+ err = mon->osdmon()->check_cluster_features(CEPH_FEATUREMASK_STRETCH_MODE, ss);
+ if (err)
+ goto reply;
+ struct Plugger {
+ Paxos *p;
+ Plugger(Paxos *p) : p(p) { p->plug(); }
+ ~Plugger() { p->unplug(); }
+ } plugger(paxos);
+
set<pg_pool_t*> pools;
bool okay = false;
int errcode = 0;
- //okay, initial arguments make sense, check pools and cluster state
+
mon->osdmon()->try_enable_stretch_mode_pools(ss, &okay, &errcode,
&pools, new_crush_rule);
if (!okay) {
goto ignore;
}
+ if (osdmap.stretch_mode_enabled &&
+ !(m->osd_features & CEPH_FEATUREMASK_STRETCH_MODE)) {
+ mon->clog->info() << "disallowing boot of OSD "
+ << m->get_orig_source_inst()
+ << " because stretch mode is on and OSD lacks support";
+ goto ignore;
+ }
+
// already booted?
if (osdmap.is_up(from) &&
osdmap.get_addrs(from).legacy_equals(m->get_orig_source_addrs()) &&
void encode_trim_extra(MonitorDBStore::TransactionRef tx, version_t first) override;
void update_msgr_features();
- int check_cluster_features(uint64_t features, std::stringstream &ss);
/**
* check if the cluster supports the features required by the
* given crush map. Outputs the daemons which don't support it
void send_full(MonOpRequestRef op);
void send_incremental(MonOpRequestRef op, epoch_t first);
public:
+ /**
+ * Make sure the existing (up) OSDs support the given features
+ * @return 0 on success, or an error code if any OSDs re missing features.
+ * @param ss Filled in with ane explanation of failure, if any
+ */
+ int check_cluster_features(uint64_t features, std::stringstream &ss);
// @param req an optional op request, if the osdmaps are replies to it. so
// @c Monitor::send_reply() can mark_event with it.
void send_incremental(epoch_t first, MonSession *session, bool onetime,
features |= kraken_features;
}
mask |= kraken_features;
+
+ if (stretch_mode_enabled) {
+ features |= CEPH_FEATUREMASK_STRETCH_MODE;
+ mask |= CEPH_FEATUREMASK_STRETCH_MODE;
+ }
}
if (require_min_compat_client >= ceph_release_t::nautilus) {
CEPH_FEATUREMASK_SERVER_MIMIC |
CEPH_FEATUREMASK_SERVER_NAUTILUS |
CEPH_FEATUREMASK_SERVER_OCTOPUS;
- // TODO: add a SIGNIFICANT_FEATURE for stretch mode...
struct addrs_s {
mempool::osdmap::vector<std::shared_ptr<entity_addrvec_t> > client_addrs;