]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: be explicit on moving rados op in APIs
authorYuval Lifshitz <ylifshit@ibm.com>
Mon, 17 Feb 2025 14:46:01 +0000 (14:46 +0000)
committerYuval Lifshitz <ylifshit@ibm.com>
Mon, 17 Feb 2025 14:54:13 +0000 (14:54 +0000)
issue was probably there all the time (using the same op object more
than once). but was exposed in:
8b3479e2bd70bc036dc0ca527636b71ea233c395

Fixes: https://tracker.ceph.com/issues/69944
Signed-off-by: Yuval Lifshitz <ylifshit@ibm.com>
29 files changed:
src/rgw/driver/rados/account.cc
src/rgw/driver/rados/buckets.cc
src/rgw/driver/rados/cls_fifo_legacy.cc
src/rgw/driver/rados/config/impl.cc
src/rgw/driver/rados/groups.cc
src/rgw/driver/rados/rgw_bucket.cc
src/rgw/driver/rados/rgw_datalog.cc
src/rgw/driver/rados/rgw_gc.cc
src/rgw/driver/rados/rgw_log_backing.cc
src/rgw/driver/rados/rgw_notify.cc
src/rgw/driver/rados/rgw_object_expirer_core.cc
src/rgw/driver/rados/rgw_putobj_processor.cc
src/rgw/driver/rados/rgw_rados.cc
src/rgw/driver/rados/rgw_rados.h
src/rgw/driver/rados/rgw_reshard.cc
src/rgw/driver/rados/rgw_sal_rados.cc
src/rgw/driver/rados/rgw_sal_rados.h
src/rgw/driver/rados/rgw_tools.cc
src/rgw/driver/rados/rgw_tools.h
src/rgw/driver/rados/roles.cc
src/rgw/driver/rados/topic.cc
src/rgw/driver/rados/topics.cc
src/rgw/driver/rados/users.cc
src/rgw/radosgw-admin/orphan.cc
src/rgw/services/svc_cls.cc
src/rgw/services/svc_notify.cc
src/rgw/services/svc_sys_obj_core.cc
src/test/rgw/test_cls_fifo_legacy.cc
src/test/rgw/test_log_backing.cc

