mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
support reload ingesters(added/removed/updated). change to 0.9.57.
This commit is contained in:
parent
e6d8bc1e5c
commit
e432fe931f
7 changed files with 212 additions and 10 deletions
|
@ -221,6 +221,7 @@ usr sys idl wai hiq siq| read writ| recv send| in out | int csw
|
|||
* nginx v1.5.0: 139524 lines <br/>
|
||||
|
||||
## History
|
||||
* v1.0, 2014-04-10, support reload ingesters(added/removed/updated). change to 0.9.57.
|
||||
* v1.0, 2014-04-07, [1.0 mainline(0.9.55)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline) released. 30000 lines.
|
||||
* v1.0, 2014-04-07, support [ingest](https://github.com/winlinvip/simple-rtmp-server/wiki/SampleIngest) file/stream/device.
|
||||
* v1.0, 2014-04-05, support [http api](https://github.com/winlinvip/simple-rtmp-server/wiki/HTTPApi) and [http server](https://github.com/winlinvip/simple-rtmp-server/wiki/HTTPServer).
|
||||
|
|
|
@ -568,7 +568,7 @@ int SrsConfig::reload()
|
|||
// merge config: vhost modified.
|
||||
srs_trace("vhost %s modified, reload its detail.", vhost.c_str());
|
||||
if (get_vhost_enabled(new_vhost) && get_vhost_enabled(old_vhost)) {
|
||||
// gop_cache
|
||||
// gop_cache, only one per vhost
|
||||
if (!srs_directive_equals(new_vhost->get("gop_cache"), old_vhost->get("gop_cache"))) {
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
|
@ -579,7 +579,7 @@ int SrsConfig::reload()
|
|||
}
|
||||
srs_trace("vhost %s reload gop_cache success.", vhost.c_str());
|
||||
}
|
||||
// queue_length
|
||||
// queue_length, only one per vhost
|
||||
if (!srs_directive_equals(new_vhost->get("queue_length"), old_vhost->get("queue_length"))) {
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
|
@ -590,7 +590,7 @@ int SrsConfig::reload()
|
|||
}
|
||||
srs_trace("vhost %s reload queue_length success.", vhost.c_str());
|
||||
}
|
||||
// forward
|
||||
// forward, only one per vhost
|
||||
if (!srs_directive_equals(new_vhost->get("forward"), old_vhost->get("forward"))) {
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
|
@ -601,7 +601,7 @@ int SrsConfig::reload()
|
|||
}
|
||||
srs_trace("vhost %s reload forward success.", vhost.c_str());
|
||||
}
|
||||
// hls
|
||||
// hls, only one per vhost
|
||||
if (!srs_directive_equals(new_vhost->get("hls"), old_vhost->get("hls"))) {
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
|
@ -612,7 +612,8 @@ int SrsConfig::reload()
|
|||
}
|
||||
srs_trace("vhost %s reload hls success.", vhost.c_str());
|
||||
}
|
||||
// transcode
|
||||
// TODO: FIXME: there might be many transcoders per vhost.
|
||||
// transcode, only one per vhost
|
||||
if (!srs_directive_equals(new_vhost->get("transcode"), old_vhost->get("transcode"))) {
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
|
@ -623,6 +624,10 @@ int SrsConfig::reload()
|
|||
}
|
||||
srs_trace("vhost %s reload transcode success.", vhost.c_str());
|
||||
}
|
||||
// ingest, many per vhost.
|
||||
if ((ret = reload_ingest(new_vhost, old_vhost)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
// TODO: suppor reload hls/forward/ffmpeg/http
|
||||
continue;
|
||||
}
|
||||
|
@ -689,6 +694,102 @@ int SrsConfig::parse_options(int argc, char** argv)
|
|||
return parse_file(config_file.c_str());
|
||||
}
|
||||
|
||||
int SrsConfig::reload_ingest(SrsConfDirective* new_vhost, SrsConfDirective* old_vhost)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
std::vector<SrsConfDirective*> old_ingesters;
|
||||
for (int i = 0; i < (int)old_vhost->directives.size(); i++) {
|
||||
SrsConfDirective* conf = old_vhost->at(i);
|
||||
if (conf->name == "ingest") {
|
||||
old_ingesters.push_back(conf);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<SrsConfDirective*> new_ingesters;
|
||||
for (int i = 0; i < (int)new_vhost->directives.size(); i++) {
|
||||
SrsConfDirective* conf = new_vhost->at(i);
|
||||
if (conf->name == "ingest") {
|
||||
new_ingesters.push_back(conf);
|
||||
}
|
||||
}
|
||||
|
||||
std::vector<ISrsReloadHandler*>::iterator it;
|
||||
|
||||
std::string vhost = new_vhost->arg0();
|
||||
|
||||
// for removed ingesters, stop them.
|
||||
for (int i = 0; i < (int)old_ingesters.size(); i++) {
|
||||
SrsConfDirective* old_ingester = old_ingesters.at(i);
|
||||
std::string ingest_id = old_ingester->arg0();
|
||||
|
||||
// if ingester exists in new vhost, not removed, ignore.
|
||||
if (new_vhost->get("ingest", ingest_id)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// notice handler ingester removed.
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
if ((ret = subscribe->on_reload_ingest_removed(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||
srs_error("vhost %s notify subscribes ingest=%s removed failed. ret=%d",
|
||||
vhost.c_str(), ingest_id.c_str(), ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
srs_trace("vhost %s reload ingest=%s removed success.", vhost.c_str(), ingest_id.c_str());
|
||||
}
|
||||
|
||||
// for added ingesters, start them.
|
||||
for (int i = 0; i < (int)new_ingesters.size(); i++) {
|
||||
SrsConfDirective* new_ingester = new_ingesters.at(i);
|
||||
std::string ingest_id = new_ingester->arg0();
|
||||
|
||||
// if ingester exists in old vhost, not added, ignore.
|
||||
if (old_vhost->get("ingest", ingest_id)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// notice handler ingester removed.
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
if ((ret = subscribe->on_reload_ingest_added(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||
srs_error("vhost %s notify subscribes ingest=%s added failed. ret=%d",
|
||||
vhost.c_str(), ingest_id.c_str(), ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
srs_trace("vhost %s reload ingest=%s added success.", vhost.c_str(), ingest_id.c_str());
|
||||
}
|
||||
|
||||
// for updated ingesters, restart them.
|
||||
for (int i = 0; i < (int)new_ingesters.size(); i++) {
|
||||
SrsConfDirective* new_ingester = new_ingesters.at(i);
|
||||
std::string ingest_id = new_ingester->arg0();
|
||||
SrsConfDirective* old_ingester = old_vhost->get("ingest", ingest_id);
|
||||
srs_assert(old_ingester);
|
||||
|
||||
if (srs_directive_equals(new_ingester, old_ingester)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// notice handler ingester removed.
|
||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||
ISrsReloadHandler* subscribe = *it;
|
||||
if ((ret = subscribe->on_reload_ingest_updated(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||
srs_error("vhost %s notify subscribes ingest=%s updated failed. ret=%d",
|
||||
vhost.c_str(), ingest_id.c_str(), ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
srs_trace("vhost %s reload ingest=%s updated success.", vhost.c_str(), ingest_id.c_str());
|
||||
}
|
||||
|
||||
srs_warn("invalid reload ingest vhost=%s", vhost.c_str());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsConfig::parse_file(const char* filename)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
@ -1667,6 +1768,17 @@ void SrsConfig::get_ingesters(std::string vhost, std::vector<SrsConfDirective*>&
|
|||
return;
|
||||
}
|
||||
|
||||
SrsConfDirective* SrsConfig::get_ingest(std::string vhost, std::string ingest_id)
|
||||
{
|
||||
SrsConfDirective* conf = get_vhost(vhost);
|
||||
if (!conf) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
conf = conf->get("ingest", ingest_id);
|
||||
return conf;
|
||||
}
|
||||
|
||||
bool SrsConfig::get_ingest_enabled(SrsConfDirective* ingest)
|
||||
{
|
||||
SrsConfDirective* conf = ingest->get("enable");
|
||||
|
|
|
@ -125,6 +125,7 @@ public:
|
|||
public:
|
||||
virtual int parse_options(int argc, char** argv);
|
||||
private:
|
||||
virtual int reload_ingest(SrsConfDirective* new_vhost, SrsConfDirective* old_vhost);
|
||||
virtual int parse_file(const char* filename);
|
||||
virtual int parse_argv(int& i, char** argv);
|
||||
virtual void print_help(char** argv);
|
||||
|
@ -193,6 +194,7 @@ public:
|
|||
// ingest section
|
||||
public:
|
||||
virtual void get_ingesters(std::string vhost, std::vector<SrsConfDirective*>& ingeters);
|
||||
virtual SrsConfDirective* get_ingest(std::string vhost, std::string ingest_id);
|
||||
virtual bool get_ingest_enabled(SrsConfDirective* ingest);
|
||||
virtual std::string get_ingest_ffmpeg(SrsConfDirective* ingest);
|
||||
virtual std::string get_ingest_input_type(SrsConfDirective* ingest);
|
||||
|
|
|
@ -97,10 +97,6 @@ int SrsIngester::parse_ingesters(SrsConfDirective* vhost)
|
|||
// create engine
|
||||
for (int i = 0; i < (int)ingesters.size(); i++) {
|
||||
SrsConfDirective* ingest = ingesters[i];
|
||||
if (!_srs_config->get_ingest_enabled(ingest)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((ret = parse_engines(vhost, ingest)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
@ -113,6 +109,10 @@ int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest
|
|||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
if (!_srs_config->get_ingest_enabled(ingest)) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string ffmpeg_bin = _srs_config->get_ingest_ffmpeg(ingest);
|
||||
if (ffmpeg_bin.empty()) {
|
||||
ret = ERROR_ENCODER_PARSE;
|
||||
|
@ -361,6 +361,8 @@ int SrsIngester::on_reload_vhost_added(string vhost)
|
|||
return ret;
|
||||
}
|
||||
|
||||
srs_trace("reload add vhost ingesters, vhost=%s", vhost.c_str());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -393,4 +395,68 @@ int SrsIngester::on_reload_vhost_removed(string vhost)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int SrsIngester::on_reload_ingest_removed(string vhost, string ingest_id)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
std::vector<SrsIngesterFFMPEG*>::iterator it;
|
||||
|
||||
for (it = ingesters.begin(); it != ingesters.end();) {
|
||||
SrsIngesterFFMPEG* ingester = *it;
|
||||
|
||||
if (ingester->vhost != vhost || ingester->id != ingest_id) {
|
||||
++it;
|
||||
continue;
|
||||
}
|
||||
|
||||
// stop the ffmpeg and free it.
|
||||
ingester->ffmpeg->stop();
|
||||
|
||||
srs_trace("reload stop ingester, "
|
||||
"vhost=%s, id=%s", vhost.c_str(), ingester->id.c_str());
|
||||
|
||||
srs_freep(ingester);
|
||||
|
||||
// remove the item from ingesters.
|
||||
it = ingesters.erase(it);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsIngester::on_reload_ingest_added(string vhost, string ingest_id)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
SrsConfDirective* _vhost = _srs_config->get_vhost(vhost);
|
||||
SrsConfDirective* _ingester = _srs_config->get_ingest(vhost, ingest_id);
|
||||
|
||||
if ((ret = parse_engines(_vhost, _ingester)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
srs_trace("reload add ingester, "
|
||||
"vhost=%s, id=%s", vhost.c_str(), ingest_id.c_str());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsIngester::on_reload_ingest_updated(string vhost, string ingest_id)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
if ((ret = on_reload_ingest_removed(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
if ((ret = on_reload_ingest_added(vhost, ingest_id)) != ERROR_SUCCESS) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
srs_trace("reload updated ingester, "
|
||||
"vhost=%s, id=%s", vhost.c_str(), ingest_id.c_str());
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -86,6 +86,9 @@ private:
|
|||
public:
|
||||
virtual int on_reload_vhost_removed(std::string vhost);
|
||||
virtual int on_reload_vhost_added(std::string vhost);
|
||||
virtual int on_reload_ingest_removed(std::string vhost, std::string ingest_id);
|
||||
virtual int on_reload_ingest_added(std::string vhost, std::string ingest_id);
|
||||
virtual int on_reload_ingest_updated(std::string vhost, std::string ingest_id);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -80,3 +80,18 @@ int ISrsReloadHandler::on_reload_transcode(string /*vhost*/)
|
|||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
int ISrsReloadHandler::on_reload_ingest_removed(string /*vhost*/, string /*ingest_id*/)
|
||||
{
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
int ISrsReloadHandler::on_reload_ingest_added(string /*vhost*/, string /*ingest_id*/)
|
||||
{
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
int ISrsReloadHandler::on_reload_ingest_updated(string /*vhost*/, string /*ingest_id*/)
|
||||
{
|
||||
return ERROR_SUCCESS;
|
||||
}
|
||||
|
||||
|
|
|
@ -50,6 +50,9 @@ public:
|
|||
virtual int on_reload_forward(std::string vhost);
|
||||
virtual int on_reload_hls(std::string vhost);
|
||||
virtual int on_reload_transcode(std::string vhost);
|
||||
virtual int on_reload_ingest_removed(std::string vhost, std::string ingest_id);
|
||||
virtual int on_reload_ingest_added(std::string vhost, std::string ingest_id);
|
||||
virtual int on_reload_ingest_updated(std::string vhost, std::string ingest_id);
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Add table
Add a link
Reference in a new issue