f(LIST_WATCHERS, __CEPH_OSD_OP(RD, DATA, 9), "list-watchers") \
\
f(LIST_SNAPS, __CEPH_OSD_OP(RD, DATA, 10), "list-snaps") \
- \
+ \
+ f(GET_INTERNAL_VERSIONS, __CEPH_OSD_OP(RD, DATA, 33), "get-internal-versions") \
+ \
/* sync */ \
f(SYNC_READ, __CEPH_OSD_OP(RD, DATA, 11), "sync_read") \
\
// check for op with rwordered and rebalance or localize reads
if (m->has_flag(CEPH_OSD_FLAGS_DIRECT_READ) && op->rwordered()) {
- dout(4) << __func__ << ": rebelance or localized reads with rwordered not allowed "
+ dout(4) << __func__ << ": rebalance or localized reads with rwordered not allowed "
<< *m << dendl;
osd->reply_op_error(op, -EINVAL);
return;
}
if (m->get_flags() & CEPH_OSD_FLAG_EC_DIRECT_READ) {
+ // This means "is in acting set"
if (is_primary() || is_nonprimary()) {
op->set_ec_direct_read();
} else {
op->may_read() &&
!(op->may_write() || op->may_cache())) {
// balanced reads; any replica will do
+ // This means "is in acting set"
if (!(is_primary() || is_nonprimary())) {
osd->handle_misdirected_op(this, op);
return;
}
break;
+ case CEPH_OSD_OP_GET_INTERNAL_VERSIONS: {
+ std::map<shard_id_t, eversion_t> out;
+ result = get_internal_versions(soid, &out);
+ if (result >= 0) {
+ encode(out, osd_op.outdata);
+ }
+ }
+ break;
+
case CEPH_OSD_OP_LIST_WATCHERS:
++ctx->num_read;
{
return r;
}
+int PrimaryLogPG::get_internal_versions(const hobject_t& soid,
+ std::map<shard_id_t, eversion_t>* out) {
+ ObjectContextRef obc = get_object_context(soid, false);
+
+ if (!obc || !obc->obs.exists) {
+ return -ENOENT;
+ }
+
+ if (is_primary() && pool.info.is_erasure()) {
+ for (unsigned int i = 0; i < pool.info.get_size(); ++i) {
+ (*out)[shard_id_t(i)] = obc->obs.oi.version;
+ }
+ for (const auto& [shard, version] : obc->obs.oi.shard_versions) {
+ out->at(shard) = version;
+ }
+ } else {
+ (*out)[pg_whoami.shard] = obc->obs.oi.version;
+ }
+ return 0;
+}
+
bool PrimaryLogPG::check_failsafe_full() {
return osd->check_failsafe_full(get_dpp());
}
int getattrs_maybe_cache(
ObjectContextRef obc,
std::map<std::string, ceph::buffer::list, std::less<>> *out);
+ int get_internal_versions(const hobject_t& soid,
+ std::map<shard_id_t, eversion_t>* out);
public:
void set_dynamic_perf_stats_queries(
osd_op.op.assert_ver.ver = ver;
}
+ void get_internal_versions(boost::system::error_code* ec,
+ buffer::list *pbl) {
+ ceph::buffer::list bl;
+ add_op(CEPH_OSD_OP_GET_INTERNAL_VERSIONS);
+ out_bl.back() = pbl;
+ out_ec.back() = ec;
+ }
+
void cmpxattr(const char *name, const ceph::buffer::list& val,
int op, int mode) {
add_xattr(CEPH_OSD_OP_CMPXATTR, name, val);