index fc881d07804b66f1ba51b50f6af21c971b2ac273..44430d87d10da1d46144ef1f7fda881b62a68df6 100644 (file)
@@ -455,7 +455,7 @@ int resource_count(const DoutPrefixProvider* dpp,
   int ret = 0;
   op.omap_get_header(&bl, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r == -ENOENT) { // doesn't exist yet
     count = 0;
     return 0;
index 8c35028d09318931c08f7a491e36e5421d16be8b..0d96b4df1f3e96ba51c71c5424294655c540fb40 100644 (file)
@@ -39,7 +39,7 @@ static int set(const DoutPrefixProvider* dpp, optional_yield y,
 
   librados::ObjectWriteOperation op;
   ::cls_user_set_buckets(op, entries, add);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int add(const DoutPrefixProvider* dpp, optional_yield y,
@@ -74,7 +74,7 @@ int remove(const DoutPrefixProvider* dpp, optional_yield y,
 
   librados::ObjectWriteOperation op;
   ::cls_user_remove_bucket(op, clsbucket);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int list(const DoutPrefixProvider* dpp, optional_yield y,
@@ -104,7 +104,7 @@ int list(const DoutPrefixProvider* dpp, optional_yield y,
                            entries, &marker, &truncated, &rc);
 
     bufferlist bl;
-    int r = ref.operate(dpp, &op, &bl, y);
+    int r = ref.operate(dpp, std::move(op), &bl, y);
     if (r == -ENOENT) {
       listing.next_marker.clear();
       return 0;
@@ -166,7 +166,7 @@ int read_stats(const DoutPrefixProvider* dpp, optional_yield y,
   ::cls_user_get_header(op, &header, nullptr);
 
   bufferlist bl;
-  r = ref.operate(dpp, &op, &bl, y);
+  r = ref.operate(dpp, std::move(op), &bl, y);
   if (r < 0 && r != -ENOENT) {
     return r;
   }
@@ -243,7 +243,7 @@ int reset_stats(const DoutPrefixProvider* dpp, optional_yield y,
 
     encode(call, in);
     op.exec("user", "reset_user_stats2", in, &out, &rval);
-    r = ref.operate(dpp, &op, y, librados::OPERATION_RETURNVEC);
+    r = ref.operate(dpp, std::move(op), y, librados::OPERATION_RETURNVEC);
     if (r < 0) {
       return r;
     }
@@ -269,7 +269,7 @@ int complete_flush_stats(const DoutPrefixProvider* dpp, optional_yield y,
 
   librados::ObjectWriteOperation op;
   ::cls_user_complete_stats_sync(op);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 } // namespace rgwrados::buckets
index aa67bf8a82034f35914c61b9d06da7e8d3ed0fe9..a5cf2e017eea0c2121038a8f3fc095311f835988 100644 (file)
@@ -80,7 +80,7 @@ int get_meta(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string&
 
   op.exec(fifo::op::CLASS, fifo::op::GET_META, in,
          &bl, nullptr);
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (r >= 0) try {
       fifo::op::get_meta_reply reply;
       auto iter = bl.cbegin();
@@ -153,7 +153,7 @@ int push_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string
   encode(pp, in);
   auto retval = 0;
   op.exec(fifo::op::CLASS, fifo::op::PUSH_PART, in, nullptr, &retval);
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y, lr::OPERATION_RETURNVEC);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y, lr::OPERATION_RETURNVEC);
   if (r < 0) {
     ldpp_dout(dpp, -1)
       << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -219,7 +219,7 @@ int list_part(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::string
   encode(lp, in);
   cb::list bl;
   op.exec(fifo::op::CLASS, fifo::op::LIST_PART, in, &bl, nullptr);
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (r >= 0) try {
       fifo::op::list_part_reply reply;
       auto iter = bl.cbegin();
@@ -312,7 +312,7 @@ int get_part_info(const DoutPrefixProvider *dpp, lr::IoCtx& ioctx, const std::st
   cb::list bl;
   encode(gpi, in);
   op.exec(fifo::op::CLASS, fifo::op::GET_PART_INFO, in, &bl, nullptr);
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (r >= 0) try {
       fifo::op::get_part_info_reply reply;
       auto iter = bl.cbegin();
@@ -439,7 +439,7 @@ int FIFO::_update_meta(const DoutPrefixProvider *dpp, const fifo::update& update
   lr::ObjectWriteOperation op;
   bool canceled = false;
   update_meta(&op, version, update);
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (r >= 0 || r == -ECANCELED) {
     canceled = (r == -ECANCELED);
     if (!canceled) {
@@ -565,7 +565,7 @@ int FIFO::create_part(const DoutPrefixProvider *dpp, int64_t part_num, std::uint
   part_init(&op, info.params);
   auto oid = info.part_oid(part_num);
   l.unlock();
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " part_init failed: r=" << r << " tid="
@@ -584,7 +584,7 @@ int FIFO::remove_part(const DoutPrefixProvider *dpp, int64_t part_num, std::uint
   std::unique_lock l(m);
   auto oid = info.part_oid(part_num);
   l.unlock();
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " remove failed: r=" << r << " tid="
@@ -1139,7 +1139,7 @@ int FIFO::trim_part(const DoutPrefixProvider *dpp, int64_t part_num, uint64_t of
   const auto part_oid = info.part_oid(part_num);
   l.unlock();
   rgw::cls::fifo::trim_part(&op, ofs, exclusive);
-  auto r = rgw_rados_operate(dpp, ioctx, part_oid, &op, y);
+  auto r = rgw_rados_operate(dpp, ioctx, part_oid, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " trim_part failed: r=" << r << " tid=" << tid << dendl;
@@ -1214,7 +1214,7 @@ int FIFO::create(const DoutPrefixProvider *dpp, lr::IoCtx ioctx, std::string oid
   lr::ObjectWriteOperation op;
   create_meta(&op, oid, objv, oid_prefix, exclusive, max_part_size,
              max_entry_size);
-  auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
               << " create_meta failed: r=" << r << dendl;
index f1b2befadcd880584821fc1102e8e8d2f41c525a..a861194fed2b3bee3b84c666cea05e549f6530d3 100644 (file)
@@ -59,7 +59,7 @@ int ConfigImpl::read(const DoutPrefixProvider* dpp, optional_yield y,
     objv->prepare_op_for_read(&op);
   }
   op.read(0, 0, &bl, nullptr);
-  return rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  return rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
 }
 
 int ConfigImpl::write(const DoutPrefixProvider* dpp, optional_yield y,
@@ -84,7 +84,7 @@ int ConfigImpl::write(const DoutPrefixProvider* dpp, optional_yield y,
   }
   op.write_full(bl);
 
-  r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (r >= 0 && objv) {
     objv->apply_write();
   }
@@ -107,7 +107,7 @@ int ConfigImpl::remove(const DoutPrefixProvider* dpp, optional_yield y,
   }
   op.remove();
 
-  r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (r >= 0 && objv) {
     objv->apply_write();
   }
index 21f66e7b7d5fc1cc84d758922422b9aab8552c19..a1d2b2a6d363c7b79c81c0d7b6ea29aefce1ca6e 100644 (file)
@@ -46,7 +46,7 @@ int add(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_add(op, resource, exclusive, limit);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int remove(const DoutPrefixProvider* dpp,
@@ -63,7 +63,7 @@ int remove(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_rm(op, name);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int list(const DoutPrefixProvider* dpp,
@@ -89,7 +89,7 @@ int list(const DoutPrefixProvider* dpp,
   ::cls_user_account_resource_list(op, marker, path_prefix, max_items,
                                    entries, &truncated, &next_marker, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r == -ENOENT) {
     next_marker.clear();
     return 0;
index d043aea07831a6d85e4713a01ac95338abab310b..bdc2b55c22bcb54ee7eeeae920140c9e3e50e6ee 100644 (file)
@@ -802,7 +802,7 @@ static int is_versioned_instance_listable(const DoutPrefixProvider *dpp,
     cls_rgw_bucket_list_op(op, marker, key.name, empty_delim, 1000,
                            true, &result);
     bufferlist ibl;
-    int r = bs.bucket_obj.operate(dpp, &op, &ibl, y);
+    int r = bs.bucket_obj.operate(dpp, std::move(op), &ibl, y);
     if (r < 0) {
       return r;
     }
index 8b384da0f8ee56fec5eb04d7c650e8db43a06ef3..89835a8e4d0393ca820b8f8b3e915e125378a341 100644 (file)
@@ -129,7 +129,7 @@ public:
   int push(const DoutPrefixProvider *dpp, int index, entries&& items, optional_yield y) override {
     lr::ObjectWriteOperation op;
     cls_log_add(op, std::get<centries>(items), true);
-    auto r = rgw_rados_operate(dpp, ioctx, oids[index], &op, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oids[index], std::move(op), y);
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__
                 << ": failed to push to " << oids[index] << cpp_strerror(-r)
@@ -142,7 +142,7 @@ public:
           optional_yield y) override {
     lr::ObjectWriteOperation op;
     cls_log_add(op, utime_t(now), {}, key, bl);
-    auto r = rgw_rados_operate(dpp, ioctx, oids[index], &op, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oids[index], std::move(op), y);
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__
                 << ": failed to push to " << oids[index]
@@ -159,7 +159,7 @@ public:
     lr::ObjectReadOperation op;
     cls_log_list(op, {}, {}, std::string(marker.value_or("")),
                 max_entries, log_entries, out_marker, truncated);
-    auto r = rgw_rados_operate(dpp, ioctx, oids[index], &op, nullptr, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oids[index], std::move(op), nullptr, y);
     if (r == -ENOENT) {
       *truncated = false;
       return 0;
@@ -193,7 +193,7 @@ public:
     cls_log_header header;
     lr::ObjectReadOperation op;
     cls_log_info(op, &header);
-    auto r = rgw_rados_operate(dpp, ioctx, oids[index], &op, nullptr, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oids[index], std::move(op), nullptr, y);
     if (r == -ENOENT) r = 0;
     if (r < 0) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__
@@ -209,7 +209,7 @@ public:
           optional_yield y) override {
     lr::ObjectWriteOperation op;
     cls_log_trim(op, {}, {}, {}, std::string(marker));
-    auto r = rgw_rados_operate(dpp, ioctx, oids[index], &op, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oids[index], std::move(op), y);
     if (r == -ENOENT) r = -ENODATA;
     if (r < 0 && r != -ENODATA) {
       ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__
@@ -241,7 +241,7 @@ public:
       std::string out_marker;
       bool truncated;
       cls_log_list(op, {}, {}, {}, 1, log_entries, &out_marker, &truncated);
-      auto r = rgw_rados_operate(dpp, ioctx, oids[shard], &op, nullptr, y);
+      auto r = rgw_rados_operate(dpp, ioctx, oids[shard], std::move(op), nullptr, y);
       if (r == -ENOENT) {
        continue;
       }
index 18c8b75ca4d83103ca9c13a580e9d7523e347f9e..67ea08e8ea7840afb3f2310c99c7b974db684d9f 100644 (file)
@@ -51,7 +51,7 @@ void RGWGC::initialize(CephContext *_cct, RGWRados *_store, optional_yield y) {
     op.create(false);
     const uint64_t queue_size = cct->_conf->rgw_gc_max_queue_size, num_deferred_entries = cct->_conf->rgw_gc_max_deferred;
     gc_log_init2(op, queue_size, num_deferred_entries);
-    store->gc_operate(this, obj_names[i], &op, y);
+    store->gc_operate(this, obj_names[i], std::move(op), y);
   }
 }
 
@@ -129,13 +129,13 @@ int RGWGC::send_chain(const cls_rgw_obj_chain& chain, const string& tag, optiona
 
   ldpp_dout(this, 20) << "RGWGC::send_chain - on object name: " << obj_names[i] << "tag is: " << tag << dendl;
 
-  auto ret = store->gc_operate(this, obj_names[i], &op, y);
+  auto ret = store->gc_operate(this, obj_names[i], std::move(op), y);
   if (ret != -ECANCELED && ret != -EPERM) {
     return ret;
   }
   ObjectWriteOperation set_entry_op;
   cls_rgw_gc_set_entry(set_entry_op, cct->_conf->rgw_gc_obj_min_wait, info);
-  return store->gc_operate(this, obj_names[i], &set_entry_op, y);
+  return store->gc_operate(this, obj_names[i], std::move(set_entry_op), y);
 }
 
 struct defer_chain_state {
@@ -241,7 +241,7 @@ int RGWGC::remove(int index, int num_entries, optional_yield y)
   ObjectWriteOperation op;
   cls_rgw_gc_queue_remove_entries(op, num_entries);
 
-  return store->gc_operate(this, obj_names[index], &op, y);
+  return store->gc_operate(this, obj_names[index], std::move(op), y);
 }
 
 static int gc_list(const DoutPrefixProvider* dpp, optional_yield y, librados::IoCtx& io_ctx,
@@ -251,7 +251,7 @@ static int gc_list(const DoutPrefixProvider* dpp, optional_yield y, librados::Io
   librados::ObjectReadOperation op;
   bufferlist bl;
   cls_rgw_gc_list(op, marker, max, expired_only, bl);
-  int ret = rgw_rados_operate(dpp, io_ctx, oid, &op, nullptr, y);
+  int ret = rgw_rados_operate(dpp, io_ctx, oid, std::move(op), nullptr, y);
   if (ret < 0) {
     return ret;
   }
index 143855968456ade115b488571128e77f59581621..75a238f6d447f6a1a4bc36f684dd169acff2895b 100644 (file)
@@ -175,7 +175,7 @@ bs::error_code log_remove(const DoutPrefixProvider *dpp,
        librados::ObjectWriteOperation op;
        op.remove();
        auto part_oid = info.part_oid(j);
-       auto subr = rgw_rados_operate(dpp, ioctx, part_oid, &op, y);
+       auto subr = rgw_rados_operate(dpp, ioctx, part_oid, std::move(op), y);
        if (subr < 0 && subr != -ENOENT) {
          if (!ec)
            ec = bs::error_code(-subr, bs::system_category());
@@ -203,7 +203,7 @@ bs::error_code log_remove(const DoutPrefixProvider *dpp,
     } else {
       op.remove();
     }
-    r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+    r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
     if (r < 0 && r != -ENOENT) {
       if (!ec)
        ec = bs::error_code(-r, bs::system_category());
@@ -268,7 +268,7 @@ bs::error_code logback_generations::setup(const DoutPrefixProvider *dpp,
       lock.unlock();
 
       op.write_full(bl);
-      auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+      auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
       if (r < 0 && r != -EEXIST) {
        ldpp_dout(dpp, -1) << __PRETTY_FUNCTION__ << ":" << __LINE__
                   << ": failed writing oid=" << oid
@@ -404,7 +404,7 @@ auto logback_generations::read(const DoutPrefixProvider *dpp, optional_yield y)
     cls_version_read(op, &v2);
     cb::list bl;
     op.read(0, 0, &bl, nullptr);
-    auto r = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
     if (r < 0) {
       if (r == -ENOENT) {
        ldpp_dout(dpp, 5) << __PRETTY_FUNCTION__ << ":" << __LINE__
@@ -446,7 +446,7 @@ bs::error_code logback_generations::write(const DoutPrefixProvider *dpp, entries
     cls_version_inc(op);
     auto oldv = version;
     l.unlock();
-    auto r = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+    auto r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
     if (r == 0) {
       if (oldv != version) {
        return { ECANCELED, bs::system_category() };
index 14eeb73dac26b559ca4c50a34f45fa121416ebbb..c997a7152b3b464cdb7148f9316db1f3e86463a3 100644 (file)
@@ -112,7 +112,7 @@ private:
       librados::ObjectReadOperation op;
       queues_t queues_chunk;
       op.omap_get_keys2(start_after, max_chunk, &queues_chunk, &more, &rval);
-      const auto ret = rgw_rados_operate(this, rados_store.getRados()->get_notif_pool_ctx(), Q_LIST_OBJECT_NAME, &op, nullptr, y);
+      const auto ret = rgw_rados_operate(this, rados_store.getRados()->get_notif_pool_ctx(), Q_LIST_OBJECT_NAME, std::move(op), nullptr, y);
       if (ret == -ENOENT) {
         // queue list object was not created - nothing to do
         return 0;
@@ -278,7 +278,7 @@ private:
         "" /*no tag*/);
       cls_2pc_queue_expire_reservations(op, stale_time);
       // check ownership and do reservation cleanup in one batch
-      auto ret = rgw_rados_operate(this, rados_store.getRados()->get_notif_pool_ctx(), queue_name, &op, yield);
+      auto ret = rgw_rados_operate(this, rados_store.getRados()->get_notif_pool_ctx(), queue_name, std::move(op), yield);
       if (ret == -ENOENT) {
         // queue was deleted
         ldpp_dout(this, 10) << "INFO: queue: " << queue_name
@@ -310,7 +310,7 @@ private:
     op.assert_exists();
     rados::cls::lock::unlock(&op, queue_name+"_lock", lock_cookie);
     auto& rados_ioctx = rados_store.getRados()->get_notif_pool_ctx();
-    const auto ret = rgw_rados_operate(this, rados_ioctx, queue_name, &op, yield);
+    const auto ret = rgw_rados_operate(this, rados_ioctx, queue_name, std::move(op), yield);
     if (ret == -ENOENT) {
       ldpp_dout(this, 10) << "INFO: queue: " << queue_name
         << ". was removed. nothing to unlock" << dendl;
@@ -403,7 +403,7 @@ private:
           "" /*no tag*/);
         cls_2pc_queue_list_entries(op, start_marker, max_elements, &obl, &rval);
         // check ownership and list entries in one batch
-        auto ret = rgw_rados_operate(this, rados_ioctx, queue_name, &op, nullptr, yield);
+        auto ret = rgw_rados_operate(this, rados_ioctx, queue_name, std::move(op), nullptr, yield);
         if (ret == -ENOENT) {
           // queue was deleted
           topics_persistency_tracker.erase(queue_name);
@@ -533,7 +533,7 @@ private:
           "" /*no tag*/);
         cls_2pc_queue_remove_entries(op, end_marker, entries_to_remove);
         // check ownership and deleted entries in one batch
-        auto ret = rgw_rados_operate(this, rados_ioctx, queue_name, &op, yield);
+        auto ret = rgw_rados_operate(this, rados_ioctx, queue_name, std::move(op), yield);
         if (ret == -ENOENT) {
           // queue was deleted
           ldpp_dout(this, 10) << "INFO: queue: " << queue_name
@@ -596,8 +596,9 @@ private:
           cls_2pc_reservation::id_t reservation_id;
           buffer::list obl;
           int rval;
+          op = librados::ObjectWriteOperation();
           cls_2pc_queue_reserve(op, size_to_migrate, migration_vector.size(), &obl, &rval);
-          ret = rgw_rados_operate(this, rados_ioctx, queue_name, &op, yield, librados::OPERATION_RETURNVEC);
+          ret = rgw_rados_operate(this, rados_ioctx, queue_name, std::move(op), yield, librados::OPERATION_RETURNVEC);
           if (ret < 0) {
             ldpp_dout(this, 1) << "ERROR: failed to reserve migration space on queue: " << queue_name << ". error: " << ret << dendl;
             return;
@@ -608,8 +609,9 @@ private:
             return;
           }
 
+          op = librados::ObjectWriteOperation();
           cls_2pc_queue_commit(op, migration_vector, reservation_id);
-          ret = rgw_rados_operate(this, rados_ioctx, queue_name, &op, yield);
+          ret = rgw_rados_operate(this, rados_ioctx, queue_name, std::move(op), yield);
           reservation_id = cls_2pc_reservation::NO_ID;
           if (ret < 0) {
             ldpp_dout(this, 1) << "ERROR: failed to commit reservation to queue: " << queue_name << ". error: " << ret << dendl;
@@ -683,7 +685,7 @@ private:
               failover_time,
               LOCK_FLAG_MAY_RENEW);
 
-        ret = rgw_rados_operate(this, rados_ioctx, queue_name, &op, yield);
+        ret = rgw_rados_operate(this, rados_ioctx, queue_name, std::move(op), yield);
         if (ret == -EBUSY) {
           // lock is already taken by another RGW
           ldpp_dout(this, 20) << "INFO: queue: " << queue_name << " owned (locked) by another daemon" << dendl;
@@ -854,7 +856,7 @@ int add_persistent_topic(const DoutPrefixProvider* dpp, librados::IoCtx& rados_i
   librados::ObjectWriteOperation op;
   op.create(true);
   cls_2pc_queue_init(op, topic_queue, MAX_QUEUE_SIZE);
-  auto ret = rgw_rados_operate(dpp, rados_ioctx, topic_queue, &op, y);
+  auto ret = rgw_rados_operate(dpp, rados_ioctx, topic_queue, std::move(op), y);
   if (ret == -EEXIST) {
     // queue already exists - nothing to do
     ldpp_dout(dpp, 20) << "INFO: queue for topic: " << topic_queue << " already exists. nothing to do" << dendl;
@@ -868,8 +870,9 @@ int add_persistent_topic(const DoutPrefixProvider* dpp, librados::IoCtx& rados_i
 
   bufferlist empty_bl;
   std::map<std::string, bufferlist> new_topic{{topic_queue, empty_bl}};
+  op = librados::ObjectWriteOperation();
   op.omap_set(new_topic);
-  ret = rgw_rados_operate(dpp, rados_ioctx, Q_LIST_OBJECT_NAME, &op, y);
+  ret = rgw_rados_operate(dpp, rados_ioctx, Q_LIST_OBJECT_NAME, std::move(op), y);
   if (ret < 0) {
     ldpp_dout(dpp, 1) << "ERROR: failed to add queue: " << topic_queue << " to queue list. error: " << ret << dendl;
     return ret;
@@ -881,7 +884,7 @@ int add_persistent_topic(const DoutPrefixProvider* dpp, librados::IoCtx& rados_i
 int remove_persistent_topic(const DoutPrefixProvider* dpp, librados::IoCtx& rados_ioctx, const std::string& topic_queue, optional_yield y) {
   librados::ObjectWriteOperation op;
   op.remove();
-  auto ret = rgw_rados_operate(dpp, rados_ioctx, topic_queue, &op, y);
+  auto ret = rgw_rados_operate(dpp, rados_ioctx, topic_queue, std::move(op), y);
   if (ret == -ENOENT) {
     // queue already removed - nothing to do
     ldpp_dout(dpp, 20) << "INFO: queue for topic: " << topic_queue << " already removed. nothing to do" << dendl;
@@ -894,8 +897,9 @@ int remove_persistent_topic(const DoutPrefixProvider* dpp, librados::IoCtx& rado
   }
 
   std::set<std::string> topic_to_remove{{topic_queue}};
+  op = librados::ObjectWriteOperation();
   op.omap_rm_keys(topic_to_remove);
-  ret = rgw_rados_operate(dpp, rados_ioctx, Q_LIST_OBJECT_NAME, &op, y);
+  ret = rgw_rados_operate(dpp, rados_ioctx, Q_LIST_OBJECT_NAME, std::move(op), y);
   if (ret < 0) {
     ldpp_dout(dpp, 1) << "ERROR: failed to remove queue: " << topic_queue << " from queue list. error: " << ret << dendl;
     return ret;
@@ -1141,7 +1145,7 @@ int publish_reserve(const DoutPrefixProvider* dpp,
         cls_2pc_queue_reserve(op, res.size, 1, &obl, &rval);
         auto ret = rgw_rados_operate(
             res.dpp, res.store->getRados()->get_notif_pool_ctx(), queue_name,
-            &op, res.yield, librados::OPERATION_RETURNVEC);
+            std::move(op), res.yield, librados::OPERATION_RETURNVEC);
         if (ret < 0) {
           ldpp_dout(res.dpp, 1)
               << "ERROR: failed to reserve notification on queue: "
@@ -1207,7 +1211,7 @@ int publish_commit(rgw::sal::Object* obj,
         cls_2pc_queue_abort(op, topic.res_id);
         auto ret = rgw_rados_operate(
          dpp, res.store->getRados()->get_notif_pool_ctx(),
-         queue_name, &op,
+         queue_name, std::move(op),
          res.yield);
         if (ret < 0) {
           ldpp_dout(dpp, 1) << "ERROR: failed to abort reservation: "
@@ -1219,10 +1223,11 @@ int publish_commit(rgw::sal::Object* obj,
         // now try to make a bigger one
        buffer::list obl;
         int rval;
+        op = librados::ObjectWriteOperation();
         cls_2pc_queue_reserve(op, bl.length(), 1, &obl, &rval);
         ret = rgw_rados_operate(
          dpp, res.store->getRados()->get_notif_pool_ctx(),
-          queue_name, &op, res.yield, librados::OPERATION_RETURNVEC);
+          queue_name, std::move(op), res.yield, librados::OPERATION_RETURNVEC);
         if (ret < 0) {
           ldpp_dout(dpp, 1) << "ERROR: failed to reserve extra space on queue: "
                            << queue_name
@@ -1293,7 +1298,7 @@ int publish_abort(reservation_t& res) {
     cls_2pc_queue_abort(op, topic.res_id);
     const auto ret = rgw_rados_operate(
       res.dpp, res.store->getRados()->get_notif_pool_ctx(),
-      queue_name, &op, res.yield);
+      queue_name, std::move(op), res.yield);
     if (ret < 0) {
       ldpp_dout(res.dpp, 1) << "ERROR: failed to abort reservation: "
                            << topic.res_id <<
index 09a544df8057f0628eef6f39929c2b8541866f98..2e4491f98ac0f821aab0aed95aca49d639394fa8 100644 (file)
@@ -116,7 +116,7 @@ int RGWObjExpStore::objexp_hint_add(const DoutPrefixProvider *dpp,
     ldpp_dout(dpp, 0) << "ERROR: " << __func__ << "(): failed to open obj=" << obj << " (r=" << r << ")" << dendl;
     return r;
   }
-  return obj.operate(dpp, &op, null_yield);
+  return obj.operate(dpp, std::move(op), null_yield);
 }
 
 int RGWObjExpStore::objexp_hint_list(const DoutPrefixProvider *dpp, 
@@ -142,7 +142,7 @@ int RGWObjExpStore::objexp_hint_list(const DoutPrefixProvider *dpp,
     return r;
   }
   bufferlist obl;
-  int ret = obj.operate(dpp, &op, &obl, null_yield);
+  int ret = obj.operate(dpp, std::move(op), &obl, null_yield);
 
   if ((ret < 0 ) && (ret != -ENOENT)) {
     return ret;
@@ -167,7 +167,7 @@ static int cls_timeindex_trim_repeat(const DoutPrefixProvider *dpp,
   do {
     librados::ObjectWriteOperation op;
     cls_timeindex_trim(op, from_time, to_time, from_marker, to_marker);
-    int r = rgw_rados_operate(dpp, ref.ioctx, oid, &op, null_yield);
+    int r = rgw_rados_operate(dpp, ref.ioctx, oid, std::move(op), null_yield);
     if (r == -ENODATA)
       done = true;
     else if (r < 0)
index 9e27c5adbc9ffc231738361ad1761a558d795c65..2c9d6fac7a6031f72fd8905568afc29dcdac7513 100644 (file)
@@ -578,7 +578,7 @@ int MultipartObjectProcessor::complete(
   op.assert_exists();
   cls_rgw_mp_upload_part_info_update(op, p, info);
   cls_version_inc(op);
-  r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, &op, rctx.y);
+  r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, std::move(op), rctx.y);
   ldpp_dout(rctx.dpp, 20) << "Update meta: " << meta_obj_ref.obj.oid << " part " << p << " prefix " << info.manifest.get_prefix() << " return " << r << dendl;
 
   if (r == -EOPNOTSUPP) {
@@ -593,7 +593,7 @@ int MultipartObjectProcessor::complete(
     op.assert_exists(); // detect races with abort
     op.omap_set(m);
     cls_version_inc(op);
-    r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, &op, rctx.y);
+    r = rgw_rados_operate(rctx.dpp, meta_obj_ref.ioctx, meta_obj_ref.obj.oid, std::move(op), rctx.y);
   }
 
   if (r < 0) {
index c1534b2e35680b8daf685762c0bce5172b9e8c13..44276bacae8becadb4c2bde8bdcb1bafba0e2008 100644 (file)
@@ -920,7 +920,7 @@ void RGWIndexCompletionManager::process()
                               cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING);
                               cls_rgw_bucket_complete_op(o, c->op, c->tag, c->ver, c->key, c->dir_meta, &c->remove_objs,
                                                          c->log_op, c->bilog_op, &c->zones_trace);
-                              int ret = bs->bucket_obj.operate(&dpp, &o, null_yield);
+                              int ret = bs->bucket_obj.operate(&dpp, std::move(o), null_yield);
                               ldout_bitx(bitx, &dpp, 10) <<
                                 "EXITING " << __func__ << ": ret=" << dendl_bitx;
                               return ret;
@@ -2585,7 +2585,7 @@ int RGWRados::fix_head_obj_locator(const DoutPrefixProvider *dpp, const RGWBucke
 #define HEAD_SIZE 512 * 1024
   op.read(0, HEAD_SIZE, &data, NULL);
 
-  ret = rgw_rados_operate(dpp, ioctx, oid, &op, &data, y);
+  ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), &data, y);
   if (ret < 0) {
     ldpp_dout(dpp, -1) << "ERROR: rgw_rados_operate(oid=" << oid << ") returned ret=" << ret << dendl;
     return ret;
@@ -2614,7 +2614,7 @@ int RGWRados::fix_head_obj_locator(const DoutPrefixProvider *dpp, const RGWBucke
     wop.write(0, data);
 
     ioctx.locator_set_key(locator);
-    rgw_rados_operate(dpp, ioctx, oid, &wop, y);
+    rgw_rados_operate(dpp, ioctx, oid, std::move(wop), y);
   }
 
   if (remove_bad) {
@@ -2663,7 +2663,7 @@ int RGWRados::move_rados_obj(const DoutPrefixProvider *dpp,
       mtime = real_clock::from_timespec(mtime_ts);
     }
     rop.read(ofs, chunk_size, &data, NULL);
-    ret = rgw_rados_operate(dpp, src_ioctx, src_oid, &rop, &data, y);
+    ret = rgw_rados_operate(dpp, src_ioctx, src_oid, std::move(rop), &data, y);
     if (ret < 0) {
       goto done_err;
     }
@@ -2678,7 +2678,7 @@ int RGWRados::move_rados_obj(const DoutPrefixProvider *dpp,
       mtime = real_clock::from_timespec(mtime_ts);
     }
     wop.write(ofs, data);
-    ret = rgw_rados_operate(dpp, dst_ioctx, dst_oid, &wop, y);
+    ret = rgw_rados_operate(dpp, dst_ioctx, dst_oid, std::move(wop), y);
     if (ret < 0) {
       goto done_err;
     }
@@ -3320,7 +3320,7 @@ int RGWRados::Object::Write::_do_write_meta(uint64_t size, uint64_t accounted_si
   auto& ioctx = ref.ioctx;
 
   tracepoint(rgw_rados, operate_enter, req_id.c_str());
-  r = rgw_rados_operate(rctx.dpp, ref.ioctx, ref.obj.oid, &op, rctx.y, 0, &trace, &epoch);
+  r = rgw_rados_operate(rctx.dpp, ref.ioctx, ref.obj.oid, std::move(op), rctx.y, 0, &trace, &epoch);
   tracepoint(rgw_rados, operate_exit, req_id.c_str());
   if (r < 0) { /* we can expect to get -ECANCELED if object was replaced under,
                 or -ENOENT if was removed, or -EEXIST if it did not exist
@@ -6156,7 +6156,7 @@ int RGWRados::Object::Delete::delete_obj(optional_yield y, const DoutPrefixProvi
 
   auto& ioctx = ref.ioctx;
   version_t epoch = 0;
-  r = rgw_rados_operate(dpp, ioctx, ref.obj.oid, &op, y, 0, nullptr, &epoch);
+  r = rgw_rados_operate(dpp, ioctx, ref.obj.oid, std::move(op), y, 0, nullptr, &epoch);
 
   /* raced with another operation, object state is indeterminate */
   const bool need_invalidate = (r == -ECANCELED);
@@ -6234,7 +6234,7 @@ int RGWRados::delete_raw_obj(const DoutPrefixProvider *dpp, const rgw_raw_obj& o
   ObjectWriteOperation op;
 
   op.remove();
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
   if (r < 0)
     return r;
 
@@ -6894,7 +6894,7 @@ int RGWRados::set_attrs(const DoutPrefixProvider *dpp, RGWObjectCtx* octx, RGWBu
   op.mtime2(&mtime_ts);
   auto& ioctx = ref.ioctx;
   version_t epoch = 0;
-  r = rgw_rados_operate(dpp, ioctx, ref.obj.oid, &op, y, 0, nullptr, &epoch);
+  r = rgw_rados_operate(dpp, ioctx, ref.obj.oid, std::move(op), y, 0, nullptr, &epoch);
   if (state) {
     if (r >= 0) {
       ACLOwner owner;
@@ -7569,7 +7569,7 @@ int RGWRados::Object::Read::read(int64_t ofs, int64_t end,
 
   state.cur_ioctx->locator_set_key(read_obj.loc);
 
-  r = rgw_rados_operate(dpp, *state.cur_ioctx, read_obj.oid, &op, nullptr, y);
+  r = rgw_rados_operate(dpp, *state.cur_ioctx, read_obj.oid, std::move(op), nullptr, y);
   ldpp_dout(dpp, 20) << "rados->read r=" << r << " bl.length=" << bl.length() << dendl;
 
   if (r < 0) {
@@ -7776,7 +7776,7 @@ int RGWRados::iterate_obj(const DoutPrefixProvider *dpp, RGWObjectCtx& obj_ctx,
   return 0;
 }
 
-int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, ObjectWriteOperation *op, optional_yield y)
+int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, ObjectWriteOperation&& op, optional_yield y)
 {
   rgw_rados_ref ref;
   int r = get_obj_head_ref(dpp, bucket_info, obj, &ref);
@@ -7784,10 +7784,10 @@ int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bu
     return r;
   }
 
-  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, op, y);
+  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
 }
 
-int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, ObjectReadOperation *op, optional_yield y)
+int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, ObjectReadOperation&& op, optional_yield y)
 {
   rgw_rados_ref ref;
   int r = get_obj_head_ref(dpp, bucket_info, obj, &ref);
@@ -7797,7 +7797,7 @@ int RGWRados::obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bu
 
   bufferlist outbl;
 
-  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, op, &outbl, y);
+  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), &outbl, y);
 }
 
 void RGWRados::olh_cancel_modification(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info,
@@ -7822,7 +7822,7 @@ void RGWRados::olh_cancel_modification(const DoutPrefixProvider *dpp, const RGWB
   ObjectWriteOperation op;
   bucket_index_guard_olh_op(dpp, state, op);
   op.rmxattr(attr_name.c_str());
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
   if (r < 0) {
     if (r != -ENOENT && r != -ECANCELED) {
       ldpp_dout(dpp, 0) << __func__ << " target_obj=" << olh_obj << " rmxattr rgw_rados_operate() returned " << r << dendl;
@@ -7838,7 +7838,7 @@ void RGWRados::olh_cancel_modification(const DoutPrefixProvider *dpp, const RGWB
     rm_op.cmpxattr(RGW_ATTR_OLH_INFO, CEPH_OSD_CMPXATTR_OP_EQ, bufferlist());
     cls_obj_check_prefix_exist(rm_op, RGW_ATTR_OLH_PENDING_PREFIX, true);
     rm_op.remove();
-    r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &rm_op, y);
+    r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(rm_op), y);
   }
   if (r < 0 && (r != -ENOENT && r != -ECANCELED)) {
     ldpp_dout(dpp, 0) << __func__ << " target_obj=" << olh_obj << " olh rm rgw_rados_operate() returned " << r << dendl;
@@ -7935,7 +7935,7 @@ int RGWRados::olh_init_modification_impl(const DoutPrefixProvider *dpp, const RG
 
   op.setxattr(attr_name.c_str(), bl);
 
-  int ret = obj_operate(dpp, bucket_info, olh_obj, &op, y);
+  int ret = obj_operate(dpp, bucket_info, olh_obj, std::move(op), y);
   if (ret < 0) {
     return ret;
   }
@@ -8273,7 +8273,7 @@ int RGWRados::bucket_index_link_olh(const DoutPrefixProvider *dpp, RGWBucketInfo
                                               delete_marker, op_tag, meta, olh_epoch,
                                              unmod_since, high_precision_time,
                                              log_data_change, zones_trace);
-                      return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+                      return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
                     }, y);
   if (r < 0) {
     ldpp_dout(dpp, 20) << "rgw_rados_operate() after cls_rgw_bucket_link_olh() returned r=" << r << dendl;
@@ -8324,7 +8324,7 @@ int RGWRados::bucket_index_unlink_instance(const DoutPrefixProvider *dpp,
                      cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                      cls_rgw_bucket_unlink_instance(op, key, op_tag,
                                                     olh_tag, olh_epoch, log_op, bilog_flags, zones_trace);
-                      return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+                      return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
                     }, y);
   if (r < 0) {
     ldpp_dout(dpp, 20) << "rgw_rados_operate() after cls_rgw_bucket_link_instance() returned r=" << r << dendl;
@@ -8365,7 +8365,7 @@ int RGWRados::bucket_index_read_olh_log(const DoutPrefixProvider *dpp,
   int op_ret = 0;
   cls_rgw_get_olh_log(op, key, ver_marker, olh_tag, log_ret, op_ret);
   bufferlist outbl;
-  r =  rgw_rados_operate(dpp, shard_ref.ioctx, shard_ref.obj.oid, &op, &outbl, y);
+  r =  rgw_rados_operate(dpp, shard_ref.ioctx, shard_ref.obj.oid, std::move(op), &outbl, y);
   if (r < 0) {
     return r;
   }
@@ -8426,7 +8426,7 @@ int RGWRados::repair_olh(const DoutPrefixProvider *dpp, RGWObjState* state, cons
   if (r < 0) {
     return r;
   }
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, 0) << "repair_olh failed to write olh attributes with "
         << cpp_strerror(r) << dendl;
@@ -8464,7 +8464,7 @@ int RGWRados::bucket_index_trim_olh_log(const DoutPrefixProvider *dpp,
                        op.assert_exists(); // bucket index shard must exist
                        cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                        cls_rgw_trim_olh_log(op, key, ver, olh_tag);
-                        return pbs->bucket_obj.operate(dpp, &op, y);
+                        return pbs->bucket_obj.operate(dpp, std::move(op), y);
                       }, y);
   if (ret < 0) {
     ldpp_dout(dpp, 20) << "cls_rgw_trim_olh_log() returned r=" << ret << dendl;
@@ -8496,7 +8496,7 @@ int RGWRados::bucket_index_clear_olh(const DoutPrefixProvider *dpp,
                            auto& ref = bs.bucket_obj;
                            cls_rgw_guard_bucket_resharding(op, -ERR_BUSY_RESHARDING);
                            cls_rgw_clear_olh(op, key, olh_tag);
-                            return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+                            return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
                           }, y);
   if (ret < 0) {
     ldpp_dout(dpp, 5) << "rgw_rados_operate() after cls_rgw_clear_olh() returned ret=" << ret << dendl;
@@ -8650,7 +8650,7 @@ int RGWRados::apply_olh_log(const DoutPrefixProvider *dpp,
   }
 
   /* update olh object */
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, 0) << "ERROR: " << __func__ << ": could not apply olh update to oid \"" << ref.obj.oid << "\", r=" << r << dendl;
     return r;
@@ -8728,7 +8728,7 @@ int RGWRados::clear_olh(const DoutPrefixProvider *dpp,
   cls_obj_check_prefix_exist(rm_op, RGW_ATTR_OLH_PENDING_PREFIX, true); /* fail if found one of these, pending modification */
   rm_op.remove();
 
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &rm_op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(rm_op), y);
   if (r == -ECANCELED) {
     return r; /* someone else made a modification in the meantime */
   }
@@ -8963,7 +8963,7 @@ int RGWRados::get_olh(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info,
   ObjectReadOperation op;
   op.getxattrs(&attrset, NULL);
 
-  int r = obj_operate(dpp, bucket_info, obj, &op, y);
+  int r = obj_operate(dpp, bucket_info, obj, std::move(op), y);
   if (r < 0) {
     return r;
   }
@@ -9028,7 +9028,7 @@ int RGWRados::remove_olh_pending_entries(const DoutPrefixProvider *dpp, const RG
       op.rmxattr(i->first.c_str());
     }
 
-    r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+    r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
     if (r == -ENOENT || r == -ECANCELED) {
       /* raced with some other change, shouldn't sweat about it */
       return 0;
@@ -9125,7 +9125,7 @@ int RGWRados::raw_obj_stat(const DoutPrefixProvider *dpp,
   }
 
   bufferlist outbl;
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, &outbl, y, 0, nullptr, epoch);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), &outbl, y, 0, nullptr, epoch);
   if (r < 0)
     return r;
 
@@ -9689,9 +9689,9 @@ int RGWRados::trim_reshard_log_entries(const DoutPrefixProvider *dpp, RGWBucketI
   return CLSRGWIssueReshardLogTrim(index_pool, bucket_objs, cct->_conf->rgw_bucket_index_max_aio)();
 }
 
-int RGWRados::gc_operate(const DoutPrefixProvider *dpp, string& oid, librados::ObjectWriteOperation *op, optional_yield y)
+int RGWRados::gc_operate(const DoutPrefixProvider *dpp, string& oid, librados::ObjectWriteOperation&& op, optional_yield y)
 {
-  return rgw_rados_operate(dpp, gc_pool_ctx, oid, op, y);
+  return rgw_rados_operate(dpp, gc_pool_ctx, oid, std::move(op), y);
 }
 
 int RGWRados::gc_aio_operate(const string& oid, librados::AioCompletion *c,
@@ -9700,9 +9700,9 @@ int RGWRados::gc_aio_operate(const string& oid, librados::AioCompletion *c,
   return gc_pool_ctx.aio_operate(oid, c, op);
 }
 
-int RGWRados::gc_operate(const DoutPrefixProvider *dpp, string& oid, librados::ObjectReadOperation *op, bufferlist *pbl, optional_yield y)
+int RGWRados::gc_operate(const DoutPrefixProvider *dpp, string& oid, librados::ObjectReadOperation&& op, bufferlist *pbl, optional_yield y)
 {
-  return rgw_rados_operate(dpp, gc_pool_ctx, oid, op, pbl, y);
+  return rgw_rados_operate(dpp, gc_pool_ctx, oid, std::move(op), pbl, y);
 }
 
 int RGWRados::list_gc_objs(int *index, string& marker, uint32_t max, bool expired_only, std::list<cls_rgw_gc_obj_info>& result, bool *truncated, bool& processing_queue)
@@ -9750,7 +9750,7 @@ int RGWRados::cls_obj_prepare_op(const DoutPrefixProvider *dpp, BucketShard& bs,
   cls_rgw_obj_key key(obj.key.get_index_key_name(), obj.key.instance);
   cls_rgw_guard_bucket_resharding(o, -ERR_BUSY_RESHARDING);
   cls_rgw_bucket_prepare_op(o, op, tag, key, obj.key.get_loc(), log_op, bilog_flags, zones_trace);
-  int ret = bs.bucket_obj.operate(dpp, &o, y);
+  int ret = bs.bucket_obj.operate(dpp, std::move(o), y);
   ldout_bitx(bitx, dpp, 10) << "EXITING " << __func__ << ": ret=" << ret << dendl_bitx;
   return ret;
 }
@@ -10349,7 +10349,7 @@ int RGWRados::cls_bucket_list_unordered(const DoutPrefixProvider *dpp,
     cls_rgw_bucket_list_op(op, marker, prefix, empty_delimiter,
                           num_entries,
                            list_versions, &result);
-    r = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y, 0, nullptr, &index_ver.epoch);
+    r = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y, 0, nullptr, &index_ver.epoch);
     if (r < 0) {
       ldpp_dout(dpp, 0) << "ERROR: " << __func__ <<
        ": error in rgw_rados_operate (bucket list op), r=" << r << dendl;
@@ -10452,7 +10452,7 @@ int RGWRados::cls_obj_usage_log_add(const DoutPrefixProvider *dpp, const string&
   ObjectWriteOperation op;
   cls_rgw_usage_log_add(op, info);
 
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
   return r;
 }
 
@@ -10483,7 +10483,7 @@ static int cls_rgw_usage_log_trim_repeat(const DoutPrefixProvider *dpp, rgw_rado
   do {
     librados::ObjectWriteOperation op;
     cls_rgw_usage_log_trim(op, user, bucket, start_epoch, end_epoch);
-    int r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+    int r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
     if (r == -ENODATA)
       done = true;
     else if (r < 0)
@@ -10519,7 +10519,7 @@ int RGWRados::cls_obj_usage_log_clear(const DoutPrefixProvider *dpp, string& oid
   }
   librados::ObjectWriteOperation op;
   cls_rgw_usage_log_clear(op);
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
   return r;
 }
 
index 217159487bf5369b1bceae2a36623d0e8e3b2d6e..1e4c11bacbfef6adfe046c4a0624e9bf48e81b0a 100644 (file)
@@ -1350,8 +1350,8 @@ int restore_obj_from_cloud(RGWLCCloudTierCtx& tier_ctx,
                    std::map<std::string, bufferlist> *attrs, bufferlist *first_chunk,
                    RGWObjVersionTracker *objv_tracker, optional_yield y);
 
-  int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectWriteOperation *op, optional_yield y);
-  int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectReadOperation *op, optional_yield y);
+  int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectWriteOperation&& op, optional_yield y);
+  int obj_operate(const DoutPrefixProvider *dpp, const RGWBucketInfo& bucket_info, const rgw_obj& obj, librados::ObjectReadOperation&& op, optional_yield y);
 
   int guard_reshard(const DoutPrefixProvider *dpp,
                     BucketShard *bs,
@@ -1580,10 +1580,10 @@ public:
   std::tuple<int, std::optional<cls_rgw_obj_chain>> send_chain_to_gc(cls_rgw_obj_chain& chain, const std::string& tag, optional_yield y);
   void delete_objs_inline(const DoutPrefixProvider *dpp, cls_rgw_obj_chain& chain,
                           const std::string& tag, optional_yield y);
-  int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectWriteOperation *op, optional_yield y);
+  int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectWriteOperation&& op, optional_yield y);
   int gc_aio_operate(const std::string& oid, librados::AioCompletion *c,
                      librados::ObjectWriteOperation *op);
-  int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectReadOperation *op, bufferlist *pbl, optional_yield y);
+  int gc_operate(const DoutPrefixProvider *dpp, std::string& oid, librados::ObjectReadOperation&& op, bufferlist *pbl, optional_yield y);
 
   int list_gc_objs(int *index, std::string& marker, uint32_t max, bool expired_only, std::list<cls_rgw_gc_obj_info>& result, bool *truncated, bool& processing_queue);
   int process_gc(bool expired_only, optional_yield y);
index ac06f76143bb97c524c0bd81b955876bedfb04d6..82080c4a06f278f2db52f3f8a87a7c143f8e2e1e 100644 (file)
@@ -1400,7 +1400,7 @@ int RGWReshard::add(const DoutPrefixProvider *dpp, cls_rgw_reshard_entry& entry,
 
   cls_rgw_reshard_add(op, entry, create_only);
 
-  int ret = rgw_rados_operate(dpp, store->getRados()->reshard_pool_ctx, logshard_oid, &op, y);
+  int ret = rgw_rados_operate(dpp, store->getRados()->reshard_pool_ctx, logshard_oid, std::move(op), y);
   if (create_only && ret == -EEXIST) {
     ldpp_dout(dpp, 20) <<
       "INFO: did not write reshard queue entry for oid=" <<
@@ -1495,7 +1495,7 @@ int RGWReshard::remove(const DoutPrefixProvider *dpp, const cls_rgw_reshard_entr
   librados::ObjectWriteOperation op;
   cls_rgw_reshard_remove(op, entry);
 
-  int ret = rgw_rados_operate(dpp, store->getRados()->reshard_pool_ctx, logshard_oid, &op, y);
+  int ret = rgw_rados_operate(dpp, store->getRados()->reshard_pool_ctx, logshard_oid, std::move(op), y);
   if (ret < 0) {
     ldpp_dout(dpp, -1) << "ERROR: failed to remove entry from reshard log, oid=" << logshard_oid << " tenant=" << entry.tenant << " bucket=" << entry.bucket_name << dendl;
     return ret;
index ea2572b4121156a39dfd0ca1d2814d17f79d7406..d3efb511661db6dbe49cf70c0d15da0088174abf 100644 (file)
@@ -1293,7 +1293,7 @@ int RadosBucket::write_logging_object(const std::string& obj_name,
     std::ignore = completion.release();
     return 0;
   }
-  if (const auto ret = rgw_rados_operate(dpp, io_ctx, temp_obj_name, &op, y); ret < 0) {
+  if (const auto ret = rgw_rados_operate(dpp, io_ctx, temp_obj_name, std::move(op), y); ret < 0) {
     ldpp_dout(dpp, 1) << "ERROR: failed to append to logging object '" << temp_obj_name <<
       "'. ret = " << ret << dendl;
     return ret;
@@ -2768,7 +2768,7 @@ int RadosObject::get_torrent_info(const DoutPrefixProvider* dpp,
   librados::ObjectReadOperation op;
   op.omap_get_vals_by_keys(keys, &result, nullptr);
 
-  ret = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, nullptr, y);
+  ret = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), nullptr, y);
   if (ret < 0) {
     return ret;
   }
@@ -4260,10 +4260,11 @@ MPRadosSerializer::MPRadosSerializer(const DoutPrefixProvider *dpp, RadosStore*
 
 int MPRadosSerializer::try_lock(const DoutPrefixProvider *dpp, utime_t dur, optional_yield y)
 {
+  librados::ObjectWriteOperation op;
   op.assert_exists();
   lock.set_duration(dur);
   lock.lock_exclusive(&op);
-  int ret = rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  int ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
   if (! ret) {
     locked = true;
   }
@@ -4293,7 +4294,7 @@ int RadosLifecycle::get_entry(const DoutPrefixProvider* dpp, optional_yield y,
   cls_rgw_lc_get_entry(op, marker, bl);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  int ret = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  int ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (ret < 0) {
     return ret;
   }
@@ -4319,7 +4320,7 @@ int RadosLifecycle::get_next_entry(const DoutPrefixProvider* dpp, optional_yield
   cls_rgw_lc_get_next_entry(op, marker, bl);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  int ret = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  int ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (ret < 0) {
     return ret;
   }
@@ -4349,7 +4350,7 @@ int RadosLifecycle::set_entry(const DoutPrefixProvider* dpp, optional_yield y,
   cls_rgw_lc_set_entry(op, cls_entry);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  return rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  return rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
 }
 
 int RadosLifecycle::list_entries(const DoutPrefixProvider* dpp, optional_yield y,
@@ -4363,7 +4364,7 @@ int RadosLifecycle::list_entries(const DoutPrefixProvider* dpp, optional_yield y
   cls_rgw_lc_list(op, marker, max_entries, bl);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  int ret = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  int ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (ret < 0) {
     return ret;
   }
@@ -4393,7 +4394,7 @@ int RadosLifecycle::rm_entry(const DoutPrefixProvider* dpp, optional_yield y,
   cls_rgw_lc_rm_entry(op, cls_entry);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  return rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  return rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
 }
 
 int RadosLifecycle::get_head(const DoutPrefixProvider* dpp, optional_yield y,
@@ -4404,7 +4405,7 @@ int RadosLifecycle::get_head(const DoutPrefixProvider* dpp, optional_yield y,
   cls_rgw_lc_get_head(op, bl);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  int ret = rgw_rados_operate(dpp, ioctx, oid, &op, nullptr, y);
+  int ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), nullptr, y);
   if (ret < 0) {
     return ret;
   }
@@ -4434,7 +4435,7 @@ int RadosLifecycle::put_head(const DoutPrefixProvider* dpp, optional_yield y,
   cls_rgw_lc_put_head(op, cls_head);
 
   auto& ioctx = *store->getRados()->get_lc_pool_ctx();
-  return rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  return rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
 }
 
 std::unique_ptr<LCSerializer> RadosLifecycle::get_serializer(const std::string& lock_name,
@@ -4759,7 +4760,7 @@ int RadosLuaManager::add_package(const DoutPrefixProvider *dpp, optional_yield y
   librados::ObjectWriteOperation op;
   op.omap_set(new_package);
   return rgw_rados_operate(dpp, ioctx,
-      PACKAGE_LIST_OBJECT_NAME, &op, y);
+      PACKAGE_LIST_OBJECT_NAME, std::move(op), y);
 }
 
 int RadosLuaManager::remove_package(const DoutPrefixProvider *dpp, optional_yield y, const std::string& package_name)
@@ -4774,7 +4775,7 @@ int RadosLuaManager::remove_package(const DoutPrefixProvider *dpp, optional_yiel
     // remove specific version of the the package
     op.omap_rm_keys(std::set<std::string>({package_name}));
     auto ret = rgw_rados_operate(dpp, ioctx,
-        PACKAGE_LIST_OBJECT_NAME, &op, y);
+        PACKAGE_LIST_OBJECT_NAME, std::move(op), y);
     if (ret < 0) {
         return ret;
     }
@@ -4791,7 +4792,7 @@ int RadosLuaManager::remove_package(const DoutPrefixProvider *dpp, optional_yiel
     if (package_no_version.compare(package_name) == 0) {
         op.omap_rm_keys(std::set<std::string>({package}));
         ret = rgw_rados_operate(dpp, ioctx,
-            PACKAGE_LIST_OBJECT_NAME, &op, y);
+            PACKAGE_LIST_OBJECT_NAME, std::move(op), y);
         if (ret < 0) {
             return ret;
         }
@@ -4815,7 +4816,7 @@ int RadosLuaManager::list_packages(const DoutPrefixProvider *dpp, optional_yield
     rgw::lua::packages_t packages_chunk;
     op.omap_get_keys2(start_after, max_chunk, &packages_chunk, &more, &rval);
     const auto ret = rgw_rados_operate(dpp, ioctx,
-      PACKAGE_LIST_OBJECT_NAME, &op, nullptr, y);
+      PACKAGE_LIST_OBJECT_NAME, std::move(op), nullptr, y);
 
     if (ret < 0) {
       return ret;
@@ -4837,7 +4838,7 @@ int RadosLuaManager::watch_reload(const DoutPrefixProvider* dpp)
   librados::ObjectWriteOperation op;
   op.create(false);
   auto r = rgw_rados_operate(dpp, ioctx,
-      PACKAGE_LIST_OBJECT_NAME, &op, null_yield);
+      PACKAGE_LIST_OBJECT_NAME, std::move(op), null_yield);
   if (r < 0) {
     ldpp_dout(dpp, 1) << "ERROR: failed to watch " << PACKAGE_LIST_OBJECT_NAME
         << ". cannot create object. error: " << cpp_strerror(r) << dendl;
index ab53c66d0cc0fdb516682a296f79e29ecf91fd2d..b580d5214df97be2d339d3a804fb215701a88379 100644 (file)
@@ -893,7 +893,6 @@ protected:
 class MPRadosSerializer : public StoreMPSerializer {
   librados::IoCtx ioctx;
   ::rados::cls::lock::Lock lock;
-  librados::ObjectWriteOperation op;
 
 public:
   MPRadosSerializer(const DoutPrefixProvider *dpp, RadosStore* store, RadosObject* obj, const std::string& lock_name);
index a17ec62befd95e9ae708107061ed964e2fb81854..e4eabbaf57c8e9a2c1a00118405bb31666100101 100644 (file)
@@ -198,7 +198,7 @@ int rgw_delete_system_obj(const DoutPrefixProvider *dpp,
 }
 
 int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,
-                      librados::ObjectReadOperation *op, bufferlist* pbl,
+                      librados::ObjectReadOperation&& op, bufferlist* pbl,
                       optional_yield y, int flags, const jspan_context* trace_info,
                       version_t* pver)
 {
@@ -208,7 +208,7 @@ int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, con
     auto& yield = y.get_yield_context();
     auto ex = yield.get_executor();
     boost::system::error_code ec;
-    auto [ver, bl] = librados::async_operate(ex, ioctx, oid, std::move(*op),
+    auto [ver, bl] = librados::async_operate(ex, ioctx, oid, std::move(op),
                                              flags, trace_info, yield[ec]);
     if (pbl) {
       *pbl = std::move(bl);
@@ -219,7 +219,7 @@ int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, con
     return -ec.value();
   }
   maybe_warn_about_blocking(dpp);
-  int r = ioctx.operate(oid, op, nullptr, flags);
+  int r = ioctx.operate(oid, &op, nullptr, flags);
   if (pver) {
     *pver = ioctx.get_last_version();
   }
@@ -227,14 +227,14 @@ int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, con
 }
 
 int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,
-                      librados::ObjectWriteOperation *op, optional_yield y,
+                      librados::ObjectWriteOperation&& op, optional_yield y,
                      int flags, const jspan_context* trace_info, version_t* pver)
 {
   if (y) {
     auto& yield = y.get_yield_context();
     auto ex = yield.get_executor();
     boost::system::error_code ec;
-    version_t ver = librados::async_operate(ex, ioctx, oid, std::move(*op),
+    version_t ver = librados::async_operate(ex, ioctx, oid, std::move(op),
                                             flags, trace_info, yield[ec]);
     if (pver) {
       *pver = ver;
@@ -242,7 +242,7 @@ int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, con
     return -ec.value();
   }
   maybe_warn_about_blocking(dpp);
-  int r = ioctx.operate(oid, op, flags, trace_info);
+  int r = ioctx.operate(oid, &op, flags, trace_info);
   if (pver) {
     *pver = ioctx.get_last_version();
   }
index b86d280a4a3c98321f567357b930bc9354dba4ee..43470a0c718160875c4c588f41938ff13eee0920 100644 (file)
@@ -92,11 +92,11 @@ void rgw_filter_attrset(std::map<std::string, bufferlist>& unfiltered_attrset, c
 
 /// perform the rados operation, using the yield context when given
 int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,
-                      librados::ObjectReadOperation *op, bufferlist* pbl,
+                      librados::ObjectReadOperation&& op, bufferlist* pbl,
                       optional_yield y, int flags = 0, const jspan_context* trace_info = nullptr,
                       version_t* pver = nullptr);
 int rgw_rados_operate(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,
-                      librados::ObjectWriteOperation *op, optional_yield y,
+                      librados::ObjectWriteOperation&& op, optional_yield y,
                      int flags = 0, const jspan_context* trace_info = nullptr,
                       version_t* pver = nullptr);
 int rgw_rados_notify(const DoutPrefixProvider *dpp, librados::IoCtx& ioctx, const std::string& oid,
@@ -108,14 +108,14 @@ struct rgw_rados_ref {
   rgw_raw_obj obj;
 
 
-  int operate(const DoutPrefixProvider* dpp, librados::ObjectReadOperation* op,
+  int operate(const DoutPrefixProvider* dpp, librados::ObjectReadOperation&& op,
              bufferlist* pbl, optional_yield y, int flags = 0) {
-    return rgw_rados_operate(dpp, ioctx, obj.oid, op, pbl, y, flags);
+    return rgw_rados_operate(dpp, ioctx, obj.oid, std::move(op), pbl, y, flags);
   }
 
-  int operate(const DoutPrefixProvider* dpp, librados::ObjectWriteOperation* op,
+  int operate(const DoutPrefixProvider* dpp, librados::ObjectWriteOperation&& op,
              optional_yield y, int flags = 0) {
-    return rgw_rados_operate(dpp, ioctx, obj.oid, op, y, flags);
+    return rgw_rados_operate(dpp, ioctx, obj.oid, std::move(op), y, flags);
   }
 
   int aio_operate(librados::AioCompletion* c,
index 8503ece576cd23c9535a80faae6baed346de5b8c..da79d981f702f9e21cf740476bef7d84e8a3f4b7 100644 (file)
@@ -47,7 +47,7 @@ int add(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_add(op, resource, exclusive, limit);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int get(const DoutPrefixProvider* dpp,
@@ -69,7 +69,7 @@ int get(const DoutPrefixProvider* dpp,
   int ret = 0;
   ::cls_user_account_resource_get(op, name, resource, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r < 0) {
     return r;
   }
@@ -102,7 +102,7 @@ int remove(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_rm(op, name);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int list(const DoutPrefixProvider* dpp,
@@ -128,7 +128,7 @@ int list(const DoutPrefixProvider* dpp,
   ::cls_user_account_resource_list(op, marker, path_prefix, max_items,
                                    entries, &truncated, &next_marker, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r == -ENOENT) {
     next_marker.clear();
     return 0;
index 9dda05a9f35b6f58d67f9bebd2dc49a727f1aac3..ee389458a16d905f75ee5c414fa8ca22575e910d 100644 (file)
@@ -195,7 +195,7 @@ int link_bucket(const DoutPrefixProvider* dpp, optional_yield y,
   librados::ObjectWriteOperation op;
   op.omap_set({{bucket_key, bufferlist{}}});
 
-  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
 }
 
 int unlink_bucket(const DoutPrefixProvider* dpp, optional_yield y,
@@ -214,7 +214,7 @@ int unlink_bucket(const DoutPrefixProvider* dpp, optional_yield y,
   librados::ObjectWriteOperation op;
   op.omap_rm_keys({{bucket_key}});
 
-  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, y);
+  return rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), y);
 }
 
 int list_buckets(const DoutPrefixProvider* dpp, optional_yield y,
@@ -237,7 +237,7 @@ int list_buckets(const DoutPrefixProvider* dpp, optional_yield y,
   bool more = false;
   int rval = 0;
   op.omap_get_keys2(marker, max_items, &keys, &more, &rval);
-  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, &op, nullptr, y);
+  r = rgw_rados_operate(dpp, ref.ioctx, ref.obj.oid, std::move(op), nullptr, y);
   if (r == -ENOENT) {
     return 0;
   }
index 0da4680d6727e6e6bda6ae6a09618a04bdc025ad..84e761c749977bbcc74edf7d38105727247bc0f6 100644 (file)
@@ -41,7 +41,7 @@ int add(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_add(op, resource, exclusive, limit);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int remove(const DoutPrefixProvider* dpp,
@@ -58,7 +58,7 @@ int remove(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_rm(op, name);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int list(const DoutPrefixProvider* dpp,
@@ -84,7 +84,7 @@ int list(const DoutPrefixProvider* dpp,
   ::cls_user_account_resource_list(op, marker, path_prefix, max_items,
                                    entries, &truncated, &next_marker, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r == -ENOENT) {
     next_marker.clear();
     return 0;
index 702863a768eab361ed47cb20d2586cfe26066e20..f2be861a3973bc07a7f24aa041ae0cb4417f6cdc 100644 (file)
@@ -47,7 +47,7 @@ int add(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_add(op, resource, exclusive, limit);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int get(const DoutPrefixProvider* dpp,
@@ -69,7 +69,7 @@ int get(const DoutPrefixProvider* dpp,
   int ret = 0;
   ::cls_user_account_resource_get(op, name, resource, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r < 0) {
     return r;
   }
@@ -102,7 +102,7 @@ int remove(const DoutPrefixProvider* dpp,
 
   librados::ObjectWriteOperation op;
   ::cls_user_account_resource_rm(op, name);
-  return ref.operate(dpp, &op, y);
+  return ref.operate(dpp, std::move(op), y);
 }
 
 int list(const DoutPrefixProvider* dpp,
@@ -128,7 +128,7 @@ int list(const DoutPrefixProvider* dpp,
   ::cls_user_account_resource_list(op, marker, path_prefix, max_items,
                                    entries, &truncated, &next_marker, &ret);
 
-  r = ref.operate(dpp, &op, nullptr, y);
+  r = ref.operate(dpp, std::move(op), nullptr, y);
   if (r == -ENOENT) {
     next_marker.clear();
     return 0;
index d5230a79893d2f88e1ad1b7ba83d890f1ec4c954..6f2f5371bdfcbf6a3bf2855051ba8377599cc54c 100644 (file)
@@ -172,7 +172,7 @@ int RGWOrphanStore::store_entries(const DoutPrefixProvider *dpp, const string& o
   for (map<string, bufferlist>::const_iterator iter = entries.begin(); iter != entries.end(); ++iter) {
     ldpp_dout(dpp, 20) << " > " << iter->first << dendl;
   }
-  int ret = rgw_rados_operate(dpp, ioctx, oid, &op, null_yield);
+  int ret = rgw_rados_operate(dpp, ioctx, oid, std::move(op), null_yield);
   if (ret < 0) {
     ldpp_dout(dpp, -1) << "ERROR: " << __func__ << "(" << oid << ") returned ret=" << ret << dendl;
   }
index 740d9ab0307258c0af09c961f88ca601511db06e..9bb5de5a79e6ba598084d746d1df383fc59a7829 100644 (file)
@@ -98,7 +98,7 @@ int RGWSI_Cls::MFA::create_mfa(const DoutPrefixProvider *dpp, const rgw_user& us
   librados::ObjectWriteOperation op;
   prepare_mfa_write(&op, objv_tracker, mtime);
   rados::cls::otp::OTP::create(&op, config);
-  r = obj.operate(dpp, &op, y);
+  r = obj.operate(dpp, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, 20) << "OTP create, otp_id=" << config.id << " result=" << (int)r << dendl;
     return r;
@@ -122,7 +122,7 @@ int RGWSI_Cls::MFA::remove_mfa(const DoutPrefixProvider *dpp,
   librados::ObjectWriteOperation op;
   prepare_mfa_write(&op, objv_tracker, mtime);
   rados::cls::otp::OTP::remove(&op, id);
-  r = obj.operate(dpp, &op, y);
+  r = obj.operate(dpp, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, 20) << "OTP remove, otp_id=" << id << " result=" << (int)r << dendl;
     return r;
@@ -206,7 +206,7 @@ int RGWSI_Cls::MFA::set_mfa(const DoutPrefixProvider *dpp, const string& oid, co
   }
   prepare_mfa_write(&op, objv_tracker, mtime);
   rados::cls::otp::OTP::set(&op, entries);
-  r = obj.operate(dpp, &op, y);
+  r = obj.operate(dpp, std::move(op), y);
   if (r < 0) {
     ldpp_dout(dpp, 20) << "OTP set entries.size()=" << entries.size() << " result=" << (int)r << dendl;
     return r;
@@ -277,7 +277,7 @@ int RGWSI_Cls::TimeLog::add(const DoutPrefixProvider *dpp,
   utime_t t(ut);
   cls_log_add(op, t, section, key, bl);
 
-  return obj.operate(dpp, &op, y);
+  return obj.operate(dpp, std::move(op), y);
 }
 
 int RGWSI_Cls::TimeLog::add(const DoutPrefixProvider *dpp, 
@@ -298,7 +298,7 @@ int RGWSI_Cls::TimeLog::add(const DoutPrefixProvider *dpp,
   cls_log_add(op, entries, monotonic_inc);
 
   if (!completion) {
-    r = obj.operate(dpp, &op, y);
+    r = obj.operate(dpp, std::move(op), y);
   } else {
     r = obj.aio_operate(completion, &op);
   }
@@ -332,7 +332,7 @@ int RGWSI_Cls::TimeLog::list(const DoutPrefixProvider *dpp,
 
   bufferlist obl;
 
-  int ret = obj.operate(dpp, &op, &obl, y);
+  int ret = obj.operate(dpp, std::move(op), &obl, y);
   if (ret < 0)
     return ret;
 
@@ -357,7 +357,7 @@ int RGWSI_Cls::TimeLog::info(const DoutPrefixProvider *dpp,
 
   bufferlist obl;
 
-  int ret = obj.operate(dpp, &op, &obl, y);
+  int ret = obj.operate(dpp, std::move(op), &obl, y);
   if (ret < 0)
     return ret;
 
@@ -409,7 +409,7 @@ int RGWSI_Cls::TimeLog::trim(const DoutPrefixProvider *dpp,
   cls_log_trim(op, st, et, from_marker, to_marker);
 
   if (!completion) {
-    r = obj.operate(dpp, &op, y);
+    r = obj.operate(dpp, std::move(op), y);
   } else {
     r = obj.aio_operate(completion, &op);
   }
index 1ad6059a9621566783b02fe3b143520bb549377d..dcd1668b17e7a3e6bd38e6bb7b1100ec502f2831 100644 (file)
@@ -219,7 +219,7 @@ int RGWSI_Notify::init_watch(const DoutPrefixProvider *dpp, optional_yield y)
     librados::ObjectWriteOperation op;
     op.create(false);
 
-    r = notify_obj.operate(dpp, &op, y);
+    r = notify_obj.operate(dpp, std::move(op), y);
     if (r < 0 && r != -EEXIST) {
       ldpp_dout(dpp, 0) << "ERROR: notify_obj.operate() returned r=" << r << dendl;
       return r;
index cdbbf353832e668fc3cdba57829d2db69f6ec919..1a8c9e984af6abee5fd152be22e34be9d776625e 100644 (file)
@@ -74,7 +74,7 @@ int RGWSI_SysObj_Core::raw_stat(const DoutPrefixProvider *dpp, const rgw_raw_obj
     op.stat2(&size, &mtime_ts, nullptr);
   }
   bufferlist outbl;
-  r = rados_obj.operate(dpp, &op, &outbl, y);
+  r = rados_obj.operate(dpp, std::move(op), &outbl, y);
   if (r < 0)
     return r;
 
@@ -177,7 +177,7 @@ int RGWSI_SysObj_Core::read(const DoutPrefixProvider *dpp,
   }
 
   version_t op_ver = 0;
-  r = rgw_rados_operate(dpp, ref.ioctx, obj.oid, &op, nullptr, y, 0, nullptr, &op_ver);
+  r = rgw_rados_operate(dpp, ref.ioctx, obj.oid, std::move(op), nullptr, y, 0, nullptr, &op_ver);
   if (r < 0) {
     ldpp_dout(dpp, 20) << "rados_obj.operate() r=" << r << " bl.length=" << bl->length() << dendl;
     return r;
@@ -227,7 +227,7 @@ int RGWSI_SysObj_Core::get_attr(const DoutPrefixProvider *dpp,
   int rval;
   op.getxattr(name, dest, &rval);
 
-  r = rados_obj.operate(dpp, &op, nullptr, y);
+  r = rados_obj.operate(dpp, std::move(op), nullptr, y);
   if (r < 0)
     return r;
 
@@ -280,7 +280,7 @@ int RGWSI_SysObj_Core::set_attrs(const DoutPrefixProvider *dpp,
 
   bufferlist bl;
 
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   if (r < 0)
     return r;
 
@@ -315,7 +315,7 @@ int RGWSI_SysObj_Core::omap_get_vals(const DoutPrefixProvider *dpp,
     int rval;
     op.omap_get_vals2(start_after, count, &t, &more, &rval);
   
-    r = rados_obj.operate(dpp, &op, nullptr, y);
+    r = rados_obj.operate(dpp, std::move(op), nullptr, y);
     if (r < 0) {
       return r;
     }
@@ -357,7 +357,7 @@ int RGWSI_SysObj_Core::omap_get_all(const DoutPrefixProvider *dpp,
     int rval;
     op.omap_get_vals2(start_after, count, &t, &more, &rval);
 
-    r = rados_obj.operate(dpp, &op, nullptr, y);
+    r = rados_obj.operate(dpp, std::move(op), nullptr, y);
     if (r < 0) {
       return r;
     }
@@ -389,7 +389,7 @@ int RGWSI_SysObj_Core::omap_set(const DoutPrefixProvider *dpp, const rgw_raw_obj
   if (must_exist)
     op.assert_exists();
   op.omap_set(m);
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   return r;
 }
 
@@ -408,7 +408,7 @@ int RGWSI_SysObj_Core::omap_set(const DoutPrefixProvider *dpp, const rgw_raw_obj
   if (must_exist)
     op.assert_exists();
   op.omap_set(m);
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   return r;
 }
 
@@ -429,7 +429,7 @@ int RGWSI_SysObj_Core::omap_del(const DoutPrefixProvider *dpp, const rgw_raw_obj
 
   op.omap_rm_keys(k);
 
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   return r;
 }
 
@@ -467,7 +467,7 @@ int RGWSI_SysObj_Core::remove(const DoutPrefixProvider *dpp,
   }
 
   op.remove();
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   if (r < 0)
     return r;
 
@@ -525,7 +525,7 @@ int RGWSI_SysObj_Core::write(const DoutPrefixProvider *dpp,
     op.setxattr(name.c_str(), bl);
   }
 
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   if (r < 0) {
     return r;
   }
@@ -566,7 +566,7 @@ int RGWSI_SysObj_Core::write_data(const DoutPrefixProvider *dpp,
     objv_tracker->prepare_op_for_write(&op);
   }
   op.write_full(bl);
-  r = rados_obj.operate(dpp, &op, y);
+  r = rados_obj.operate(dpp, std::move(op), y);
   if (r < 0)
     return r;
 
index 1fa5f8681baa7262dffdb8e882aa1919800a7985..9c383146fd365b6e6e73ffaebe808bd1e6b17d8e 100644 (file)
@@ -55,7 +55,7 @@ int fifo_create(const DoutPrefixProvider *dpp, R::IoCtx& ioctx,
   R::ObjectWriteOperation op;
   RCf::create_meta(&op, id, objv, oid_prefix, exclusive, max_part_size,
                   max_entry_size);
-  return rgw_rados_operate(dpp, ioctx, oid, &op, y);
+  return rgw_rados_operate(dpp, ioctx, oid, std::move(op), y);
 }
 }
 
index a6de690af0fe06d2b01f6a3f84ed8cd60aaf7133..27866461ac0eff773eadb45405c0cda33270a1ce 100644 (file)
@@ -74,7 +74,7 @@ protected:
       cb::list bl;
       encode(i, bl);
       cls_log_add(op, ceph_clock_now(), {}, "meow", bl);
-      auto r = rgw_rados_operate(&dp, ioctx, get_oid(0, i), &op, null_yield);
+      auto r = rgw_rados_operate(&dp, ioctx, get_oid(0, i), std::move(op), null_yield);
       ASSERT_GE(r, 0);
     }
   }
@@ -85,7 +85,7 @@ protected:
     cb::list bl;
     encode(i, bl);
     cls_log_add(op, ceph_clock_now(), {}, "meow", bl);
-    auto r = rgw_rados_operate(&dp, ioctx, get_oid(0, i), &op, null_yield);
+    auto r = rgw_rados_operate(&dp, ioctx, get_oid(0, i), std::move(op), null_yield);
     ASSERT_GE(r, 0);
   }
 
@@ -98,14 +98,14 @@ protected:
        std::list<cls_log_entry> entries;
        bool truncated = false;
        cls_log_list(op, {}, {}, {}, 1, entries, &to_marker, &truncated);
-       auto r = rgw_rados_operate(&dp, ioctx, oid, &op, nullptr, null_yield);
+       auto r = rgw_rados_operate(&dp, ioctx, oid, std::move(op), nullptr, null_yield);
        ASSERT_GE(r, 0);
        ASSERT_FALSE(entries.empty());
       }
       {
        lr::ObjectWriteOperation op;
        cls_log_trim(op, {}, {}, {}, to_marker);
-       auto r = rgw_rados_operate(&dp, ioctx, oid, &op, null_yield);
+       auto r = rgw_rados_operate(&dp, ioctx, oid, std::move(op), null_yield);
        ASSERT_GE(r, 0);
       }
       {
@@ -113,7 +113,7 @@ protected:
        std::list<cls_log_entry> entries;
        bool truncated = false;
        cls_log_list(op, {}, {}, {}, 1, entries, &to_marker, &truncated);
-       auto r = rgw_rados_operate(&dp, ioctx, oid, &op, nullptr, null_yield);
+       auto r = rgw_rados_operate(&dp, ioctx, oid, std::move(op), nullptr, null_yield);
        ASSERT_GE(r, 0);
        ASSERT_TRUE(entries.empty());
       }