From: Cory Snyder Date: Thu, 3 Feb 2022 19:48:05 +0000 (-0500) Subject: rgw: fix segfault in OpsLogRados::log when realm is reloaded X-Git-Tag: v16.2.11~103^2~78^2 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F45410%2Fhead;p=ceph.git rgw: fix segfault in OpsLogRados::log when realm is reloaded 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 (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) --- diff --git a/src/rgw/librgw.cc b/src/rgw/librgw.cc index e9e586da96ef9..54f68085c0eb8 100644 --- a/src/rgw/librgw.cc +++ b/src/rgw/librgw.cc @@ -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; diff --git a/src/rgw/rgw_log.cc b/src/rgw/rgw_log.cc index 5876b1789bff2..cc317ca573c38 100644 --- a/src/rgw/rgw_log.cc +++ b/src/rgw/rgw_log.cc @@ -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) { diff --git a/src/rgw/rgw_log.h b/src/rgw/rgw_log.h index 5f5951f9e2434..0683b3efdd4c8 100644 --- a/src/rgw/rgw_log.h +++ b/src/rgw/rgw_log.h @@ -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; }; diff --git a/src/rgw/rgw_main.cc b/src/rgw/rgw_main.cc index e0379f1f80025..3a5e15dcc941a 100644 --- a/src/rgw/rgw_main.cc +++ b/src/rgw/rgw_main.cc @@ -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) {