]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix segfault in OpsLogRados::log when realm is reloaded 45410/head
authorCory Snyder <csnyder@iland.com>
Thu, 3 Feb 2022 19:48:05 +0000 (14:48 -0500)
committerCasey Bodley <cbodley@redhat.com>
Tue, 14 Jun 2022 14:36:26 +0000 (10:36 -0400)
We weren't previously handling the deallocation of the store when
a realm was reloaded. Now passing a const reference to the pointer.

Fixes: https://tracker.ceph.com/issues/54130
Signed-off-by: Cory Snyder <csnyder@iland.com>
(cherry picked from commit 0713f65355586b2f6ceeb6bbce8763158847e5ed)

Conflicts:
src/rgw/rgw_log.cc
src/rgw/rgw_log.h

Cherry-pick notes:
- conflicts due to rename of RGWRados to rgw::sal::Store after Pacific

(cherry picked from commit 44a37dc0023a69da33620dc7b6e112221f7a6a0b)

src/rgw/librgw.cc
src/rgw/rgw_log.cc
src/rgw/rgw_log.h
src/rgw/rgw_main.cc

index e9e586da96ef9a919766fd42602461a4132be36a..54f68085c0eb83c8133b1df6059c2b69fec40efe 100644 (file)
@@ -600,7 +600,7 @@ namespace rgw {
       ops_log_file->start();
       olog_manifold->add_sink(ops_log_file);
     }
-    olog_manifold->add_sink(new OpsLogRados(store->getRados()));
+    olog_manifold->add_sink(new OpsLogRados(store));
     olog = olog_manifold;
 
     int port = 80;
index 5876b1789bff22efa4c769810e7afc4bccd5521c..cc317ca573c38075e86b7d06cf5ebf2f51617264 100644 (file)
@@ -13,6 +13,7 @@
 #include "rgw_client_io.h"
 #include "rgw_rest.h"
 #include "rgw_zone.h"
+#include "rgw_sal_rados.h"
 
 #include "services/svc_zone.h"
 
@@ -469,7 +470,7 @@ int OpsLogSocket::log_json(struct req_state* s, bufferlist& bl)
   return 0;
 }
 
-OpsLogRados::OpsLogRados(RGWRados* store): store(store)
+OpsLogRados::OpsLogRados(rgw::sal::RGWRadosStore* const& store) : store(store)
 {
 }
 
@@ -488,16 +489,18 @@ int OpsLogRados::log(struct req_state* s, struct rgw_log_entry& entry)
   else
     localtime_r(&t, &bdt);
 
+  RGWRados* rados = store->getRados();
+
   string oid = render_log_object_name(s->cct->_conf->rgw_log_object_name, &bdt,
                                       entry.bucket_id, entry.bucket);
-  rgw_raw_obj obj(store->svc.zone->get_zone_params().log_pool, oid);
-  int ret = store->append_async(s, obj, bl.length(), bl);
+  rgw_raw_obj obj(rados->svc.zone->get_zone_params().log_pool, oid);
+  int ret = rados->append_async(s, obj, bl.length(), bl);
   if (ret == -ENOENT) {
-      ret = store->create_pool(s, store->svc.zone->get_zone_params().log_pool);
+      ret = rados->create_pool(s, rados->svc.zone->get_zone_params().log_pool);
       if (ret < 0)
           goto done;
       // retry
-      ret = store->append_async(s, obj, bl.length(), bl);
+      ret = rados->append_async(s, obj, bl.length(), bl);
   }
 done:
   if (ret < 0) {
index 5f5951f9e2434088dcbd010fcd16fa9f8f16bf10..0683b3efdd4c89b18d23417c17848f1afd02b4fb 100644 (file)
@@ -197,9 +197,10 @@ public:
 };
 
 class OpsLogRados : public OpsLogSink {
-  RGWRados* store;
+  // main()'s Store pointer as a reference, possibly modified by RGWRealmReloader
+  rgw::sal::RGWRadosStore* const& store;
 public:
-  OpsLogRados(RGWRados* store);
+  OpsLogRados(rgw::sal::RGWRadosStore* const& store);
   int log(struct req_state* s, struct rgw_log_entry& entry) override;
 };
 
index e0379f1f800252ffd8863227a912a331c4200c34..3a5e15dcc941a4e2a59b4bd279ec9e2e03fc52a5 100644 (file)
@@ -516,7 +516,7 @@ int radosgw_Main(int argc, const char **argv)
     ops_log_file->start();
     olog->add_sink(ops_log_file);
   }
-  olog->add_sink(new OpsLogRados(store->getRados()));
+  olog->add_sink(new OpsLogRados(store));
 
   r = signal_fd_init();
   if (r < 0) {