}
if (m->get_connection()->has_feature(CEPH_FEATURE_RESEND_ON_SPLIT)) {
- if (m->get_map_epoch() < pool.info.get_last_force_op_resend()) {
- dout(7) << __func__ << " sent before last_force_op_resend "
- << pool.info.last_force_op_resend << ", dropping" << *m << dendl;
- return true;
+ // >= luminous client
+ if (m->get_connection()->has_feature(CEPH_FEATURE_SERVER_NAUTILUS)) {
+ // >= nautilus client
+ if (m->get_map_epoch() < pool.info.get_last_force_op_resend()) {
+ dout(7) << __func__ << " sent before last_force_op_resend "
+ << pool.info.last_force_op_resend
+ << ", dropping" << *m << dendl;
+ return true;
+ }
+ } else {
+ // == < nautilus client (luminous or mimic)
+ if (m->get_map_epoch() < pool.info.get_last_force_op_resend_prenautilus()) {
+ dout(7) << __func__ << " sent before last_force_op_resend_prenautilus "
+ << pool.info.last_force_op_resend_prenautilus
+ << ", dropping" << *m << dendl;
+ return true;
+ }
}
if (m->get_map_epoch() < info.history.last_epoch_split) {
dout(7) << __func__ << " pg split in "
return true;
}
} else if (m->get_connection()->has_feature(CEPH_FEATURE_OSD_POOLRESEND)) {
+ // < luminous client
if (m->get_map_epoch() < pool.info.get_last_force_op_resend_preluminous()) {
dout(7) << __func__ << " sent before last_force_op_resend_preluminous "
<< pool.info.last_force_op_resend_preluminous
f->dump_unsigned("pg_num_pending_dec_epoch", get_pg_num_pending_dec_epoch());
f->dump_stream("last_change") << get_last_change();
f->dump_stream("last_force_op_resend") << get_last_force_op_resend();
+ f->dump_stream("last_force_op_resend_prenautilus")
+ << get_last_force_op_resend_prenautilus();
f->dump_stream("last_force_op_resend_preluminous")
<< get_last_force_op_resend_preluminous();
f->dump_unsigned("auid", get_auid());
encode(opts, bl);
}
if (v >= 25) {
- encode(last_force_op_resend, bl);
+ encode(last_force_op_resend_prenautilus, bl);
}
if (v >= 26) {
encode(application_metadata, bl);
encode(pgp_num_target, bl);
encode(pg_num_pending, bl);
encode(pg_num_pending_dec_epoch, bl);
+ encode(last_force_op_resend, bl);
}
ENCODE_FINISH(bl);
}
decode(opts, bl);
}
if (struct_v >= 25) {
- decode(last_force_op_resend, bl);
+ decode(last_force_op_resend_prenautilus, bl);
} else {
- last_force_op_resend = last_force_op_resend_preluminous;
+ last_force_op_resend_prenautilus = last_force_op_resend_preluminous;
}
if (struct_v >= 26) {
decode(application_metadata, bl);
decode(pgp_num_target, bl);
decode(pg_num_pending, bl);
decode(pg_num_pending_dec_epoch, bl);
+ decode(last_force_op_resend, bl);
} else {
pg_num_target = pg_num;
pgp_num_target = pgp_num;
pg_num_pending = pg_num;
+ last_force_op_resend = last_force_op_resend_prenautilus;
}
DECODE_FINISH(bl);
calc_pg_masks();
}
out << " last_change " << p.get_last_change();
if (p.get_last_force_op_resend() ||
+ p.get_last_force_op_resend_prenautilus() ||
p.get_last_force_op_resend_preluminous())
out << " lfor " << p.get_last_force_op_resend() << "/"
+ << p.get_last_force_op_resend_prenautilus() << "/"
<< p.get_last_force_op_resend_preluminous();
if (p.get_auid())
out << " owner " << p.get_auid();
map<string,string> properties; ///< OBSOLETE
string erasure_code_profile; ///< name of the erasure code profile in OSDMap
epoch_t last_change; ///< most recent epoch changed, exclusing snapshot changes
- epoch_t last_force_op_resend; ///< last epoch that forced clients to resend
+
+ /// last epoch that forced clients to resend
+ epoch_t last_force_op_resend = 0;
+ /// last epoch that forced clients to resend (pre-nautilus clients only)
+ epoch_t last_force_op_resend_prenautilus = 0;
/// last epoch that forced clients to resend (pre-luminous clients only)
- epoch_t last_force_op_resend_preluminous;
+ epoch_t last_force_op_resend_preluminous = 0;
+
epoch_t pg_num_pending_dec_epoch = 0; ///< epoch pg_num_pending decremented
snapid_t snap_seq; ///< seq for per-pool snapshot
epoch_t snap_epoch; ///< osdmap epoch of last snap
: flags(0), type(0), size(0), min_size(0),
crush_rule(0), object_hash(0),
last_change(0),
- last_force_op_resend(0),
- last_force_op_resend_preluminous(0),
snap_seq(0), snap_epoch(0),
auid(0),
quota_max_bytes(0), quota_max_objects(0),
}
epoch_t get_last_change() const { return last_change; }
epoch_t get_last_force_op_resend() const { return last_force_op_resend; }
+ epoch_t get_last_force_op_resend_prenautilus() const {
+ return last_force_op_resend_prenautilus;
+ }
epoch_t get_last_force_op_resend_preluminous() const {
return last_force_op_resend_preluminous;
}
void set_last_force_op_resend(uint64_t t) {
last_force_op_resend = t;
+ last_force_op_resend_prenautilus = t;
last_force_op_resend_preluminous = t;
}