From 9b39033f2b2bcdd2be0f6da4dff06023d0f77499 Mon Sep 17 00:00:00 2001 From: David Zafman Date: Wed, 24 Sep 2014 16:02:21 -0700 Subject: [PATCH] osd: Return EOPNOTSUPP if a set-alloc-hint occurs with OSDs that don't support Add CEPH_FEATURE_OSD_SET_ALLOC_HINT feature bit Collect the intersection of all peer feature bits during peering When handling CEPH_OSD_OP_SETALLOCHINT check that all OSDs support it by checking for CEPH_FEATURE_OSD_SET_ALLOC_HINT feature bit. Fixes: #9419 Backport: firefly Signed-off-by: David Zafman --- src/include/ceph_features.h | 2 ++ src/osd/OSD.cc | 3 ++- src/osd/PG.cc | 8 +++++++- src/osd/PG.h | 13 ++++++++++--- src/osd/ReplicatedPG.cc | 4 ++++ 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/src/include/ceph_features.h b/src/include/ceph_features.h index 3ee73fbab7d0..9b9ef5c0c872 100644 --- a/src/include/ceph_features.h +++ b/src/include/ceph_features.h @@ -53,6 +53,7 @@ #define CEPH_FEATURE_MSGR_KEEPALIVE2 (1ULL<<42) #define CEPH_FEATURE_OSD_POOLRESEND (1ULL<<43) #define CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2 (1ULL<<44) +#define CEPH_FEATURE_OSD_SET_ALLOC_HINT (1ULL<<45) /* * The introduction of CEPH_FEATURE_OSD_SNAPMAPPER caused the feature @@ -126,6 +127,7 @@ static inline unsigned long long ceph_sanitize_features(unsigned long long f) { CEPH_FEATURE_MSGR_KEEPALIVE2 | \ CEPH_FEATURE_OSD_POOLRESEND | \ CEPH_FEATURE_ERASURE_CODE_PLUGINS_V2 | \ + CEPH_FEATURE_OSD_SET_ALLOC_HINT | \ 0ULL) #define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index 4e735b085f8d..482df0024db5 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -7328,7 +7328,8 @@ void OSD::handle_pg_notify(OpRequestRef op) PG::CephPeeringEvtRef( new PG::CephPeeringEvt( it->first.epoch_sent, it->first.query_epoch, - PG::MNotifyRec(pg_shard_t(from, it->first.from), it->first))) + PG::MNotifyRec(pg_shard_t(from, it->first.from), it->first, + op->get_req()->get_connection()->get_features()))) ); } } diff --git a/src/osd/PG.cc b/src/osd/PG.cc index ae04f3875d86..ad093f7fd81b 100644 --- a/src/osd/PG.cc +++ b/src/osd/PG.cc @@ -202,7 +202,8 @@ PG::PG(OSDService *o, OSDMapRef curmap, scrub_after_recovery(false), active_pushes(0), recovery_state(this), - pg_id(p) + pg_id(p), + peer_features((uint64_t)-1) { #ifdef PG_DEBUG_REFS osd->add_pgid(p, this); @@ -6693,6 +6694,7 @@ PG::RecoveryState::GetInfo::GetInfo(my_context ctx) if (!prior_set.get()) pg->build_prior(prior_set); + pg->reset_peer_features(); get_infos(); if (peer_info_requested.empty() && !prior_set->pg_down) { post_event(GotInfo()); @@ -6768,6 +6770,9 @@ boost::statechart::result PG::RecoveryState::GetInfo::react(const MNotifyRec& in } get_infos(); } + dout(20) << "Adding osd: " << infoevt.from.osd << " features: " + << hex << infoevt.features << dec << dendl; + pg->apply_peer_features(infoevt.features); // are we done getting everything? if (peer_info_requested.empty() && !prior_set->pg_down) { @@ -6826,6 +6831,7 @@ boost::statechart::result PG::RecoveryState::GetInfo::react(const MNotifyRec& in break; } } + dout(20) << "Common features: " << hex << pg->get_min_peer_features() << dec << dendl; post_event(GotInfo()); } } diff --git a/src/osd/PG.h b/src/osd/PG.h index 5f45e77ad8c9..f17f3aaa93ee 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -1302,10 +1302,12 @@ public: struct MNotifyRec : boost::statechart::event< MNotifyRec > { pg_shard_t from; pg_notify_t notify; - MNotifyRec(pg_shard_t from, pg_notify_t ¬ify) : - from(from), notify(notify) {} + uint64_t features; + MNotifyRec(pg_shard_t from, pg_notify_t ¬ify, uint64_t f) : + from(from), notify(notify), features(f) {} void print(std::ostream *out) const { - *out << "MNotifyRec from " << from << " notify: " << notify; + *out << "MNotifyRec from " << from << " notify: " << notify + << " features: 0x" << hex << features << dec; } }; @@ -1988,11 +1990,16 @@ public: PG(const PG& rhs); PG& operator=(const PG& rhs); const spg_t pg_id; + uint64_t peer_features; public: const spg_t& get_pgid() const { return pg_id; } int get_nrep() const { return acting.size(); } + void reset_peer_features() { peer_features = (uint64_t)-1; } + uint64_t get_min_peer_features() { return peer_features; } + void apply_peer_features(uint64_t f) { peer_features &= f; } + void init_primary_up_acting( const vector &newup, const vector &newacting, diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 44f4b92400ae..a9aebc6a2c3a 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -3800,6 +3800,10 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) ++ctx->num_write; { tracepoint(osd, do_osd_op_pre_setallochint, soid.oid.name.c_str(), soid.snap.val, op.alloc_hint.expected_object_size, op.alloc_hint.expected_write_size); + if (!(get_min_peer_features() & CEPH_FEATURE_OSD_SET_ALLOC_HINT)) { + result = -EOPNOTSUPP; + break; + } if (!obs.exists) { ctx->mod_desc.create(); t->touch(soid); -- 2.47.3