support forward between two origin,to make a full backup of top server
正在显示
4 个修改的文件
包含
90 行增加
和
21 行删除
@@ -77,6 +77,57 @@ SrsForwarder::~SrsForwarder() | @@ -77,6 +77,57 @@ SrsForwarder::~SrsForwarder() | ||
77 | srs_freep(sh_audio); | 77 | srs_freep(sh_audio); |
78 | } | 78 | } |
79 | 79 | ||
80 | +int SrsForwarder::check_dead_loop(SrsRequest* req, std::string ep_forward) | ||
81 | +{ | ||
82 | + int ret = ERROR_SUCCESS; | ||
83 | + std::string server, port, tc_url; | ||
84 | + | ||
85 | + server = ep_forward; | ||
86 | + port = SRS_CONSTS_RTMP_DEFAULT_PORT; | ||
87 | + | ||
88 | + // TODO: FIXME: parse complex params | ||
89 | + size_t pos = ep_forward.find(":"); | ||
90 | + if (pos != std::string::npos) { | ||
91 | + port = ep_forward.substr(pos + 1); | ||
92 | + server = ep_forward.substr(0, pos); | ||
93 | + } | ||
94 | + | ||
95 | + // generate tcUrl | ||
96 | + tc_url = srs_generate_tc_url(server, req->vhost, req->app, port, req->param); | ||
97 | + | ||
98 | + // dead loop check | ||
99 | + std::string source_ep = "rtmp://"; | ||
100 | + source_ep += req->host; | ||
101 | + source_ep += ":"; | ||
102 | + source_ep += req->port; | ||
103 | + source_ep += "?vhost="; | ||
104 | + source_ep += req->vhost; | ||
105 | + | ||
106 | + std::string dest_ep = "rtmp://"; | ||
107 | + if (ep_forward == SRS_CONSTS_LOCALHOST) { | ||
108 | + dest_ep += req->host; | ||
109 | + } | ||
110 | + else { | ||
111 | + dest_ep += server; | ||
112 | + } | ||
113 | + dest_ep += ":"; | ||
114 | + dest_ep += port; | ||
115 | + dest_ep += "?vhost="; | ||
116 | + dest_ep += req->vhost; | ||
117 | + | ||
118 | + if (source_ep == dest_ep) { | ||
119 | + ret = ERROR_SYSTEM_FORWARD_LOOP; | ||
120 | + srs_warn("forward loop detected. src=%s, dest=%s, ret=%d", | ||
121 | + source_ep.c_str(), dest_ep.c_str(), ret); | ||
122 | + return ret; | ||
123 | + } | ||
124 | + srs_trace("start forward %s to %s, tcUrl=%s, stream=%s", | ||
125 | + source_ep.c_str(), dest_ep.c_str(), tc_url.c_str(), | ||
126 | + req->stream.c_str()); | ||
127 | + | ||
128 | + return ret; | ||
129 | +} | ||
130 | + | ||
80 | int SrsForwarder::initialize(SrsRequest* req, string ep_forward) | 131 | int SrsForwarder::initialize(SrsRequest* req, string ep_forward) |
81 | { | 132 | { |
82 | int ret = ERROR_SUCCESS; | 133 | int ret = ERROR_SUCCESS; |
@@ -99,7 +150,7 @@ void SrsForwarder::set_queue_size(double queue_size) | @@ -99,7 +150,7 @@ void SrsForwarder::set_queue_size(double queue_size) | ||
99 | int SrsForwarder::on_publish() | 150 | int SrsForwarder::on_publish() |
100 | { | 151 | { |
101 | int ret = ERROR_SUCCESS; | 152 | int ret = ERROR_SUCCESS; |
102 | - | 153 | +#if 0 |
103 | SrsRequest* req = _req; | 154 | SrsRequest* req = _req; |
104 | 155 | ||
105 | // discovery the server port and tcUrl from req and ep_forward. | 156 | // discovery the server port and tcUrl from req and ep_forward. |
@@ -134,7 +185,7 @@ int SrsForwarder::on_publish() | @@ -134,7 +185,7 @@ int SrsForwarder::on_publish() | ||
134 | srs_trace("start forward %s to %s, tcUrl=%s, stream=%s", | 185 | srs_trace("start forward %s to %s, tcUrl=%s, stream=%s", |
135 | source_ep.c_str(), dest_ep.c_str(), tc_url.c_str(), | 186 | source_ep.c_str(), dest_ep.c_str(), tc_url.c_str(), |
136 | req->stream.c_str()); | 187 | req->stream.c_str()); |
137 | - | 188 | +#endif |
138 | if ((ret = pthread->start()) != ERROR_SUCCESS) { | 189 | if ((ret = pthread->start()) != ERROR_SUCCESS) { |
139 | srs_error("start srs thread failed. ret=%d", ret); | 190 | srs_error("start srs thread failed. ret=%d", ret); |
140 | return ret; | 191 | return ret; |
@@ -75,6 +75,7 @@ public: | @@ -75,6 +75,7 @@ public: | ||
75 | SrsForwarder(SrsSource* _source); | 75 | SrsForwarder(SrsSource* _source); |
76 | virtual ~SrsForwarder(); | 76 | virtual ~SrsForwarder(); |
77 | public: | 77 | public: |
78 | + static int check_dead_loop(SrsRequest* req, std::string ep_forward); | ||
78 | virtual int initialize(SrsRequest* req, std::string ep_forward); | 79 | virtual int initialize(SrsRequest* req, std::string ep_forward); |
79 | virtual void set_queue_size(double queue_size); | 80 | virtual void set_queue_size(double queue_size); |
80 | public: | 81 | public: |
@@ -2427,6 +2427,10 @@ int SrsSource::create_forwarders() | @@ -2427,6 +2427,10 @@ int SrsSource::create_forwarders() | ||
2427 | SrsConfDirective* conf = _srs_config->get_forward(_req->vhost); | 2427 | SrsConfDirective* conf = _srs_config->get_forward(_req->vhost); |
2428 | for (int i = 0; conf && i < (int)conf->args.size(); i++) { | 2428 | for (int i = 0; conf && i < (int)conf->args.size(); i++) { |
2429 | std::string forward_server = conf->args.at(i); | 2429 | std::string forward_server = conf->args.at(i); |
2430 | + | ||
2431 | + if (SrsForwarder::check_dead_loop(_req, forward_server)) { | ||
2432 | + continue; | ||
2433 | + } | ||
2430 | 2434 | ||
2431 | SrsForwarder* forwarder = new SrsForwarder(this); | 2435 | SrsForwarder* forwarder = new SrsForwarder(this); |
2432 | forwarders.push_back(forwarder); | 2436 | forwarders.push_back(forwarder); |
@@ -2459,31 +2463,39 @@ int SrsSource::create_forwarders() | @@ -2459,31 +2463,39 @@ int SrsSource::create_forwarders() | ||
2459 | if(servers_size <= 0){ | 2463 | if(servers_size <= 0){ |
2460 | return ret; | 2464 | return ret; |
2461 | } | 2465 | } |
2466 | + | ||
2467 | + for(int i = 0; i < servers_size; i++){ | ||
2462 | 2468 | ||
2463 | - if(server_index >= servers_size){ | ||
2464 | - server_index = 0; | ||
2465 | - } | 2469 | + if(server_index >= servers_size){ |
2470 | + server_index = 0; | ||
2471 | + } | ||
2466 | 2472 | ||
2467 | - std::string forward_server = conf->args.at(server_index); | ||
2468 | - server_index ++; | 2473 | + std::string forward_server = conf->args.at(server_index); |
2474 | + server_index ++; | ||
2469 | 2475 | ||
2470 | - SrsForwarder* forwarder = new SrsForwarder(this); | ||
2471 | - forwarders.push_back(forwarder); | 2476 | + if (SrsForwarder::check_dead_loop(_req, forward_server)) { |
2477 | + continue; | ||
2478 | + } | ||
2472 | 2479 | ||
2473 | - // initialize the forwarder with request. | ||
2474 | - if ((ret = forwarder->initialize(_req, forward_server)) != ERROR_SUCCESS) { | ||
2475 | - return ret; | ||
2476 | - } | 2480 | + SrsForwarder* forwarder = new SrsForwarder(this); |
2481 | + forwarders.push_back(forwarder); | ||
2477 | 2482 | ||
2478 | - double queue_size = _srs_config->get_queue_length(_req->vhost); | ||
2479 | - forwarder->set_queue_size(queue_size); | 2483 | + // initialize the forwarder with request. |
2484 | + if ((ret = forwarder->initialize(_req, forward_server)) != ERROR_SUCCESS) { | ||
2485 | + return ret; | ||
2486 | + } | ||
2480 | 2487 | ||
2481 | - if ((ret = forwarder->on_publish()) != ERROR_SUCCESS) { | ||
2482 | - srs_error("start forwarder failed. " | ||
2483 | - "vhost=%s, app=%s, stream=%s, forward-to=%s", | ||
2484 | - _req->vhost.c_str(), _req->app.c_str(), _req->stream.c_str(), | ||
2485 | - forward_server.c_str()); | ||
2486 | - return ret; | 2488 | + double queue_size = _srs_config->get_queue_length(_req->vhost); |
2489 | + forwarder->set_queue_size(queue_size); | ||
2490 | + | ||
2491 | + if ((ret = forwarder->on_publish()) != ERROR_SUCCESS) { | ||
2492 | + srs_error("start forwarder failed. " | ||
2493 | + "vhost=%s, app=%s, stream=%s, forward-to=%s", | ||
2494 | + _req->vhost.c_str(), _req->app.c_str(), _req->stream.c_str(), | ||
2495 | + forward_server.c_str()); | ||
2496 | + return ret; | ||
2497 | + } | ||
2498 | + break; | ||
2487 | } | 2499 | } |
2488 | 2500 | ||
2489 | return ret; | 2501 | return ret; |
@@ -1764,6 +1764,11 @@ void SrsRequest::update_auth(SrsRequest* req) | @@ -1764,6 +1764,11 @@ void SrsRequest::update_auth(SrsRequest* req) | ||
1764 | pageUrl = req->pageUrl; | 1764 | pageUrl = req->pageUrl; |
1765 | swfUrl = req->swfUrl; | 1765 | swfUrl = req->swfUrl; |
1766 | tcUrl = req->tcUrl; | 1766 | tcUrl = req->tcUrl; |
1767 | + | ||
1768 | + vhost = req->vhost; | ||
1769 | + app = req->app; | ||
1770 | + param = req->param; | ||
1771 | + port = req->port; | ||
1767 | 1772 | ||
1768 | if (args) { | 1773 | if (args) { |
1769 | srs_freep(args); | 1774 | srs_freep(args); |
-
请 注册 或 登录 后发表评论