#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
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
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())))
);
}
}
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);
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());
}
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;
}
};
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<int> &newup,
const vector<int> &newacting,
++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);