]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Add a wrapper for librados::AioCompletion to prevent memory leaks 52276/head
authorVedansh Bhartia <vedanshbhartia@gmail.com>
Wed, 14 Jun 2023 12:44:10 +0000 (18:14 +0530)
committerVedansh Bhartia <vedanshbhartia@gmail.com>
Mon, 9 Oct 2023 15:35:59 +0000 (21:05 +0530)
Signed-off-by: Vedansh Bhartia <vedanshbhartia@gmail.com>
src/rgw/driver/rados/rgw_gc.cc
src/rgw/rgw_aio.cc
src/rgw/rgw_common.h

index 4705c46fff4b29947475d2391090233589a084db..4b30219734ccb461c645d490e85a0b36d3fdb5e2 100644 (file)
@@ -170,9 +170,9 @@ void RGWGC::on_defer_canceled(const cls_rgw_gc_obj_info& info)
   cls_rgw_gc_queue_defer_entry(op, cct->_conf->rgw_gc_obj_min_wait, info);
   cls_rgw_gc_remove(op, {tag});
 
-  auto c = librados::Rados::aio_create_completion(nullptr, nullptr);
-  store->gc_aio_operate(obj_names[i], c, &op);
-  c->release();
+  aio_completion_ptr c{librados::Rados::aio_create_completion(nullptr, nullptr)};
+
+  store->gc_aio_operate(obj_names[i], c.get(), &op);
 }
 
 int RGWGC::async_defer_chain(const string& tag, const cls_rgw_obj_chain& chain)
@@ -191,9 +191,9 @@ int RGWGC::async_defer_chain(const string& tag, const cls_rgw_obj_chain& chain)
     // enqueue succeeds
     cls_rgw_gc_remove(op, {tag});
 
-    auto c = librados::Rados::aio_create_completion(nullptr, nullptr);
-    int ret = store->gc_aio_operate(obj_names[i], c, &op);
-    c->release();
+    aio_completion_ptr c{librados::Rados::aio_create_completion(nullptr, nullptr)};
+
+    int ret = store->gc_aio_operate(obj_names[i], c.get(), &op);
     return ret;
   }
 
@@ -225,12 +225,11 @@ int RGWGC::remove(int index, const std::vector<string>& tags, AioCompletion **pc
   ObjectWriteOperation op;
   cls_rgw_gc_remove(op, tags);
 
-  auto c = librados::Rados::aio_create_completion(nullptr, nullptr);
-  int ret = store->gc_aio_operate(obj_names[index], c, &op);
-  if (ret < 0) {
-    c->release();
-  } else {
-    *pc = c;
+  aio_completion_ptr c{librados::Rados::aio_create_completion(nullptr, nullptr)};
+  int ret = store->gc_aio_operate(obj_names[index], c.get(), &op);
+  if (ret >= 0) {
+    *pc = c.get();
+    c.release();
   }
   return ret;
 }
@@ -391,12 +390,13 @@ public:
       }
     }
 
-    auto c = librados::Rados::aio_create_completion(nullptr, nullptr);
-    int ret = ioctx->aio_operate(oid, c, op);
+    aio_completion_ptr c{librados::Rados::aio_create_completion(nullptr, nullptr)};
+    int ret = ioctx->aio_operate(oid, c.get(), op);
     if (ret < 0) {
       return ret;
     }
-    ios.push_back(IO{IO::TailIO, c, oid, index, tag});
+    ios.push_back(IO{IO::TailIO, c.get(), oid, index, tag});
+    c.release();
 
     return 0;
   }
index 02e3411858acf992fcb63427d2a25deaae0e453a..cd85ea6d7fabcd2957e6e5f6b95af5be386f1e4b 100644 (file)
@@ -33,6 +33,7 @@ struct state {
 
   state(Aio* aio, librados::IoCtx ctx, AioResult& r)
     : aio(aio), ctx(std::move(ctx)),
+    // coverity[ctor_dtor_leak:SUPPRESS]
       c(librados::Rados::aio_create_completion(&r, &cb)) {}
 };
 
index de2f7443164afc2e4ac4cdda4dcdcfed1d4e1d4f..c1d19e49d94899d81ebfd1cb93c757e8c95bc6cb 100644 (file)
@@ -1842,3 +1842,9 @@ rgw_global_init(const std::map<std::string,std::string> *defaults,
                    std::vector < const char* >& args,
                    uint32_t module_type, code_environment_t code_env,
                    int flags);
+
+
+struct AioCompletionDeleter {
+  void operator()(librados::AioCompletion* c) { c->release(); }
+};
+using aio_completion_ptr = std::unique_ptr<librados::AioCompletion, AioCompletionDeleter>;