From: Radoslaw Zarzynski Date: Mon, 5 Aug 2019 15:24:24 +0000 (+0200) Subject: crimson/osd: implement CEPH_OSD_OP_GETXATTR and cls_cxx_getxattr(). X-Git-Tag: v15.1.0~1774^2~9 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d2640e5b45ae8890c79b7cf74f8f9990e9c5ec74;p=ceph-ci.git crimson/osd: implement CEPH_OSD_OP_GETXATTR and cls_cxx_getxattr(). Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index e76e681ee54..8bd8e3a13ac 100644 --- a/src/crimson/osd/objclass.cc +++ b/src/crimson/osd/objclass.cc @@ -164,7 +164,17 @@ int cls_cxx_getxattr(cls_method_context_t hctx, 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(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, diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index bd63f6ac279..0a293835982 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -174,6 +174,8 @@ OpsExecuter::do_osd_op(OSDOp& osd_op) 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: diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index f707cf1c3ec..eb578199dca 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -427,3 +427,28 @@ seastar::future<> PGBackend::setxattr( 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++; +} diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 5825b479f56..6a20e28dbfc 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -76,6 +76,9 @@ public: 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&) {}