Skip to content

Commit

Permalink
For #2188: Use thread to write and reopen logs.
Browse files Browse the repository at this point in the history
1. Remove support for reload log configs.
2. Add config for thread pool cycle interval.
3. Add config for log flush interval.
4. Create a SrsAsyncLogManager to create writers.
5. Create a SrsAsyncFileWriter to write file async.
  • Loading branch information
winlinvip committed Mar 12, 2021
1 parent 49a88ae commit 1fc1de1
Show file tree
Hide file tree
Showing 15 changed files with 419 additions and 420 deletions.
10 changes: 10 additions & 0 deletions trunk/conf/full.conf
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ srs_log_level trace;
# when srs_log_tank is file, specifies the log file.
# default: ./objs/srs.log
srs_log_file ./objs/srs.log;
# The interval in ms, to flush async log.
# Default: 1300
srs_log_async_interval 1300;
# the max connections.
# if exceed the max connections, server will drop the new connection.
# default: 1000
Expand Down Expand Up @@ -111,6 +114,13 @@ auto_reload_for_docker on;
# default: 0.8
tcmalloc_release_rate 0.8;

# For thread pool.
threads {
# The thread pool manager cycle interval, in seconds.
# Default: 60
interval 60;
}

#############################################################################################
# heartbeat/stats sections
#############################################################################################
Expand Down
229 changes: 40 additions & 189 deletions trunk/src/app/srs_app_config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1492,41 +1492,13 @@ srs_error_t SrsConfig::reload_conf(SrsConfig* conf)
}
}

// merge config: srs_log_tank
if (!srs_directive_equals(root->get("srs_log_tank"), old_root->get("srs_log_tank"))) {
if ((err = do_reload_srs_log_tank()) != srs_success) {
return srs_error_wrap(err, "log tank");;
}
}

// merge config: srs_log_level
if (!srs_directive_equals(root->get("srs_log_level"), old_root->get("srs_log_level"))) {
if ((err = do_reload_srs_log_level()) != srs_success) {
return srs_error_wrap(err, "log level");;
}
}

// merge config: srs_log_file
if (!srs_directive_equals(root->get("srs_log_file"), old_root->get("srs_log_file"))) {
if ((err = do_reload_srs_log_file()) != srs_success) {
return srs_error_wrap(err, "log file");;
}
}

// merge config: max_connections
if (!srs_directive_equals(root->get("max_connections"), old_root->get("max_connections"))) {
if ((err = do_reload_max_connections()) != srs_success) {
return srs_error_wrap(err, "max connections");;
}
}

// merge config: utc_time
if (!srs_directive_equals(root->get("utc_time"), old_root->get("utc_time"))) {
if ((err = do_reload_utc_time()) != srs_success) {
return srs_error_wrap(err, "utc time");;
}
}

