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") \
\
}
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) {
+ const std::set<pg_shard_t>& acting_shards = get_acting_shards();
+ ObjectContextRef obc = get_object_context(soid, false);
+
+ if (!obc->obs.exists) {
+ return -ENOENT;
+ }
+
+ if (is_primary()) {
+ for (const auto& shard : acting_shards) {
+ (*out)[shard.shard] = 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);