Skip to content

Commit

Permalink
Merge pull request #8214 from athanatos/wip-feature-bits
Browse files Browse the repository at this point in the history
Deprecate or free up a bunch of feature bits

Reviewed-by: Sage Weil <sage@redhat.com>
  • Loading branch information
liewegas committed Mar 21, 2016
2 parents 22cac93 + 4d45a3f commit 81f53df
Show file tree
Hide file tree
Showing 15 changed files with 94 additions and 248 deletions.
2 changes: 1 addition & 1 deletion src/ceph_mon.cc
Expand Up @@ -674,7 +674,7 @@ int main(int argc, const char **argv)
uint64_t supported =
CEPH_FEATURE_UID |
CEPH_FEATURE_NOSRCADDR |
CEPH_FEATURE_MONCLOCKCHECK |
DEPRECATED_CEPH_FEATURE_MONCLOCKCHECK |
CEPH_FEATURE_PGID64 |
CEPH_FEATURE_MSG_AUTH;
msgr->set_default_policy(Messenger::Policy::stateless_server(supported, 0));
Expand Down
8 changes: 1 addition & 7 deletions src/ceph_osd.cc
Expand Up @@ -494,13 +494,7 @@ int main(int argc, const char **argv)
uint64_t osd_required =
CEPH_FEATURE_UID |
CEPH_FEATURE_PGID64 |
CEPH_FEATURE_OSDENC |
CEPH_FEATURE_OSD_SNAPMAPPER |
CEPH_FEATURE_INDEP_PG_MAP |
CEPH_FEATURE_OSD_PACKED_RECOVERY |
CEPH_FEATURE_RECOVERY_RESERVATION |
CEPH_FEATURE_BACKFILL_RESERVATION |
CEPH_FEATURE_CHUNKY_SCRUB;
CEPH_FEATURE_OSDENC;

ms_public->set_default_policy(Messenger::Policy::stateless_server(supported, 0));
ms_public->set_policy_throttlers(entity_name_t::TYPE_CLIENT,
Expand Down
77 changes: 40 additions & 37 deletions src/include/ceph_features.h
Expand Up @@ -3,10 +3,16 @@

/*
* feature bits
*
* Feature reuse:
* Features marked DEPRECATED: <release> are advertized, but not checked in
* <release>
* Feature bit values marked as UNUSED are not referenced or checked by any
* versions we could be talking to and can be reused.
*/
#define CEPH_FEATURE_UID (1ULL<<0)
#define CEPH_FEATURE_NOSRCADDR (1ULL<<1)
#define CEPH_FEATURE_MONCLOCKCHECK (1ULL<<2)
#define DEPRECATED_CEPH_FEATURE_MONCLOCKCHECK (1ULL<<2) // DEPRECATED: JEWEL
#define CEPH_FEATURE_FLOCK (1ULL<<3)
#define CEPH_FEATURE_SUBSCRIBE2 (1ULL<<4)
#define CEPH_FEATURE_MONNAMES (1ULL<<5)
Expand All @@ -18,27 +24,27 @@
#define CEPH_FEATURE_PGPOOL3 (1ULL<<11)
#define CEPH_FEATURE_OSDREPLYMUX (1ULL<<12)
#define CEPH_FEATURE_OSDENC (1ULL<<13)
#define CEPH_FEATURE_OMAP (1ULL<<14)
// UNUSED: (1ULL<<14)
#define CEPH_FEATURE_MONENC (1ULL<<15)
#define CEPH_FEATURE_QUERY_T (1ULL<<16)
#define CEPH_FEATURE_INDEP_PG_MAP (1ULL<<17)
#define DEPRECATED_CEPH_FEATURE_QUERY_T (1ULL<<16) // DEPRECATED: JEWEL
#define DEPRECATED_CEPH_FEATURE_INDEP_PG_MAP (1ULL<<17) // DEPRECATED: JEWEL
#define CEPH_FEATURE_CRUSH_TUNABLES (1ULL<<18)
#define CEPH_FEATURE_CHUNKY_SCRUB (1ULL<<19)
#define CEPH_FEATURE_MON_NULLROUTE (1ULL<<20)
#define CEPH_FEATURE_MON_GV (1ULL<<21)
#define CEPH_FEATURE_BACKFILL_RESERVATION (1ULL<<22)
#define DEPRECATED_CEPH_FEATURE_CHUNKY_SCRUB (1ULL<<19) // DEPRECATED: JEWEL
#define DEPRECATED_CEPH_FEATURE_MON_NULLROUTE (1ULL<<20) // DEPRECATED: JEWEL
// UNUSED: (1ULL<<21)
#define DEPRECATED_CEPH_FEATURE_BACKFILL_RESERVATION (1ULL<<22) // DEPRECATED: JEWEL
#define CEPH_FEATURE_MSG_AUTH (1ULL<<23)
#define CEPH_FEATURE_RECOVERY_RESERVATION (1ULL<<24)
#define DEPRECATED_CEPH_FEATURE_RECOVERY_RESERVATION (1ULL<<24) // DEPRECATED: JEWEL
#define CEPH_FEATURE_CRUSH_TUNABLES2 (1ULL<<25)
#define CEPH_FEATURE_CREATEPOOLID (1ULL<<26)
#define CEPH_FEATURE_REPLY_CREATE_INODE (1ULL<<27)
#define CEPH_FEATURE_OSD_HBMSGS (1ULL<<28)
// UNUSED: (1ULL<<28)
#define CEPH_FEATURE_MDSENC (1ULL<<29)
#define CEPH_FEATURE_OSDHASHPSPOOL (1ULL<<30)
#define CEPH_FEATURE_MON_SINGLE_PAXOS (1ULL<<31)
#define CEPH_FEATURE_OSD_SNAPMAPPER (1ULL<<32)
#define CEPH_FEATURE_MON_SCRUB (1ULL<<33)
#define CEPH_FEATURE_OSD_PACKED_RECOVERY (1ULL<<34)
#define DEPRECATED_CEPH_FEATURE_OSD_SNAPMAPPER (1ULL<<32) // DEPRECATED: JEWEL
#define DEPRECATED_CEPH_FEATURE_MON_SCRUB (1ULL<<33)
#define DEPRECATED_CEPH_FEATURE_OSD_PACKED_RECOVERY (1ULL<<34) // DEPRECATED: JEWEL
#define CEPH_FEATURE_OSD_CACHEPOOL (1ULL<<35)
#define CEPH_FEATURE_CRUSH_V2 (1ULL<<36) /* new indep; SET_* steps */
#define CEPH_FEATURE_EXPORT_PEER (1ULL<<37)
Expand All @@ -53,16 +59,16 @@
#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)
#define DEPRECATED_CEPH_FEATURE_OSD_SET_ALLOC_HINT (1ULL<<45) // DEPRECATED: JEWEL
#define CEPH_FEATURE_OSD_FADVISE_FLAGS (1ULL<<46)
#define CEPH_FEATURE_OSD_REPOP (1ULL<<46) /* overlap with fadvise */
#define CEPH_FEATURE_OSD_OBJECT_DIGEST (1ULL<<46) /* overlap with fadvise */
#define CEPH_FEATURE_OSD_TRANSACTION_MAY_LAYOUT (1ULL<<46) /* overlap w/ fadvise */
#define DEPRECATED_CEPH_FEATURE_OSD_REPOP (1ULL<<46) // DEPRECATED: JEWEL (can't remove until all 1<<46 are ready)
#define DEPRECATED_CEPH_FEATURE_OSD_OBJECT_DIGEST (1ULL<<46) // DEPRECATED: JEWEL (can't remove until all 1<<46 are ready)
#define DEPRECATED_CEPH_FEATURE_OSD_TRANSACTION_MAY_LAYOUT (1ULL<<46) // DEPRECATED: JEWEL (can't remove until all 1<<46 are ready)
#define CEPH_FEATURE_MDS_QUOTA (1ULL<<47)
#define CEPH_FEATURE_CRUSH_V4 (1ULL<<48) /* straw2 buckets */
#define CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY (1ULL<<49)
#define DEPRECATED_CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY (1ULL<<49) // DEPRECATED: JEWEL (can't remove until all 1<<49 are ready)
// duplicated since it was introduced at the same time as MIN_SIZE_RECOVERY
#define CEPH_FEATURE_OSD_PROXY_FEATURES (1ULL<<49) /* overlap w/ above */
#define DEPRECATED_CEPH_FEATURE_OSD_PROXY_FEATURES (1ULL<<49) /* overlap w/ above */
#define CEPH_FEATURE_MON_METADATA (1ULL<<50)
#define CEPH_FEATURE_OSD_BITWISE_HOBJ_SORT (1ULL<<51) /* can sort objs bitwise */
#define CEPH_FEATURE_OSD_PROXY_WRITE_FEATURES (1ULL<<52)
Expand Down Expand Up @@ -111,7 +117,7 @@ static inline unsigned long long ceph_sanitize_features(unsigned long long f) {
#define CEPH_FEATURES_ALL \
(CEPH_FEATURE_UID | \
CEPH_FEATURE_NOSRCADDR | \
CEPH_FEATURE_MONCLOCKCHECK | \
DEPRECATED_CEPH_FEATURE_MONCLOCKCHECK | \
CEPH_FEATURE_FLOCK | \
CEPH_FEATURE_SUBSCRIBE2 | \
CEPH_FEATURE_MONNAMES | \
Expand All @@ -123,29 +129,26 @@ static inline unsigned long long ceph_sanitize_features(unsigned long long f) {
CEPH_FEATURE_PGPOOL3 | \
CEPH_FEATURE_OSDREPLYMUX | \
CEPH_FEATURE_OSDENC | \
CEPH_FEATURE_OMAP | \
CEPH_FEATURE_QUERY_T | \
DEPRECATED_CEPH_FEATURE_QUERY_T | \
CEPH_FEATURE_MONENC | \
CEPH_FEATURE_INDEP_PG_MAP | \
DEPRECATED_CEPH_FEATURE_INDEP_PG_MAP | \
CEPH_FEATURE_CRUSH_TUNABLES | \
CEPH_FEATURE_CHUNKY_SCRUB | \
CEPH_FEATURE_MON_NULLROUTE | \
CEPH_FEATURE_MON_GV | \
CEPH_FEATURE_BACKFILL_RESERVATION | \
DEPRECATED_CEPH_FEATURE_CHUNKY_SCRUB | \
DEPRECATED_CEPH_FEATURE_MON_NULLROUTE | \
DEPRECATED_CEPH_FEATURE_BACKFILL_RESERVATION | \
CEPH_FEATURE_MSG_AUTH | \
CEPH_FEATURE_RECOVERY_RESERVATION | \
DEPRECATED_CEPH_FEATURE_RECOVERY_RESERVATION | \
CEPH_FEATURE_CRUSH_TUNABLES2 | \
CEPH_FEATURE_CREATEPOOLID | \
CEPH_FEATURE_REPLY_CREATE_INODE | \
CEPH_FEATURE_OSD_HBMSGS | \
CEPH_FEATURE_MDSENC | \
CEPH_FEATURE_OSDHASHPSPOOL | \
CEPH_FEATURE_NEW_OSDOP_ENCODING | \
CEPH_FEATURE_NEW_OSDOPREPLY_ENCODING | \
CEPH_FEATURE_MON_SINGLE_PAXOS | \
CEPH_FEATURE_OSD_SNAPMAPPER | \
CEPH_FEATURE_MON_SCRUB | \
CEPH_FEATURE_OSD_PACKED_RECOVERY | \
DEPRECATED_CEPH_FEATURE_OSD_SNAPMAPPER | \
DEPRECATED_CEPH_FEATURE_MON_SCRUB | \
DEPRECATED_CEPH_FEATURE_OSD_PACKED_RECOVERY | \
CEPH_FEATURE_OSD_CACHEPOOL | \
CEPH_FEATURE_CRUSH_V2 | \
CEPH_FEATURE_EXPORT_PEER | \
Expand All @@ -157,14 +160,14 @@ 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 | \
DEPRECATED_CEPH_FEATURE_OSD_SET_ALLOC_HINT | \
CEPH_FEATURE_OSD_FADVISE_FLAGS | \
CEPH_FEATURE_OSD_REPOP | \
CEPH_FEATURE_OSD_OBJECT_DIGEST | \
CEPH_FEATURE_OSD_TRANSACTION_MAY_LAYOUT | \
DEPRECATED_CEPH_FEATURE_OSD_REPOP | \
DEPRECATED_CEPH_FEATURE_OSD_OBJECT_DIGEST | \
DEPRECATED_CEPH_FEATURE_OSD_TRANSACTION_MAY_LAYOUT | \
CEPH_FEATURE_MDS_QUOTA | \
CEPH_FEATURE_CRUSH_V4 | \
CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY | \
DEPRECATED_CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY | \
CEPH_FEATURE_MON_METADATA | \
CEPH_FEATURE_OSD_BITWISE_HOBJ_SORT | \
CEPH_FEATURE_ERASURE_CODE_PLUGINS_V3 | \
Expand Down
8 changes: 2 additions & 6 deletions src/messages/MMonPaxos.h
Expand Up @@ -90,10 +90,7 @@ class MMonPaxos : public Message {
}

void encode_payload(uint64_t features) {
if ((features & CEPH_FEATURE_MONCLOCKCHECK) == 0)
header.version = 0;
else
header.version = HEAD_VERSION;
header.version = HEAD_VERSION;
::encode(epoch, payload);
::encode(op, payload);
::encode(first_committed, payload);
Expand All @@ -102,8 +99,7 @@ class MMonPaxos : public Message {
::encode(pn, payload);
::encode(uncommitted_pn, payload);
::encode(lease_timestamp, payload);
if (features & CEPH_FEATURE_MONCLOCKCHECK)
::encode(sent_timestamp, payload);
::encode(sent_timestamp, payload);
::encode(latest_version, payload);
::encode(latest_value, payload);
::encode(values, payload);
Expand Down
7 changes: 0 additions & 7 deletions src/messages/MRoute.h
Expand Up @@ -73,13 +73,6 @@ struct MRoute : public Message {
void encode_payload(uint64_t features) {
::encode(session_mon_tid, payload);
::encode(dest, payload);
if ((features & CEPH_FEATURE_MON_NULLROUTE) == 0) {
header.version = 1;
header.compat_version = 1;
assert(msg);
encode_message(msg, features, payload);
return;
}
bool m = msg ? true : false;
::encode(m, payload);
if (msg)
Expand Down
23 changes: 5 additions & 18 deletions src/mon/Monitor.cc
Expand Up @@ -3254,19 +3254,11 @@ void Monitor::no_reply(MonOpRequestRef op)
Message *req = op->get_req();

if (session->proxy_con) {
if (get_quorum_features() & CEPH_FEATURE_MON_NULLROUTE) {
dout(10) << "no_reply to " << req->get_source_inst()
<< " via " << session->proxy_con->get_peer_addr()
<< " for request " << *req << dendl;
session->proxy_con->send_message(new MRoute(session->proxy_tid, NULL));
op->mark_event("no_reply: send routed request");
} else {
dout(10) << "no_reply no quorum nullroute feature for "
<< req->get_source_inst()
<< " via " << session->proxy_con->get_peer_addr()
<< " for request " << *req << dendl;
op->mark_event("no_reply: no quorum support");
}
dout(10) << "no_reply to " << req->get_source_inst()
<< " via " << session->proxy_con->get_peer_addr()
<< " for request " << *req << dendl;
session->proxy_con->send_message(new MRoute(session->proxy_tid, NULL));
op->mark_event("no_reply: send routed request");
} else {
dout(10) << "no_reply to " << req->get_source_inst()
<< " " << *req << dendl;
Expand Down Expand Up @@ -4488,11 +4480,6 @@ int Monitor::scrub_start()
dout(10) << __func__ << dendl;
assert(is_leader());

if ((get_quorum_features() & CEPH_FEATURE_MON_SCRUB) == 0) {
clog->warn() << "scrub not supported by entire quorum\n";
return -EOPNOTSUPP;
}

if (!scrub_result.empty()) {
clog->info() << "scrub already in progress\n";
return -EBUSY;
Expand Down
3 changes: 0 additions & 3 deletions src/osd/ECBackend.cc
Expand Up @@ -835,7 +835,6 @@ void ECBackend::handle_sub_write(
if (!get_parent()->pgb_is_primary())
get_parent()->update_stats(op.stats);
ObjectStore::Transaction localt;
localt.set_use_tbl(op.t.get_use_tbl());
if (!op.temp_added.empty()) {
add_temp_objs(op.temp_added);
}
Expand Down Expand Up @@ -1778,10 +1777,8 @@ void ECBackend::start_write(Op *op) {
i != get_parent()->get_actingbackfill_shards().end();
++i) {
trans[i->shard];
trans[i->shard].set_use_tbl(parent->transaction_use_tbl());
}
ObjectStore::Transaction empty;
empty.set_use_tbl(parent->transaction_use_tbl());

op->t->generate_transactions(
op->unstable_hash_infos,
Expand Down
17 changes: 1 addition & 16 deletions src/osd/PG.cc
Expand Up @@ -1402,7 +1402,6 @@ bool PG::choose_acting(pg_shard_t &auth_log_shard_id)
// Otherwise, we will go "peered", but not "active"
if (num_want_acting < pool.info.min_size &&
(pool.info.ec_pool() ||
(!(get_min_peer_features() & CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY)) ||
!cct->_conf->osd_allow_recovery_below_min_size)) {
want_acting.clear();
dout(10) << "choose_acting failed, below min size" << dendl;
Expand Down Expand Up @@ -4071,10 +4070,7 @@ void PG::chunky_scrub(ThreadPool::TPHandle &handle)
osd->clog->info(oss);
}

if (get_min_acting_features() & CEPH_FEATURE_OSD_OBJECT_DIGEST)
scrubber.seed = -1; // better, and enables oi digest checks
else
scrubber.seed = 0; // compat
scrubber.seed = -1;

break;

Expand Down Expand Up @@ -4321,13 +4317,8 @@ void PG::scrub_compare_maps()
maps[*i] = &scrubber.received_maps[*i];
}

// can we relate scrub digests to oi digests?
bool okseed = (get_min_upacting_features() & CEPH_FEATURE_OSD_OBJECT_DIGEST);
assert(okseed == (scrubber.seed == 0xffffffff));

get_pgbackend()->be_compare_scrubmaps(
maps,
okseed,
state_test(PG_STATE_REPAIR),
scrubber.missing,
scrubber.inconsistent,
Expand Down Expand Up @@ -6991,12 +6982,6 @@ boost::statechart::result PG::RecoveryState::Stray::react(const MLogRec& logevt)

ObjectStore::Transaction* t = context<RecoveryMachine>().get_cur_transaction();
if (msg->info.last_backfill == hobject_t()) {
if (!(msg->get_connection()->get_features() & CEPH_FEATURE_OSD_MIN_SIZE_RECOVERY)) {
dout(10) << "Got logevt resetting backfill from peer featuring bug"
<< " 10780, setting msg->info.last_epoch_started to logevt.query_epoch,"
<< " which is the activation epoch." << dendl;
msg->info.last_epoch_started = msg->get_query_epoch();
}
// restart backfill
pg->unreg_next_scrub();
pg->info = msg->info;
Expand Down
17 changes: 6 additions & 11 deletions src/osd/PGBackend.cc
Expand Up @@ -400,7 +400,6 @@ enum scrub_error_type PGBackend::be_compare_scrub_objects(
pg_shard_t auth_shard,
const ScrubMap::object &auth,
const object_info_t& auth_oi,
bool okseed,
const ScrubMap::object &candidate,
shard_info_wrapper &result,
ostream &errorstream)
Expand All @@ -419,7 +418,7 @@ enum scrub_error_type PGBackend::be_compare_scrub_objects(
if (error != CLEAN)
errorstream << ", ";
error = DEEP_ERROR;
bool known = okseed && auth_oi.is_data_digest() &&
bool known = auth_oi.is_data_digest() &&
auth.digest == auth_oi.data_digest;
errorstream << "data_digest 0x" << std::hex << candidate.digest
<< " != "
Expand All @@ -434,7 +433,7 @@ enum scrub_error_type PGBackend::be_compare_scrub_objects(
if (error != CLEAN)
errorstream << ", ";
error = DEEP_ERROR;
bool known = okseed && auth_oi.is_omap_digest() &&
bool known = auth_oi.is_omap_digest() &&
auth.omap_digest == auth_oi.omap_digest;
errorstream << "omap_digest 0x" << std::hex << candidate.omap_digest
<< " != "
Expand Down Expand Up @@ -494,7 +493,6 @@ map<pg_shard_t, ScrubMap *>::const_iterator
PGBackend::be_select_auth_object(
const hobject_t &obj,
const map<pg_shard_t,ScrubMap*> &maps,
bool okseed,
object_info_t *auth_oi)
{
map<pg_shard_t, ScrubMap *>::const_iterator auth = maps.end();
Expand Down Expand Up @@ -556,7 +554,7 @@ map<pg_shard_t, ScrubMap *>::const_iterator
continue;
}
if (parent->get_pool().is_replicated()) {
if (okseed && oi.is_data_digest() && i->second.digest_present &&
if (oi.is_data_digest() && i->second.digest_present &&
oi.data_digest != i->second.digest) {
dout(10) << __func__ << ": rejecting osd " << j->first
<< " for obj " << obj
Expand All @@ -565,7 +563,7 @@ map<pg_shard_t, ScrubMap *>::const_iterator
<< std::dec << dendl;
continue;
}
if (okseed && oi.is_omap_digest() && i->second.omap_digest_present &&
if (oi.is_omap_digest() && i->second.omap_digest_present &&
oi.omap_digest != i->second.omap_digest) {
dout(10) << __func__ << ": rejecting osd " << j->first
<< " for obj " << obj
Expand All @@ -586,7 +584,6 @@ map<pg_shard_t, ScrubMap *>::const_iterator

void PGBackend::be_compare_scrubmaps(
const map<pg_shard_t,ScrubMap*> &maps,
bool okseed,
bool repair,
map<hobject_t, set<pg_shard_t>, hobject_t::BitwiseComparator> &missing,
map<hobject_t, set<pg_shard_t>, hobject_t::BitwiseComparator> &inconsistent,
Expand Down Expand Up @@ -616,7 +613,7 @@ void PGBackend::be_compare_scrubmaps(
++k) {
object_info_t auth_oi;
map<pg_shard_t, ScrubMap *>::const_iterator auth =
be_select_auth_object(*k, maps, okseed, &auth_oi);
be_select_auth_object(*k, maps, &auth_oi);
inconsistent_obj_wrapper object_error{*k};

list<pg_shard_t> auth_list;
Expand Down Expand Up @@ -645,7 +642,6 @@ void PGBackend::be_compare_scrubmaps(
be_compare_scrub_objects(auth->first,
auth_object,
auth_oi,
okseed,
j->second->objects[*k],
shard_info,
ss);
Expand Down Expand Up @@ -683,8 +679,7 @@ void PGBackend::be_compare_scrubmaps(
object_error.add_shard(auth->first, auth_shard);
}

if (okseed &&
clean &&
if (clean &&
parent->get_pool().is_replicated()) {
enum {
NO = 0,
Expand Down

0 comments on commit 81f53df

Please sign in to comment.