]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/sal: add Object::get_torrent_info()
authorCasey Bodley <cbodley@redhat.com>
Sun, 19 Feb 2023 15:44:51 +0000 (10:44 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 2 Mar 2023 13:56:20 +0000 (08:56 -0500)
although torrent info is moving into RGW_ATTR_TORRENT, we'll still need
to support the rados backend's omap fallback.. forever. expose a new
Object API specifically for torrent info so we can remove all of the
omap-specific ones

Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/driver/rados/rgw_sal_rados.cc
src/rgw/driver/rados/rgw_sal_rados.h
src/rgw/rgw_sal.h
src/rgw/rgw_sal_filter.cc
src/rgw/rgw_sal_filter.h
src/rgw/rgw_sal_store.h

index fb34ae25aa8ff9683fde19055a107aa546a1a8c8..57658558d8b7b34537d731a6fe91a7cccd245250 100644 (file)
@@ -1835,6 +1835,42 @@ void RadosObject::get_raw_obj(rgw_raw_obj* raw_obj)
   store->getRados()->obj_to_raw((bucket->get_info()).placement_rule, get_obj(), raw_obj);
 }
 
+int RadosObject::get_torrent_info(const DoutPrefixProvider* dpp,
+                                  optional_yield y, bufferlist& bl)
+{
+  // try to read torrent info from attr
+  int ret = StoreObject::get_torrent_info(dpp, y, bl);
+  if (ret >= 0) {
+    return ret;
+  }
+
+  // try falling back to old torrent info stored in omap
+  rgw_raw_obj raw_obj;
+  get_raw_obj(&raw_obj);
+
+  rgw_rados_ref ref;
+  ret = store->getRados()->get_raw_obj_ref(dpp, raw_obj, &ref);
+  if (ret < 0) {
+    return ret;
+  }
+
+  const std::set<std::string> keys = {"rgw.torrent"};
+  std::map<std::string, bufferlist> result;
+
+  librados::ObjectReadOperation op;
+  op.omap_get_vals_by_keys(keys, &result, nullptr);
+
+  ret = rgw_rados_operate(dpp, ref.pool.ioctx(), ref.obj.oid, &op, nullptr, y);
+  if (ret < 0) {
+    return ret;
+  }
+  if (result.empty()) { // omap key not found
+    return -ENOENT;
+  }
+  bl = std::move(result.begin()->second);
+  return 0;
+}
+
 int RadosObject::omap_get_vals_by_keys(const DoutPrefixProvider *dpp, const std::string& oid,
                                          const std::set<std::string>& keys,
                                          Attrs* vals)
index 73be3efb695066b477603fb2f991d0158ab449e9..917addaa442e31cf3acd6cf8c4e10a595b6735b9 100644 (file)
@@ -460,6 +460,9 @@ class RadosObject : public StoreObject {
     virtual std::unique_ptr<ReadOp> get_read_op() override;
     virtual std::unique_ptr<DeleteOp> get_delete_op() override;
 
+    virtual int get_torrent_info(const DoutPrefixProvider* dpp,
+                                 optional_yield y, bufferlist& bl) override;
+
     /* OMAP */
     virtual int omap_get_vals_by_keys(const DoutPrefixProvider *dpp, const std::string& oid,
                              const std::set<std::string>& keys,
index 037806d6854a9eddbbef67956475e415c28dd033..0af1c24d5b311c2423464c49636a0a87362c93ad 100644 (file)
@@ -1078,7 +1078,10 @@ class Object {
     /** Get a new DeleteOp for this object */
     virtual std::unique_ptr<DeleteOp> get_delete_op() = 0;
 
-    // TODO: remove omap APIs. rgw_torrent.cc shouldn't use omap
+    /// Return stored torrent info or -ENOENT if there isn't any.
+    virtual int get_torrent_info(const DoutPrefixProvider* dpp,
+                                 optional_yield y, bufferlist& bl) = 0;
+
     /** Get the OMAP values matching the given set of keys */
     virtual int omap_get_vals_by_keys(const DoutPrefixProvider *dpp, const std::string& oid,
                              const std::set<std::string>& keys,
index b57c664e2ea062476b9f2d64795de5d30c249b2d..18c8a8bdaea800b78b32a3f683434316dcfcb43a 100644 (file)
@@ -1007,6 +1007,12 @@ std::unique_ptr<Object::DeleteOp> FilterObject::get_delete_op()
   return std::make_unique<FilterDeleteOp>(std::move(d));
 }
 
+int FilterObject::get_torrent_info(const DoutPrefixProvider* dpp,
+                                   optional_yield y, bufferlist& bl)
+{
+  return next->get_torrent_info(dpp, y, bl);
+}
+
 int FilterObject::omap_get_vals_by_keys(const DoutPrefixProvider *dpp,
                                        const std::string& oid,
                                        const std::set<std::string>& keys,
index 340f52ad1ef5325cbc688855cc94b14a216133be..6260f3acae37f375d8a371e7a6d2593a8252cebc 100644 (file)
@@ -670,6 +670,9 @@ public:
   virtual std::unique_ptr<ReadOp> get_read_op() override;
   virtual std::unique_ptr<DeleteOp> get_delete_op() override;
 
+  virtual int get_torrent_info(const DoutPrefixProvider* dpp,
+                               optional_yield y, bufferlist& bl) override;
+
   virtual int omap_get_vals_by_keys(const DoutPrefixProvider *dpp,
                                    const std::string& oid,
                                    const std::set<std::string>& keys,
index 55b43e3d90bda1c795c5534c3bf0bc307b3287e9..e4822a6cb6e5ad509ce61592d33955f3169aefab 100644 (file)
@@ -241,6 +241,16 @@ class StoreObject : public Object {
       return -1;
     }
 
+    virtual int get_torrent_info(const DoutPrefixProvider* dpp,
+                                 optional_yield y, bufferlist& bl) override {
+      const auto& attrs = get_attrs();
+      if (auto i = attrs.find(RGW_ATTR_TORRENT); i != attrs.end()) {
+        bl = i->second;
+        return 0;
+      }
+      return -ENOENT;
+    }
+
     virtual void print(std::ostream& out) const override {
       if (bucket)
        out << bucket << ":";