From: Vedansh Bhartia Date: Wed, 14 Jun 2023 12:44:10 +0000 (+0530) Subject: rgw: Add a wrapper for librados::AioCompletion to prevent memory leaks X-Git-Tag: v19.3.0~354^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a10f6e37e4291c682e9b7dccf1d819a04f9b3cbb;p=ceph-ci.git rgw: Add a wrapper for librados::AioCompletion to prevent memory leaks Signed-off-by: Vedansh Bhartia --- diff --git a/src/rgw/driver/rados/rgw_gc.cc b/src/rgw/driver/rados/rgw_gc.cc index 4705c46fff4..4b30219734c 100644 --- a/src/rgw/driver/rados/rgw_gc.cc +++ b/src/rgw/driver/rados/rgw_gc.cc @@ -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& 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; } diff --git a/src/rgw/rgw_aio.cc b/src/rgw/rgw_aio.cc index 02e3411858a..cd85ea6d7fa 100644 --- a/src/rgw/rgw_aio.cc +++ b/src/rgw/rgw_aio.cc @@ -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)) {} }; diff --git a/src/rgw/rgw_common.h b/src/rgw/rgw_common.h index de2f7443164..c1d19e49d94 100644 --- a/src/rgw/rgw_common.h +++ b/src/rgw/rgw_common.h @@ -1842,3 +1842,9 @@ rgw_global_init(const std::map *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;