Skip to content

Commit

Permalink
support log rotate signal SIGUSR1. 3.0.8
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Dec 8, 2016
1 parent 9e9cad1 commit 2955b1f
Show file tree
Hide file tree
Showing 9 changed files with 61 additions and 23 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -378,6 +378,7 @@ Remark:

### History

* v3.0, 2016-12-08, support log rotate signal SIGUSR1. 3.0.8
* v3.0, 2016-12-07, fix typo and refine grammar. 3.0.7
* v3.0, 2015-10-23, fix [#467][bug #467], support write log to kafka. 3.0.6
* v3.0, 2015-10-20, fix [#502][bug #502], support snapshot with http-callback or transcoder. 3.0.5
Expand Down
13 changes: 13 additions & 0 deletions trunk/src/app/srs_app_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,19 @@ int SrsFastLog::initialize()
return ret;
}

void SrsFastLog::reopen()
{
if (fd > 0) {
::close(fd);
}

if (!log_to_file_tank) {
return;
}

open_log_file();
}

void SrsFastLog::verbose(const char* tag, int context_id, const char* fmt, ...)
{
if (_level > SrsLogLevel::Verbose) {
Expand Down
1 change: 1 addition & 0 deletions trunk/src/app/srs_app_log.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ class SrsFastLog : public ISrsLog, public ISrsReloadHandler
virtual ~SrsFastLog();
public:
virtual int initialize();
virtual void reopen();
virtual void verbose(const char* tag, int context_id, const char* fmt, ...);
virtual void info(const char* tag, int context_id, const char* fmt, ...);
virtual void trace(const char* tag, int context_id, const char* fmt, ...);
Expand Down
40 changes: 26 additions & 14 deletions trunk/src/app/srs_app_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -408,10 +408,10 @@ int SrsSignalManager::initialize()
int SrsSignalManager::start()
{
/**
* Note that if multiple processes are used (see below),
* the signal pipe should be initialized after the fork(2) call
* so that each process has its own private pipe.
*/
* Note that if multiple processes are used (see below),
* the signal pipe should be initialized after the fork(2) call
* so that each process has its own private pipe.
*/
struct sigaction sa;

/* Install sig_catcher() as a signal handler */
Expand All @@ -433,15 +433,10 @@ int SrsSignalManager::start()
sa.sa_handler = SrsSignalManager::sig_catcher;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SRS_SIGNAL_DISPOSE, &sa, NULL);
sigaction(SRS_SIGNAL_REOPEN_LOG, &sa, NULL);

sa.sa_handler = SrsSignalManager::sig_catcher;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SRS_SIGNAL_PERSISTENCE_CONFIG, &sa, NULL);

srs_trace("signal installed, reload=%d, dispose=%d, persistence=%d, grace_quit=%d",
SRS_SIGNAL_RELOAD, SRS_SIGNAL_DISPOSE, SRS_SIGNAL_PERSISTENCE_CONFIG, SRS_SIGNAL_GRACEFULLY_QUIT);
srs_trace("signal installed, reload=%d, reopen=%d, grace_quit=%d",
SRS_SIGNAL_RELOAD, SRS_SIGNAL_REOPEN_LOG, SRS_SIGNAL_GRACEFULLY_QUIT);

return pthread->start();
}
Expand Down Expand Up @@ -906,19 +901,36 @@ int SrsServer::cycle()
return ret;
}


