]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
rgw: fix leak of metadata backend context
authorCasey Bodley <cbodley@redhat.com>
Mon, 29 Jul 2019 19:18:24 +0000 (15:18 -0400)
committerCasey Bodley <cbodley@redhat.com>
Mon, 29 Jul 2019 19:20:50 +0000 (15:20 -0400)
Op had no virtual destructor, so the derived Op_ManagedCtx destructor
wasn't being called to free its context. just use Op_ManagedCtx directly

Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/rgw/rgw_metadata.cc
src/rgw/services/svc_meta_be.cc
src/rgw/services/svc_meta_be.h

index c9395a26c51a774bd990a19c664b6e78c5934598..aa50519632e74eaaae2f1c01b9aebd8018231432 100644 (file)
@@ -527,7 +527,7 @@ int RGWMetadataHandler_GenericMetaBE::get_shard_id(const string& entry, int *sha
 
 int RGWMetadataHandler_GenericMetaBE::list_keys_init(const string& marker, void **phandle)
 {
-  std::unique_ptr<RGWSI_MetaBackend_Handler::Op> op(be_handler->alloc_op());
+  auto op = std::make_unique<RGWSI_MetaBackend_Handler::Op_ManagedCtx>(be_handler);
 
   int ret = op->list_init(marker);
   if (ret < 0) {
@@ -541,7 +541,7 @@ int RGWMetadataHandler_GenericMetaBE::list_keys_init(const string& marker, void
 
 int RGWMetadataHandler_GenericMetaBE::list_keys_next(void *handle, int max, list<string>& keys, bool *truncated)
 {
-  auto op = static_cast<RGWSI_MetaBackend_Handler::Op *>(handle);
+  auto op = static_cast<RGWSI_MetaBackend_Handler::Op_ManagedCtx *>(handle);
 
   int ret = op->list_next(max, &keys, truncated);
   if (ret < 0 && ret != -ENOENT) {
@@ -559,13 +559,13 @@ int RGWMetadataHandler_GenericMetaBE::list_keys_next(void *handle, int max, list
 
 void RGWMetadataHandler_GenericMetaBE::list_keys_complete(void *handle)
 {
-  auto op = static_cast<RGWSI_MetaBackend_Handler::Op *>(handle);
+  auto op = static_cast<RGWSI_MetaBackend_Handler::Op_ManagedCtx *>(handle);
   delete op;
 }
 
 string RGWMetadataHandler_GenericMetaBE::get_marker(void *handle)
 {
-  auto op = static_cast<RGWSI_MetaBackend_Handler::Op *>(handle);
+  auto op = static_cast<RGWSI_MetaBackend_Handler::Op_ManagedCtx *>(handle);
   string marker;
   int r = op->list_get_marker(&marker);
   if (r < 0) {
index f6de057153552b1715d60640b603b5c43dbc9572..72451d48a302547dcf9f0f81b058466de7dc74e5 100644 (file)
@@ -169,11 +169,6 @@ int RGWSI_MetaBackend_Handler::call(std::optional<RGWSI_MetaBackend_CtxParams> b
   });
 }
 
-RGWSI_MetaBackend_Handler::Op *RGWSI_MetaBackend_Handler::alloc_op()
-{
-  return new Op_ManagedCtx(this);
-}
-
 RGWSI_MetaBackend_Handler::Op_ManagedCtx::Op_ManagedCtx(RGWSI_MetaBackend_Handler *handler) : Op(handler->be, handler->be->alloc_ctx())
 {
   auto c = ctx();
index 4258ae91f6a6ff3b0a57ec2284cc93372af7a10a..61b01935e9d2861f50cced875c769df62bb32e42 100644 (file)
@@ -275,6 +275,5 @@ public:
 
   virtual int call(std::optional<RGWSI_MetaBackend_CtxParams> bectx_params,
                    std::function<int(Op *)> f);
-  virtual Op *alloc_op();
 };