support forward between two origin,to make a full backup of top server
正在显示
4 个修改的文件
包含
71 行增加
和
2 行删除
| @@ -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: |
| @@ -2428,6 +2428,10 @@ int SrsSource::create_forwarders() | @@ -2428,6 +2428,10 @@ int SrsSource::create_forwarders() | ||
| 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 | 2430 | ||
| 2431 | + if (SrsForwarder::check_dead_loop(_req, forward_server)) { | ||
| 2432 | + continue; | ||
| 2433 | + } | ||
| 2434 | + | ||
| 2431 | SrsForwarder* forwarder = new SrsForwarder(this); | 2435 | SrsForwarder* forwarder = new SrsForwarder(this); |
| 2432 | forwarders.push_back(forwarder); | 2436 | forwarders.push_back(forwarder); |
| 2433 | 2437 | ||
| @@ -2460,6 +2464,8 @@ int SrsSource::create_forwarders() | @@ -2460,6 +2464,8 @@ int SrsSource::create_forwarders() | ||
| 2460 | return ret; | 2464 | return ret; |
| 2461 | } | 2465 | } |
| 2462 | 2466 | ||
| 2467 | + for(int i = 0; i < servers_size; i++){ | ||
| 2468 | + | ||
| 2463 | if(server_index >= servers_size){ | 2469 | if(server_index >= servers_size){ |
| 2464 | server_index = 0; | 2470 | server_index = 0; |
| 2465 | } | 2471 | } |
| @@ -2467,6 +2473,10 @@ int SrsSource::create_forwarders() | @@ -2467,6 +2473,10 @@ int SrsSource::create_forwarders() | ||
| 2467 | std::string forward_server = conf->args.at(server_index); | 2473 | std::string forward_server = conf->args.at(server_index); |
| 2468 | server_index ++; | 2474 | server_index ++; |
| 2469 | 2475 | ||
| 2476 | + if (SrsForwarder::check_dead_loop(_req, forward_server)) { | ||
| 2477 | + continue; | ||
| 2478 | + } | ||
| 2479 | + | ||
| 2470 | SrsForwarder* forwarder = new SrsForwarder(this); | 2480 | SrsForwarder* forwarder = new SrsForwarder(this); |
| 2471 | forwarders.push_back(forwarder); | 2481 | forwarders.push_back(forwarder); |
| 2472 | 2482 | ||
| @@ -2485,6 +2495,8 @@ int SrsSource::create_forwarders() | @@ -2485,6 +2495,8 @@ int SrsSource::create_forwarders() | ||
| 2485 | forward_server.c_str()); | 2495 | forward_server.c_str()); |
| 2486 | return ret; | 2496 | return ret; |
| 2487 | } | 2497 | } |
| 2498 | + break; | ||
| 2499 | + } | ||
| 2488 | 2500 | ||
| 2489 | return ret; | 2501 | return ret; |
| 2490 | } | 2502 | } |
| @@ -1765,6 +1765,11 @@ void SrsRequest::update_auth(SrsRequest* req) | @@ -1765,6 +1765,11 @@ void SrsRequest::update_auth(SrsRequest* req) | ||
| 1765 | swfUrl = req->swfUrl; | 1765 | swfUrl = req->swfUrl; |
| 1766 | tcUrl = req->tcUrl; | 1766 | tcUrl = req->tcUrl; |
| 1767 | 1767 | ||
| 1768 | + vhost = req->vhost; | ||
| 1769 | + app = req->app; | ||
| 1770 | + param = req->param; | ||
| 1771 | + port = req->port; | ||
| 1772 | + | ||
| 1768 | if (args) { | 1773 | if (args) { |
| 1769 | srs_freep(args); | 1774 | srs_freep(args); |
| 1770 | } | 1775 | } |
-
请 注册 或 登录 后发表评论