void SrsServer::on_signal(int signo)
{
{
if (signo == SRS_SIGNAL_RELOAD) {
signal_reload = true;
return;
}

#ifndef SRS_AUTO_GPERF_MC
if (signo == SRS_SIGNAL_REOPEN_LOG) {
_srs_log->reopen();
srs_warn("reopen log file");
return;
}
#endif

#ifdef SRS_AUTO_GPERF_MC
if (signo == SRS_SIGNAL_REOPEN_LOG) {
signal_gmc_stop = true;
srs_warn("for gmc, the SIGUSR1 used as SIGINT");
return;
}
#endif

if (signo == SRS_SIGNAL_PERSISTENCE_CONFIG) {
signal_persistence_config = true;
return;
}

if (signo == SIGINT || signo == SRS_SIGNAL_DISPOSE) {
if (signo == SIGINT) {
#ifdef SRS_AUTO_GPERF_MC
srs_trace("gmc is on, main cycle will terminate normally.");
signal_gmc_stop = true;
Expand Down
6 changes: 3 additions & 3 deletions trunk/src/app/srs_app_server.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -325,10 +325,10 @@ class SrsServer : virtual public ISrsReloadHandler
* whatever, we will got the signo like the orignal signal(int signo) handler.
* @param signo the signal number from user, where:
* SRS_SIGNAL_GRACEFULLY_QUIT, the SIGTERM, dispose then quit.
* SRS_SIGNAL_DISPOSE, the SIGUSR2, dispose for gmc.
* SRS_SIGNAL_PERSISTENCE_CONFIG, the SIGUSR1, persistence config to file.
* SRS_SIGNAL_REOPEN_LOG, the SIGUSR1, reopen the log file.
* SRS_SIGNAL_RELOAD, the SIGHUP, reload the config.
* @remark, for SIGINT and SRS_SIGNAL_DISPOSE:
* SRS_SIGNAL_PERSISTENCE_CONFIG, application level signal, persistence config to file.
* @remark, for SIGINT:
* no gmc, directly exit.
* for gmc, set the variable signal_gmc_stop, the cycle will return and cleanup for gmc.
* @remark, maybe the HTTP RAW API will trigger the on_signal() also.
Expand Down
2 changes: 1 addition & 1 deletion trunk/src/core/srs_core.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// current release version
#define VERSION_MAJOR 3
#define VERSION_MINOR 0
#define VERSION_REVISION 7
#define VERSION_REVISION 8

// generated by configure, only macros.
#include <srs_auto_headers.hpp>
Expand Down
13 changes: 8 additions & 5 deletions trunk/src/kernel/srs_kernel_consts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -133,14 +133,17 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// signal defines.
// reload the config file and apply new config.
#define SRS_SIGNAL_RELOAD SIGHUP
// terminate the srs with dispose to detect memory leak for gmc.
#define SRS_SIGNAL_DISPOSE SIGUSR2
// persistence the config in memory to config file.
// @see https://github.com/ossrs/srs/issues/319#issuecomment-134993922
#define SRS_SIGNAL_PERSISTENCE_CONFIG SIGUSR1
// reopen the log file.
#define SRS_SIGNAL_REOPEN_LOG SIGUSR1
// srs should gracefully quit, do dispose then exit.
#define SRS_SIGNAL_GRACEFULLY_QUIT SIGTERM

// application level signals.
// persistence the config in memory to config file.
// @see https://github.com/ossrs/srs/issues/319#issuecomment-134993922
// @remark we actually don't handle the signal for it's not a valid os signal.
#define SRS_SIGNAL_PERSISTENCE_CONFIG 1000

///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////
Expand Down
4 changes: 4 additions & 0 deletions trunk/src/kernel/srs_kernel_log.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,10 @@ int ISrsLog::initialize()
return ERROR_SUCCESS;
}

void ISrsLog::reopen()
{
}

void ISrsLog::verbose(const char* /*tag*/, int /*context_id*/, const char* /*fmt*/, ...)
{
}
Expand Down
4 changes: 4 additions & 0 deletions trunk/src/kernel/srs_kernel_log.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,10 @@ class ISrsLog
* initialize log utilities.
*/
virtual int initialize();
/**
* reopen the log file for log rotate.
*/
virtual void reopen();
public:
/**
* log for verbose, very verbose information.
Expand Down

1 comment on commit 2955b1f

@winlinvip
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.