// merge config: pithy_print_ms
if (!srs_directive_equals(root->get("pithy_print_ms"), old_root->get("pithy_print_ms"))) {
if ((err = do_reload_pithy_print_ms()) != srs_success) {
Expand Down Expand Up @@ -2946,78 +2918,6 @@ srs_error_t SrsConfig::raw_set_ff_log_dir(string ff_log_dir, bool& applied)
return err;
}

srs_error_t SrsConfig::raw_set_srs_log_tank(string srs_log_tank, bool& applied)
{
srs_error_t err = srs_success;

applied = false;

SrsConfDirective* conf = root->get_or_create("srs_log_tank");

if (conf->arg0() == srs_log_tank) {
return err;
}

conf->args.clear();
conf->args.push_back(srs_log_tank);

if ((err = do_reload_srs_log_tank()) != srs_success) {
return srs_error_wrap(err, "reload log tank");
}

applied = true;

return err;
}

srs_error_t SrsConfig::raw_set_srs_log_level(string srs_log_level, bool& applied)
{
srs_error_t err = srs_success;

applied = false;

SrsConfDirective* conf = root->get_or_create("srs_log_level");

if (conf->arg0() == srs_log_level) {
return err;
}

conf->args.clear();
conf->args.push_back(srs_log_level);

if ((err = do_reload_srs_log_level()) != srs_success) {
return srs_error_wrap(err, "reload log level");
}

applied = true;

return err;
}

srs_error_t SrsConfig::raw_set_srs_log_file(string srs_log_file, bool& applied)
{
srs_error_t err = srs_success;

applied = false;

SrsConfDirective* conf = root->get_or_create("srs_log_file");

if (conf->arg0() == srs_log_file) {
return err;
}

conf->args.clear();
conf->args.push_back(srs_log_file);

if ((err = do_reload_srs_log_file()) != srs_success) {
return srs_error_wrap(err, "reload log file");
}

applied = true;

return err;
}

srs_error_t SrsConfig::raw_set_max_connections(string max_connections, bool& applied)
{
srs_error_t err = srs_success;
Expand All @@ -3042,30 +2942,6 @@ srs_error_t SrsConfig::raw_set_max_connections(string max_connections, bool& app
return err;
}

srs_error_t SrsConfig::raw_set_utc_time(string utc_time, bool& applied)
{
srs_error_t err = srs_success;

applied = false;

SrsConfDirective* conf = root->get_or_create("utc_time");

if (conf->arg0() == utc_time) {
return err;
}

conf->args.clear();
conf->args.push_back(utc_time);

if ((err = do_reload_utc_time()) != srs_success) {
return srs_error_wrap(err, "reload");
}

applied = true;

return err;
}

srs_error_t SrsConfig::raw_set_pithy_print_ms(string pithy_print_ms, bool& applied)
{
srs_error_t err = srs_success;
Expand Down Expand Up @@ -3265,54 +3141,6 @@ srs_error_t SrsConfig::do_reload_pid()
return err;
}

srs_error_t SrsConfig::do_reload_srs_log_tank()
{
srs_error_t err = srs_success;

vector<ISrsReloadHandler*>::iterator it;
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((err = subscribe->on_reload_log_tank()) != srs_success) {
return srs_error_wrap(err, "notify subscribes reload srs_log_tank failed");
}
}
srs_trace("reload srs_log_tank success.");

return err;
}

srs_error_t SrsConfig::do_reload_srs_log_level()
{
srs_error_t err = srs_success;

vector<ISrsReloadHandler*>::iterator it;
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((err = subscribe->on_reload_log_level()) != srs_success) {
return srs_error_wrap(err, "notify subscribes reload srs_log_level failed");
}
}
srs_trace("reload srs_log_level success.");

return err;
}

srs_error_t SrsConfig::do_reload_srs_log_file()
{
srs_error_t err = srs_success;

vector<ISrsReloadHandler*>::iterator it;
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((err = subscribe->on_reload_log_file()) != srs_success) {
return srs_error_wrap(err, "notify subscribes reload srs_log_file failed");
}
}
srs_trace("reload srs_log_file success.");

return err;
}

srs_error_t SrsConfig::do_reload_max_connections()
{
srs_error_t err = srs_success;
Expand All @@ -3329,22 +3157,6 @@ srs_error_t SrsConfig::do_reload_max_connections()
return err;
}

srs_error_t SrsConfig::do_reload_utc_time()
{
srs_error_t err = srs_success;

vector<ISrsReloadHandler*>::iterator it;
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
ISrsReloadHandler* subscribe = *it;
if ((err = subscribe->on_reload_utc_time()) != srs_success) {
return srs_error_wrap(err, "utc_time");
}
}
srs_trace("reload utc_time success.");

return err;
}

srs_error_t SrsConfig::do_reload_pithy_print_ms()
{
srs_error_t err = srs_success;
Expand Down Expand Up @@ -3581,7 +3393,7 @@ srs_error_t SrsConfig::check_normal_config()
&& n != "ff_log_level" && n != "grace_final_wait" && n != "force_grace_quit"
&& n != "grace_start_wait" && n != "empty_ip_ok" && n != "disable_daemon_for_docker"
&& n != "inotify_auto_reload" && n != "auto_reload_for_docker" && n != "tcmalloc_release_rate"
) {
&& n != "srs_log_flush_interval" && n != "threads") {
return srs_error_new(ERROR_SYSTEM_CONFIG_INVALID, "illegal directive %s", n.c_str());
}
}
Expand Down Expand Up @@ -4293,6 +4105,28 @@ double SrsConfig::tcmalloc_release_rate()
return trr;
}

