const char *name,
bufferlist *outbl)
{
- return 0;
+ OSDOp op;
+ op.op.op = CEPH_OSD_OP_GETXATTR;
+ op.op.xattr.name_len = strlen(name);
+ op.indata.append(name, op.op.xattr.name_len);
+ try {
+ reinterpret_cast<ceph::osd::OpsExecuter*>(hctx)->do_osd_op(op).get();
+ outbl->claim(op.outdata);
+ return outbl->length();
+ } catch (ceph::osd::error& e) {
+ return -e.code().value();
+ }
}
int cls_cxx_getxattrs(cls_method_context_t hctx,
osd_op.outdata = std::move(bl);
return seastar::now();
});
+ case CEPH_OSD_OP_GETXATTR:
+ return backend.getxattr(os, osd_op);
case CEPH_OSD_OP_WRITE:
return backend.write(*os, osd_op, txn);
case CEPH_OSD_OP_WRITEFULL:
return seastar::now();
//ctx->delta_stats.num_wr++;
}
+
+seastar::future<> PGBackend::getxattr(
+ ObjectState& os,
+ OSDOp& osd_op)
+{
+ std::string name;
+ ceph::bufferlist val;
+ {
+ auto bp = osd_op.indata.cbegin();
+ std::string aname;
+ bp.copy(osd_op.op.xattr.name_len, aname);
+ name = "_" + aname;
+ }
+ return store->get_attr(coll, ghobject_t{os.oi.soid}, name).then(
+ [&osd_op] (ceph::bufferptr val) {
+ osd_op.outdata.clear();
+ osd_op.outdata.push_back(std::move(val));
+ osd_op.op.xattr.value_len = osd_op.outdata.length();
+ //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
+ }).handle_exception_type(
+ [] (ceph::os::FuturizedStore::EnoentException& e) {
+ return seastar::make_exception_future<>(ceph::osd::object_not_found{});
+ });
+ //ctx->delta_stats.num_rd++;
+}
ObjectState& os,
const OSDOp& osd_op,
ceph::os::Transaction& trans);
+ seastar::future<> getxattr(
+ ObjectState& os,
+ OSDOp& osd_op);
virtual void got_rep_op_reply(const MOSDRepOpReply&) {}