]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: implement CEPH_OSD_OP_SETXATTR.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 5 Aug 2019 06:48:19 +0000 (08:48 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Sat, 24 Aug 2019 01:33:58 +0000 (03:33 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index cf371e00c2de065d6db559c4dbf1cb89687867e3..87effe33e543f5fc3fecc754b3356d8f318c4fa6 100644 (file)
@@ -181,6 +181,8 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
     return backend.writefull(*os, osd_op, txn);
   case CEPH_OSD_OP_SETALLOCHINT:
     return seastar::now();
+  case CEPH_OSD_OP_SETXATTR:
+    return backend.setxattr(*os, osd_op, txn);
   case CEPH_OSD_OP_PGNLS:
     return do_pgnls(osd_op.indata, os->oi.soid.get_namespace(), op.pgls.count)
       .then([&osd_op](bufferlist bl) {
index fea75402adccddcf29570cac92ac1907d6a241ab..d27afd9ddf741b52bcf9c71adda9eee034c3a7f0 100644 (file)
@@ -25,6 +25,8 @@ namespace {
   }
 }
 
+using ceph::common::local_conf;
+
 std::unique_ptr<PGBackend> PGBackend::create(pg_t pgid,
                                             const pg_shard_t pg_shard,
                                              const pg_pool_t& pool,
@@ -390,3 +392,38 @@ PGBackend::list_objects(const hobject_t& start, uint64_t limit)
         objects, next.hobj);
     });
 }
+
+seastar::future<> PGBackend::setxattr(
+  ObjectState& os,
+  const OSDOp& osd_op,
+  ceph::os::Transaction& txn)
+{
+  //++ctx->num_write;
+
+  if (local_conf()->osd_max_attr_size > 0 &&
+      osd_op.op.xattr.value_len > local_conf()->osd_max_attr_size) {
+    throw ceph::osd::error::from_intret(-EFBIG);
+  }
+
+  const auto max_name_len = std::min<uint64_t>(
+    store->get_max_attr_name_length(), local_conf()->osd_max_attr_name_len);
+  if (osd_op.op.xattr.name_len > max_name_len) {
+    throw ceph::osd::error::from_intret(-ENAMETOOLONG);
+  }
+
+  maybe_create_new_object(os, txn);
+
+  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;
+    bp.copy(osd_op.op.xattr.value_len, val);
+  }
+
+  txn.setattr(coll->cid, ghobject_t{os.oi.soid}, name, val);
+  return seastar::now();
+  //ctx->delta_stats.num_wr++;
+}
index a47a78eecfeb42738fd9fee296fb3b7f3e97dd8f..5825b479f5673692d7b077adc13ff5f7f2f7cceb 100644 (file)
@@ -72,6 +72,10 @@ public:
   seastar::future<std::vector<hobject_t>, hobject_t> list_objects(
     const hobject_t& start,
     uint64_t limit);
+  seastar::future<> setxattr(
+    ObjectState& os,
+    const OSDOp& osd_op,
+    ceph::os::Transaction& trans);
 
   virtual void got_rep_op_reply(const MOSDRepOpReply&) {}