srs_utime_t SrsConfig::get_threads_interval()
{
static srs_utime_t DEFAULT = 60 * SRS_UTIME_SECONDS;

SrsConfDirective* conf = root->get("threads");
if (!conf) {
return DEFAULT;
}

conf = conf->get("interval");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}

int v = ::atoi(conf->arg0().c_str());
if (v <= 0) {
return DEFAULT;
}

return v * SRS_UTIME_SECONDS;
}

vector<SrsConfDirective*> SrsConfig::get_stream_casters()
{
srs_assert(root);
Expand Down Expand Up @@ -6967,6 +6801,23 @@ string SrsConfig::get_log_file()
return conf->arg0();
}

srs_utime_t SrsConfig::srs_log_flush_interval()
{
srs_utime_t DEFAULT = 1300 * SRS_UTIME_MILLISECONDS;

SrsConfDirective* conf = root->get("srs_log_flush_interval");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}

srs_utime_t v = ::atoi(conf->arg0().c_str()) * SRS_UTIME_MILLISECONDS;
if (v <= 0) {
return DEFAULT;
}

return v;
}

bool SrsConfig::get_ff_log_enabled()
{
string log = get_ff_log_dir();
Expand Down
17 changes: 5 additions & 12 deletions trunk/src/app/srs_app_config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -367,16 +367,8 @@ class SrsConfig
virtual srs_error_t raw_set_chunk_size(std::string chunk_size, bool& applied);
// RAW set the global ffmpeg log dir.
virtual srs_error_t raw_set_ff_log_dir(std::string ff_log_dir, bool& applied);
// RAW set the global log tank.
virtual srs_error_t raw_set_srs_log_tank(std::string srs_log_tank, bool& applied);
// RAW set the global log level.
virtual srs_error_t raw_set_srs_log_level(std::string srs_log_level, bool& applied);
// RAW set the global log file path for file tank.
virtual srs_error_t raw_set_srs_log_file(std::string srs_log_file, bool& applied);
// RAW set the global max connections of srs.
virtual srs_error_t raw_set_max_connections(std::string max_connections, bool& applied);
// RAW set the global whether use utc time.
virtual srs_error_t raw_set_utc_time(std::string utc_time, bool& applied);
// RAW set the global pithy print interval in ms.
virtual srs_error_t raw_set_pithy_print_ms(std::string pithy_print_ms, bool& applied);
// RAW create the new vhost.
Expand All @@ -396,11 +388,7 @@ class SrsConfig
private:
virtual srs_error_t do_reload_listen();
virtual srs_error_t do_reload_pid();
virtual srs_error_t do_reload_srs_log_tank();
virtual srs_error_t do_reload_srs_log_level();
virtual srs_error_t do_reload_srs_log_file();
virtual srs_error_t do_reload_max_connections();
virtual srs_error_t do_reload_utc_time();
virtual srs_error_t do_reload_pithy_print_ms();
virtual srs_error_t do_reload_vhost_added(std::string vhost);
virtual srs_error_t do_reload_vhost_removed(std::string vhost);
Expand Down Expand Up @@ -487,6 +475,9 @@ class SrsConfig
virtual bool auto_reload_for_docker();
// For tcmalloc, get the release rate.
virtual double tcmalloc_release_rate();
// Thread pool section.
public:
virtual srs_utime_t get_threads_interval();
// stream_caster section
public:
// Get all stream_caster in config file.
Expand Down Expand Up @@ -899,6 +890,8 @@ class SrsConfig
virtual std::string get_log_level();
// Get the log file path.
virtual std::string get_log_file();
// Get the interval in ms to flush asyn log.
virtual srs_utime_t srs_log_flush_interval();
// Whether ffmpeg log enabled
virtual bool get_ff_log_enabled();
// The ffmpeg log dir.
Expand Down
Loading

0 comments on commit 1fc1de1

Please sign in to comment.