diff --git a/README.md b/README.md index 844cddf631..3ec026e3b1 100755 --- a/README.md +++ b/README.md @@ -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 diff --git a/trunk/src/app/srs_app_log.cpp b/trunk/src/app/srs_app_log.cpp index edfe0bccb3..01d3c295e6 100644 --- a/trunk/src/app/srs_app_log.cpp +++ b/trunk/src/app/srs_app_log.cpp @@ -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) { diff --git a/trunk/src/app/srs_app_log.hpp b/trunk/src/app/srs_app_log.hpp index aa73138f5f..6bc315aeb5 100644 --- a/trunk/src/app/srs_app_log.hpp +++ b/trunk/src/app/srs_app_log.hpp @@ -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, ...); diff --git a/trunk/src/app/srs_app_server.cpp b/trunk/src/app/srs_app_server.cpp index 8a5f4d9e18..63f48946de 100644 --- a/trunk/src/app/srs_app_server.cpp +++ b/trunk/src/app/srs_app_server.cpp @@ -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 */ @@ -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(); } @@ -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; diff --git a/trunk/src/app/srs_app_server.hpp b/trunk/src/app/srs_app_server.hpp index 6883845c8a..10f254e507 100644 --- a/trunk/src/app/srs_app_server.hpp +++ b/trunk/src/app/srs_app_server.hpp @@ -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. diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 01bc274ea9..4a11a33838 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -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 diff --git a/trunk/src/kernel/srs_kernel_consts.hpp b/trunk/src/kernel/srs_kernel_consts.hpp index 0caf29d5ef..9b96595be7 100644 --- a/trunk/src/kernel/srs_kernel_consts.hpp +++ b/trunk/src/kernel/srs_kernel_consts.hpp @@ -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 + /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////// diff --git a/trunk/src/kernel/srs_kernel_log.cpp b/trunk/src/kernel/srs_kernel_log.cpp index e030565043..f7b1b52b82 100644 --- a/trunk/src/kernel/srs_kernel_log.cpp +++ b/trunk/src/kernel/srs_kernel_log.cpp @@ -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*/, ...) { } diff --git a/trunk/src/kernel/srs_kernel_log.hpp b/trunk/src/kernel/srs_kernel_log.hpp index d9101704a8..1aaeaeb935 100644 --- a/trunk/src/kernel/srs_kernel_log.hpp +++ b/trunk/src/kernel/srs_kernel_log.hpp @@ -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.