From: Radoslaw Zarzynski Date: Mon, 5 Aug 2019 06:48:19 +0000 (+0200) Subject: crimson/osd: implement CEPH_OSD_OP_SETXATTR. X-Git-Tag: v15.1.0~1774^2~13 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=edced75b1561e1f1b119b47c120e0b6ce0f33616;p=ceph-ci.git crimson/osd: implement CEPH_OSD_OP_SETXATTR. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index cf371e00c2d..87effe33e54 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -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) { diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index fea75402adc..d27afd9ddf7 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -25,6 +25,8 @@ namespace { } } +using ceph::common::local_conf; + std::unique_ptr 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( + 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++; +} diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index a47a78eecfe..5825b479f56 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -72,6 +72,10 @@ public: seastar::future, 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&) {}