]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: implement CEPH_OSD_OP_GETXATTR and cls_cxx_getxattr().
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 5 Aug 2019 15:24:24 +0000 (17:24 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Sat, 24 Aug 2019 01:33:59 +0000 (03:33 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/objclass.cc
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index e76e681ee54f2b97a7f55f528fbd431322d57d13..8bd8e3a13ac3a5b1139c3dbb4aa2303fd3ead0f6 100644 (file)
@@ -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<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,
index bd63f6ac2799a1d88c3cc92b45fea0854bb472f2..0a2938359821624dd40c2bcf4f9b703dba011a5a 100644 (file)
@@ -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:
index f707cf1c3ece416dcab1b68623aa73fe5a382194..eb578199dca20e81e40b781ae6035b2165dd093a 100644 (file)
@@ -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++;
+}
index 5825b479f5673692d7b077adc13ff5f7f2f7cceb..6a20e28dbfc574e2e5fd81487e29c0cdce24c14f 100644 (file)
@@ -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&) {}