-
-
Notifications
You must be signed in to change notification settings - Fork 5.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Edge: Fix flv edge crash when http unmount. v6.0.154 (#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>
- Loading branch information
Showing
6 changed files
with
29 additions
and
21 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -9,6 +9,6 @@ | |
|
||
#define VERSION_MAJOR 6 | ||
#define VERSION_MINOR 0 | ||
#define VERSION_REVISION 153 | ||
#define VERSION_REVISION 154 | ||
|
||
#endif |