mirror of https://github.com/ossrs/srs.git
Edge: Fix flv edge crash when http unmount. v6.0.154 v7.0.13 (#4166)
Edge FLV is not working because it is stuck in an infinite loop waiting. Previously, there was no need to wait for exit since resources were not being cleaned up. Now, since resources need to be cleaned up, it must wait for all active connections to exit, which causes this issue. To reproduce the issue, start SRS edge, run the bellow command and press `CTRL+C` to stop the request: ```bash curl http://localhost:8080/live/livestream.flv -v >/dev/null ``` It will cause edge to fetch stream from origin, and free the consumer when client quit. When `SrsLiveStream::do_serve_http` return, it will free the consumer: ```cpp srs_error_t SrsLiveStream::do_serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) { SrsUniquePtr<SrsLiveConsumer> consumer(consumer_raw); ``` Keep in mind that in this moment, the stream is alive, because only set to not alive after this function return: ```cpp alive_viewers_++; err = do_serve_http(w, r); // Free 'this' alive stream. alive_viewers_--; // Crash here, because 'this' is freed. ``` When freeing the consumer, it will cause the source to unpublish and attempt to free the HTTP handler, which ultimately waits for the stream not to be alive: ```cpp SrsLiveConsumer::~SrsLiveConsumer() { source_->on_consumer_destroy(this); void SrsLiveSource::on_consumer_destroy(SrsLiveConsumer* consumer) { if (consumers.empty()) { play_edge->on_all_client_stop(); void SrsLiveSource::on_unpublish() { handler->on_unpublish(req); void SrsHttpStreamServer::http_unmount(SrsRequest* r) { if (stream->entry) stream->entry->enabled = false; for (; i < 1024; i++) { if (!cache->alive() && !stream->alive()) { break; } srs_usleep(100 * SRS_UTIME_MILLISECONDS); } ``` After 120 seconds, it will free the stream and cause SRS to crash because the stream is still active. In order to track this potential issue, also add an important warning log: ```cpp srs_warn("http: try to free a alive stream, cache=%d, stream=%d", cache->alive(), stream->alive()); ``` SRS may crash if got this log. --------- Co-authored-by: Jacob Su <suzp1984@gmail.com>pull/4174/head
parent
a7aa2eaf76
commit
740f0d38ec
Loading…
Reference in New Issue