}
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()
{
{
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;
}
+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);
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);
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();
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);