]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: reopen ops log file on sighup 46625/head
authorCory Snyder <csnyder@iland.com>
Thu, 6 Jan 2022 18:55:48 +0000 (13:55 -0500)
committerCory Snyder <csnyder@iland.com>
Fri, 10 Jun 2022 18:00:28 +0000 (14:00 -0400)
Handles radosgw SIGHUP such that ops log file is reopened if applicable.

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

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

index 33b161a45f9f96b9e4d6d1bb7c3dcdefee9fac8b..01789bd4e04f373e3a7ea1b5699ac0ca7d3b68e9 100644 (file)
@@ -344,10 +344,14 @@ int OpsLogManifold::log(struct req_state* s, struct rgw_log_entry& entry)
 }
 
 OpsLogFile::OpsLogFile(CephContext* cct, std::string& path, uint64_t max_data_size) :
-  cct(cct), file(path, std::ofstream::app), data_size(0), max_data_size(max_data_size)
+  cct(cct), data_size(0), max_data_size(max_data_size), path(path), need_reopen(false)
 {
 }
 
+void OpsLogFile::reopen() {
+  need_reopen = true;
+}
+
 void OpsLogFile::flush()
 {
   {
@@ -359,6 +363,11 @@ void OpsLogFile::flush()
   for (auto bl : flush_buffer) {
     int try_num = 0;
     while (true) {
+      if (!file.is_open() || need_reopen) {
+        need_reopen = false;
+        file.close();
+        file.open(path, std::ofstream::app);
+      }
       bl.write_stream(file);
       if (!file) {
         ldpp_dout(this, 0) << "ERROR: failed to log RGW ops log file entry" << dendl;
index 7bcb62b18579cb90791f8fa61cd1b877c114f467..874f97079c79308507a78772d340864b620460ca 100644 (file)
@@ -173,6 +173,8 @@ class OpsLogFile : public JsonOpsLogSink, public Thread, public DoutPrefixProvid
   bool stopped;
   uint64_t data_size;
   uint64_t max_data_size;
+  std::string path;
+  std::atomic_bool need_reopen;
 
   void flush();
 protected:
@@ -184,6 +186,7 @@ public:
   CephContext *get_cct() const override { return cct; }
   unsigned get_subsys() const override { return dout_subsys; }
   std::ostream& gen_prefix(std::ostream& out) const override { return out << "rgw OpsLogFile: "; }
+  void reopen();
   void start();
   void stop();
 };
index 8d6555a2b7fa06a9f18cb2840cb9bf5a856e847b..a346b33b7c004e163133acba316b3ad7bbe559d6 100644 (file)
@@ -131,6 +131,15 @@ static void handle_sigterm(int signum)
 
 }
 
+static OpsLogFile* ops_log_file = nullptr;
+
+static void rgw_sighup_handler(int signum) {
+    if (ops_log_file != nullptr) {
+        ops_log_file->reopen();
+    }
+    sighup_handler(signum);
+}
+
 static void godown_alarm(int signum)
 {
   _exit(0);
@@ -315,7 +324,6 @@ int radosgw_Main(int argc, const char **argv)
   common_init_finish(g_ceph_context);
 
   init_async_signal_handler();
-  register_async_signal_handler(SIGHUP, sighup_handler);
 
   TracepointProvider::initialize<rgw_rados_tracepoint_traits>(g_ceph_context);
   TracepointProvider::initialize<rgw_op_tracepoint_traits>(g_ceph_context);
@@ -546,12 +554,12 @@ int radosgw_Main(int argc, const char **argv)
     olog_socket->init(g_conf()->rgw_ops_log_socket_path);
     olog->add_sink(olog_socket);
   }
-  OpsLogFile* ops_log_file;
   if (!g_conf()->rgw_ops_log_file_path.empty()) {
     ops_log_file = new OpsLogFile(g_ceph_context, g_conf()->rgw_ops_log_file_path, g_conf()->rgw_ops_log_data_backlog);
     ops_log_file->start();
     olog->add_sink(ops_log_file);
   }
+  register_async_signal_handler(SIGHUP, rgw_sighup_handler);
   olog->add_sink(new OpsLogRados(store));
 
   r = signal_fd_init();
@@ -693,7 +701,7 @@ int radosgw_Main(int argc, const char **argv)
     delete fec;
   }
 
-  unregister_async_signal_handler(SIGHUP, sighup_handler);
+  unregister_async_signal_handler(SIGHUP, rgw_sighup_handler);
   unregister_async_signal_handler(SIGTERM, handle_sigterm);
   unregister_async_signal_handler(SIGINT, handle_sigterm);
   unregister_async_signal_handler(SIGUSR1, handle_sigterm);