1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

for #209, server cycle to enable the hls to cleanup. do dispose

This commit is contained in:
winlin 2015-05-30 10:48:02 +08:00
parent 567d84e997
commit d611bb6b45
8 changed files with 109 additions and 3 deletions

View file

@ -618,9 +618,14 @@ vhost with-hls.srs.com {
# h264, vn # h264, vn
# default: h264 # default: h264
hls_vcodec h264; hls_vcodec h264;
# whether cleanup the old ts files. # whether cleanup the old expired ts files.
# default: on # default: on
hls_cleanup on; hls_cleanup on;
# the timeout in seconds to dispose the hls,
# dispose is to remove all hls files, m3u8 and ts files.
# when timeout or server terminate, dispose hls.
# default: 300
hls_dispose 300;
# the max size to notify hls, # the max size to notify hls,
# to read max bytes from ts of specified cdn network, # to read max bytes from ts of specified cdn network,
# @remark only used when on_hls_notify is config. # @remark only used when on_hls_notify is config.

View file

@ -1564,7 +1564,8 @@ int SrsConfig::check_config()
string m = conf->at(j)->name.c_str(); string m = conf->at(j)->name.c_str();
if (m != "enabled" && m != "hls_entry_prefix" && m != "hls_path" && m != "hls_fragment" && m != "hls_window" && m != "hls_on_error" if (m != "enabled" && m != "hls_entry_prefix" && m != "hls_path" && m != "hls_fragment" && m != "hls_window" && m != "hls_on_error"
&& m != "hls_storage" && m != "hls_mount" && m != "hls_td_ratio" && m != "hls_aof_ratio" && m != "hls_acodec" && m != "hls_vcodec" && m != "hls_storage" && m != "hls_mount" && m != "hls_td_ratio" && m != "hls_aof_ratio" && m != "hls_acodec" && m != "hls_vcodec"
&& m != "hls_m3u8_file" && m != "hls_ts_file" && m != "hls_ts_floor" && m != "hls_cleanup" && m != "hls_nb_notify" && m != "hls_wait_keyframe" && m != "hls_m3u8_file" && m != "hls_ts_file" && m != "hls_ts_floor" && m != "hls_cleanup" && m != "hls_nb_notify"
&& m != "hls_wait_keyframe" && m != "hls_dispose"
) { ) {
ret = ERROR_SYSTEM_CONFIG_INVALID; ret = ERROR_SYSTEM_CONFIG_INVALID;
srs_error("unsupported vhost hls directive %s, ret=%d", m.c_str(), ret); srs_error("unsupported vhost hls directive %s, ret=%d", m.c_str(), ret);
@ -3561,6 +3562,24 @@ bool SrsConfig::get_hls_cleanup(string vhost)
return SRS_CONF_PERFER_TRUE(conf->arg0()); return SRS_CONF_PERFER_TRUE(conf->arg0());
} }
int SrsConfig::get_hls_dispose(string vhost)
{
SrsConfDirective* conf = get_hls(vhost);
int DEFAULT = 300;
if (!conf) {
return DEFAULT;
}
conf = conf->get("hls_dispose");
if (!conf || conf->arg0().empty()) {
return DEFAULT;
}
return ::atoi(conf->arg0().c_str());
}
bool SrsConfig::get_hls_wait_keyframe(string vhost) bool SrsConfig::get_hls_wait_keyframe(string vhost)
{ {
SrsConfDirective* hls = get_hls(vhost); SrsConfDirective* hls = get_hls(vhost);

View file

@ -984,6 +984,10 @@ public:
* whether cleanup the old ts files. * whether cleanup the old ts files.
*/ */
virtual bool get_hls_cleanup(std::string vhost); virtual bool get_hls_cleanup(std::string vhost);
/**
* the timeout to dispose the hls.
*/
virtual int get_hls_dispose(std::string vhost);
/** /**
* whether reap the ts when got keyframe. * whether reap the ts when got keyframe.
*/ */

View file

@ -1109,6 +1109,19 @@ SrsHls::~SrsHls()
srs_freep(pprint); srs_freep(pprint);
} }
void SrsHls::dispose()
{
}
int SrsHls::cycle()
{
int ret = ERROR_SUCCESS;
srs_info("hls cycle for source %d", source->source_id());
return ret;
}
int SrsHls::initialize(SrsSource* s, ISrsHlsHandler* h) int SrsHls::initialize(SrsSource* s, ISrsHlsHandler* h)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;

View file

@ -402,6 +402,9 @@ private:
public: public:
SrsHls(); SrsHls();
virtual ~SrsHls(); virtual ~SrsHls();
public:
virtual void dispose();
virtual int cycle();
public: public:
/** /**
* initialize the hls by handler and source. * initialize the hls by handler and source.

View file

@ -562,9 +562,12 @@ void SrsServer::dispose()
#ifdef SRS_AUTO_INGEST #ifdef SRS_AUTO_INGEST
ingester->dispose(); ingester->dispose();
srs_trace("gracefully cleanup ingesters"); srs_trace("gracefully dispose ingesters");
#endif #endif
SrsSource::dispose_all();
srs_trace("gracefully dispose sources");
srs_trace("terminate server"); srs_trace("terminate server");
} }
@ -962,6 +965,11 @@ int SrsServer::do_cycle()
srs_trace("reload config success."); srs_trace("reload config success.");
} }
// notice the stream sources to cycle.
if ((ret = SrsSource::cycle_all()) != ERROR_SUCCESS) {
return ret;
}
// update the cache time // update the cache time
if ((i % SRS_SYS_TIME_RESOLUTION_MS_TIMES) == 0) { if ((i % SRS_SYS_TIME_RESOLUTION_MS_TIMES) == 0) {
srs_info("update current time cache."); srs_info("update current time cache.");

View file

@ -771,6 +771,32 @@ SrsSource* SrsSource::fetch(std::string vhost, std::string app, std::string stre
return source; return source;
} }
void SrsSource::dispose_all()
{
std::map<std::string, SrsSource*>::iterator it;
for (it = pool.begin(); it != pool.end(); ++it) {
SrsSource* source = it->second;
source->dispose();
}
return;
}
int SrsSource::cycle_all()
{
int ret = ERROR_SUCCESS;
// TODO: FIXME: support remove dead source for a long time.
std::map<std::string, SrsSource*>::iterator it;
for (it = pool.begin(); it != pool.end(); ++it) {
SrsSource* source = it->second;
if ((ret = source->cycle()) != ERROR_SUCCESS) {
return ret;
}
}
return ret;
}
void SrsSource::destroy() void SrsSource::destroy()
{ {
std::map<std::string, SrsSource*>::iterator it; std::map<std::string, SrsSource*>::iterator it;
@ -909,6 +935,26 @@ SrsSource::~SrsSource()
srs_freep(_req); srs_freep(_req);
} }
void SrsSource::dispose()
{
#ifdef SRS_AUTO_HLS
hls->dispose();
#endif
}
int SrsSource::cycle()
{
int ret = ERROR_SUCCESS;
#ifdef SRS_AUTO_HLS
if ((ret = hls->cycle()) != ERROR_SUCCESS) {
return ret;
}
#endif
return ret;
}
int SrsSource::initialize(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* hh) int SrsSource::initialize(SrsRequest* r, ISrsSourceHandler* h, ISrsHlsHandler* hh)
{ {
int ret = ERROR_SUCCESS; int ret = ERROR_SUCCESS;

View file

@ -410,6 +410,11 @@ public:
* get the exists source by stream info(vhost, app, stream), NULL when not exists. * get the exists source by stream info(vhost, app, stream), NULL when not exists.
*/ */
static SrsSource* fetch(std::string vhost, std::string app, std::string stream); static SrsSource* fetch(std::string vhost, std::string app, std::string stream);
/**
* dispose and cycle all sources.
*/
static void dispose_all();
static int cycle_all();
/** /**
* when system exit, destroy the sources, * when system exit, destroy the sources,
* for gmc to analysis mem leaks. * for gmc to analysis mem leaks.
@ -486,6 +491,9 @@ private:
public: public:
SrsSource(); SrsSource();
virtual ~SrsSource(); virtual ~SrsSource();
public:
virtual void dispose();
virtual int cycle();
// initialize, get and setter. // initialize, get and setter.
public: public:
/** /**