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 | } |
-
请 注册 或 登录 后发表评论