]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: support getxattrs op
authorKefu Chai <kchai@redhat.com>
Fri, 7 Aug 2020 05:02:11 +0000 (13:02 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 7 Aug 2020 11:15:24 +0000 (19:15 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 9b51714ce11758d46766ca366223356823bdc169..810c557252a94867ca837a62e856fc165eed88da 100644 (file)
@@ -699,6 +699,10 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op)
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
       return backend.getxattr(os, osd_op);
     });
+  case CEPH_OSD_OP_GETXATTRS:
+    return do_read_op([&osd_op] (auto& backend, const auto& os) {
+      return backend.get_xattrs(os, osd_op);
+    });
   case CEPH_OSD_OP_CREATE:
     return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
       return backend.create(os, osd_op, txn);
index 9c6a1ed67c5134104c01d77dcd3c8b6413d12192..e8ad54e29dc0b88e072ee39390402934fd9db73a 100644 (file)
@@ -670,6 +670,28 @@ PGBackend::get_attr_errorator::future<ceph::bufferptr> PGBackend::getxattr(
   return store->get_attr(coll, ghobject_t{soid}, key);
 }
 
+PGBackend::get_attr_errorator::future<> PGBackend::get_xattrs(
+  const ObjectState& os,
+  OSDOp& osd_op) const
+{
+  if (__builtin_expect(stopping, false)) {
+    throw crimson::common::system_shutdown_exception();
+  }
+  return store->get_attrs(coll, ghobject_t{os.oi.soid}).safe_then(
+    [&osd_op](auto&& attrs) {
+    std::vector<std::pair<std::string, bufferlist>> user_xattrs;
+    for (auto& [key, val] : attrs) {
+      if (key.size() > 1 && key[0] == '_') {
+       ceph::bufferlist bl;
+       bl.append(std::move(val));
+       user_xattrs.emplace_back(key.substr(1), std::move(bl));
+      }
+    }
+    ceph::encode(user_xattrs, osd_op.outdata);
+    return get_attr_errorator::now();
+  });
+}
+
 static seastar::future<crimson::os::FuturizedStore::omap_values_t>
 maybe_get_omap_vals_by_keys(
   crimson::os::FuturizedStore* store,
index 6f2cf47e29c27872d561a413524af2abaadb0d2a..67fa12b871658676094980e4ffa02bcd5ccfd496 100644 (file)
@@ -127,6 +127,9 @@ public:
   get_attr_errorator::future<ceph::bufferptr> getxattr(
     const hobject_t& soid,
     std::string_view key) const;
+  get_attr_errorator::future<> get_xattrs(
+    const ObjectState& os,
+    OSDOp& osd_op) const;
   seastar::future<struct stat> stat(
     CollectionRef c,
     const ghobject_t& oid) const;