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 <dzafman@redhat.com>
(cherry picked from commit
9b39033f2b2bcdd2be0f6da4dff06023d0f77499)
Conflicts:
src/include/ceph_features.h
src/osd/PG.cc
src/osd/PG.h
src/osd/ReplicatedPG.cc
#define CEPH_FEATURE_OSD_PRIMARY_AFFINITY (1ULL<<41) /* overlap w/ tunables3 */
#define CEPH_FEATURE_MSGR_KEEPALIVE2 (1ULL<<42)
#define CEPH_FEATURE_OSD_POOLRESEND (1ULL<<43)
+#define CEPH_FEATURE_OSD_SET_ALLOC_HINT (1ULL<<45)
/*
* The introduction of CEPH_FEATURE_OSD_SNAPMAPPER caused the feature
CEPH_FEATURE_OSD_PRIMARY_AFFINITY | \
CEPH_FEATURE_MSGR_KEEPALIVE2 | \
CEPH_FEATURE_OSD_POOLRESEND | \
+ CEPH_FEATURE_OSD_SET_ALLOC_HINT | \
0ULL)
#define CEPH_FEATURES_SUPPORTED_DEFAULT CEPH_FEATURES_ALL
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())))
);
}
}
finish_sync_event(NULL),
scrub_after_recovery(false),
active_pushes(0),
- recovery_state(this)
+ recovery_state(this),
+ peer_features((uint64_t)-1)
{
#ifdef PG_DEBUG_REFS
osd->add_pgid(p, this);
pg->publish_stats_to_osd();
+ pg->reset_peer_features();
get_infos();
if (peer_info_requested.empty() && !prior_set->pg_down) {
post_event(GotInfo());
}
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) {
break;
}
}
+ dout(20) << "Common features: " << hex << pg->get_min_peer_features() << dec << dendl;
post_event(GotInfo());
}
}
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;
}
};
// Prevent copying
PG(const PG& rhs);
PG& operator=(const PG& rhs);
+ uint64_t peer_features;
public:
spg_t get_pgid() const { return info.pgid; }
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<int> &newup,
const vector<int> &newacting,
case CEPH_OSD_OP_SETALLOCHINT:
++ctx->num_write;
{
+ if (!(get_min_peer_features() & CEPH_FEATURE_OSD_SET_ALLOC_HINT)) {
+ result = -EOPNOTSUPP;
+ break;
+ }
if (!obs.exists) {
ctx->mod_desc.create();
t->touch(soid);