mirror of
https://github.com/ossrs/srs.git
synced 2025-02-15 04:42:04 +00:00
for #319, do not apply when config not changed.
This commit is contained in:
parent
a62c82bd46
commit
8a2709dd2c
3 changed files with 78 additions and 13 deletions
|
@ -67,9 +67,46 @@ using namespace _srs_internal;
|
||||||
// '\r'
|
// '\r'
|
||||||
#define SRS_CR (char)SRS_CONSTS_CR
|
#define SRS_CR (char)SRS_CONSTS_CR
|
||||||
|
|
||||||
// dumps the engine to amf0 object.
|
/**
|
||||||
|
* dumps the ingest/transcode-engine in @param dir to amf0 object @param engine.
|
||||||
|
* @param dir the transcode or ingest config directive.
|
||||||
|
* @param engine the amf0 object to dumps to.
|
||||||
|
*/
|
||||||
int srs_config_dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine);
|
int srs_config_dumps_engine(SrsConfDirective* dir, SrsAmf0Object* engine);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* whether the two vector actual equals, for instance,
|
||||||
|
* srs_vector_actual_equals([0, 1, 2], [0, 1, 2]) ==== true
|
||||||
|
* srs_vector_actual_equals([0, 1, 2], [2, 1, 0]) ==== true
|
||||||
|
* srs_vector_actual_equals([0, 1, 2], [0, 2, 1]) ==== true
|
||||||
|
* srs_vector_actual_equals([0, 1, 2], [0, 1, 2, 3]) ==== false
|
||||||
|
* srs_vector_actual_equals([1, 2, 3], [0, 1, 2]) ==== false
|
||||||
|
*/
|
||||||
|
template<typename T>
|
||||||
|
bool srs_vector_actual_equals(const vector<T>& a, const vector<T>& b)
|
||||||
|
{
|
||||||
|
// all elements of a in b.
|
||||||
|
for (int i = 0; i < (int)a.size(); i++) {
|
||||||
|
const T& e = a.at(i);
|
||||||
|
if (::find(b.begin(), b.end(), e) == b.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// all elements of b in a.
|
||||||
|
for (int i = 0; i < (int)b.size(); i++) {
|
||||||
|
const T& e = b.at(i);
|
||||||
|
if (::find(a.begin(), a.end(), e) == a.end()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* whether the ch is common space.
|
||||||
|
*/
|
||||||
bool is_common_space(char ch)
|
bool is_common_space(char ch)
|
||||||
{
|
{
|
||||||
return (ch == ' ' || ch == '\t' || ch == SRS_CR || ch == SRS_LF);
|
return (ch == ' ' || ch == '\t' || ch == SRS_CR || ch == SRS_LF);
|
||||||
|
@ -900,14 +937,9 @@ int SrsConfig::reload_conf(SrsConfig* conf)
|
||||||
|
|
||||||
// merge config: listen
|
// merge config: listen
|
||||||
if (!srs_directive_equals(root->get("listen"), old_root->get("listen"))) {
|
if (!srs_directive_equals(root->get("listen"), old_root->get("listen"))) {
|
||||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
if ((ret = do_reload_listen()) != ERROR_SUCCESS) {
|
||||||
ISrsReloadHandler* subscribe = *it;
|
return ret;
|
||||||
if ((ret = subscribe->on_reload_listen()) != ERROR_SUCCESS) {
|
|
||||||
srs_error("notify subscribes reload listen failed. ret=%d", ret);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
srs_trace("reload listen success.");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// merge config: pid
|
// merge config: pid
|
||||||
|
@ -2175,13 +2207,34 @@ int SrsConfig::raw_to_json(SrsAmf0Object* obj)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int SrsConfig::raw_set_listen(const vector<string>& eps)
|
int SrsConfig::raw_set_listen(const vector<string>& eps, bool& applied)
|
||||||
{
|
{
|
||||||
int ret = ERROR_SUCCESS;
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
applied = false;
|
||||||
|
|
||||||
SrsConfDirective* listen = root->get("listen");
|
SrsConfDirective* listen = root->get("listen");
|
||||||
|
|
||||||
|
// not changed, ignore.
|
||||||
|
if (srs_vector_actual_equals(listen->args, eps)) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
// changed, apply and reload.
|
||||||
listen->args = eps;
|
listen->args = eps;
|
||||||
|
|
||||||
|
if ((ret = do_reload_listen()) != ERROR_SUCCESS) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
applied = true;
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int SrsConfig::do_reload_listen()
|
||||||
|
{
|
||||||
|
int ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
// force to reload the memory server.
|
// force to reload the memory server.
|
||||||
vector<ISrsReloadHandler*>::iterator it;
|
vector<ISrsReloadHandler*>::iterator it;
|
||||||
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
for (it = subscribes.begin(); it != subscribes.end(); ++it) {
|
||||||
|
|
|
@ -331,8 +331,14 @@ public:
|
||||||
virtual int raw_to_json(SrsAmf0Object* obj);
|
virtual int raw_to_json(SrsAmf0Object* obj);
|
||||||
/**
|
/**
|
||||||
* raw set the global listen.
|
* raw set the global listen.
|
||||||
|
* @param applied whether the config is applied.
|
||||||
*/
|
*/
|
||||||
virtual int raw_set_listen(const std::vector<std::string>& eps);
|
virtual int raw_set_listen(const std::vector<std::string>& eps, bool& applied);
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* do reload listen, for reload from signal or raw api.
|
||||||
|
*/
|
||||||
|
virtual int do_reload_listen();
|
||||||
public:
|
public:
|
||||||
/**
|
/**
|
||||||
* get the config file path.
|
* get the config file path.
|
||||||
|
|
|
@ -992,6 +992,7 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
||||||
return srs_api_response_code(w, r, ret);
|
return srs_api_response_code(w, r, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool applied = false;
|
||||||
if (scope == "global.listen") {
|
if (scope == "global.listen") {
|
||||||
vector<string> eps = srs_string_split(value, ",");
|
vector<string> eps = srs_string_split(value, ",");
|
||||||
|
|
||||||
|
@ -1010,14 +1011,19 @@ int SrsGoApiRaw::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r)
|
||||||
return srs_api_response_code(w, r, ret);
|
return srs_api_response_code(w, r, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = _srs_config->raw_set_listen(eps)) != ERROR_SUCCESS) {
|
if ((ret = _srs_config->raw_set_listen(eps, applied)) != ERROR_SUCCESS) {
|
||||||
srs_error("raw api update global.listen=%s failed. ret=%d", value.c_str(), ret);
|
srs_error("raw api update global.listen=%s failed. ret=%d", value.c_str(), ret);
|
||||||
return srs_api_response_code(w, r, ret);
|
return srs_api_response_code(w, r, ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
server->on_signal(SRS_SIGNAL_PERSISTENCE_CONFIG);
|
// whether the config applied.
|
||||||
srs_trace("raw api update %s=%s ok.", scope.c_str(), value.c_str());
|
if (applied) {
|
||||||
|
server->on_signal(SRS_SIGNAL_PERSISTENCE_CONFIG);
|
||||||
|
srs_trace("raw api update %s=%s ok.", scope.c_str(), value.c_str());
|
||||||
|
} else {
|
||||||
|
srs_warn("raw api update not applied %s=%s.", scope.c_str(), value.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
return srs_api_response(w, r, obj->to_json());
|
return srs_api_response(w, r, obj->to_json());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue