Skip to content

Commit cff5064

Browse files
HLS: Fix on_hls and hls_dispose critical zone issue. v5.0.174 v6.0.69 (#3781)
on_hls and hls_dispose are two coroutines, with potential race conditions. That is, during on_hls, if the API Server being accessed is slower, it will switch to the hls_dispose coroutine to start cleaning up. However, when the API Server is processing the slice, a situation may occur where the slice does not exist, resulting in the following log: ``` [2023-08-22 12:03:20.309][WARN][40][x5l48q7b][11] ignore task failed code=4005(HttpStatus)(Invalid HTTP status code) : callback on_hls http://localhost:2024/terraform/v1/hooks/srs/hls : http: post http://localhost:2024/terraform/v1/hooks/srs/hls with {"server_id":"vid-5d7dxn8","service_id":"cu153o7g","action":"on_hls","client_id":"x5l48q7b","ip":"172.17.0.1","vhost":"__defaultVhost__","app":"live","tcUrl":"srt://172.17.0.2/live","stream":"stream-44572-2739617660809856576","param":"secret=1ed8e0ffbc53439c8fc8da30ab8c19f0","duration":4.57,"cwd":"/usr/local/srs-stack/platform","file":"./objs/nginx/html/live/stream-44572-2739617660809856576-1.ts","url":"live/stream-44572-2739617660809856576-1.ts","m3u8":"./objs/nginx/html/live/stream-44572-2739617660809856576.m3u8","m3u8_url":"live/stream-44572-2739617660809856576.m3u8","seq_no":1,"stream_url":"/live/stream-44572-2739617660809856576","stream_id":"vid-0n9zoz3"}, status=500, res=invalid ts file ./objs/nginx/html/live/stream-44572-2739617660809856576-1.ts: stat ./objs/nginx/html/live/stream-44572-2739617660809856576-1.ts: no such file or directory thread [40][x5l48q7b]: call() [./src/app/srs_app_hls.cpp:122][errno=11] thread [40][x5l48q7b]: on_hls() [./src/app/srs_app_http_hooks.cpp:401][errno=11] thread [40][x5l48q7b]: do_post() [./src/app/srs_app_http_hooks.cpp:638][errno=11] [error] 2023/08/22 12:03:20.076984 [52][1001] Serve /terraform/v1/hooks/srs/hls failed, err is stat ./objs/nginx/html/live/stream-44572-2739617660809856576-1.ts: no such file or directory invalid ts file ./objs/nginx/html/live/stream-44572-2739617660809856576-1.ts main.handleOnHls.func1.1 /g/platform/srs-hooks.go:684 main.handleOnHls.func1 /g/platform/srs-hooks.go:720 net/http.HandlerFunc.ServeHTTP /usr/local/go/src/net/http/server.go:2084 net/http.(*ServeMux).ServeHTTP /usr/local/go/src/net/http/server.go:2462 net/http.serverHandler.ServeHTTP /usr/local/go/src/net/http/server.go:2916 net/http.(*conn).serve /usr/local/go/src/net/http/server.go:1966 runtime.goexit /usr/local/go/src/runtime/asm_amd64.s:1571 ``` Similarly, when stopping the stream, on_hls will also be called to handle the last slice. If the API Server is slower at this time, it will enter hls_dispose and call unpublish repeatedly. Since the previous unpublish is still blocked in on_hls, the following interference log will appear: ``` [2023-08-22 12:03:18.748][INFO][40][6498088c] hls cycle to dispose hls /live/stream-44572-2739617660809856576, timeout=10000000ms [2023-08-22 12:03:18.752][WARN][40][6498088c][115] flush audio ignored, for segment is not open. [2023-08-22 12:03:18.752][WARN][40][6498088c][115] ignore the segment close, for segment is not open. ``` Although this log will not cause problems, it can interfere with judgment. The solution is to add an 'unpublishing' status. If it is in the 'unpublishing' status, then do not clean up the slices. --------- Co-authored-by: Haibo Chen <[email protected]>
1 parent cf46dae commit cff5064

File tree

7 files changed

+35
-9
lines changed

7 files changed

+35
-9
lines changed

.run/srs-stack.run.xml

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="srs-stack" type="CMakeRunConfiguration" factoryName="Application" PROGRAM_PARAMS="-c containers/conf/srs.release-local.conf" REDIRECT_INPUT="false" ELEVATE="false" USE_EXTERNAL_CONSOLE="false" WORKING_DIR="file://$USER_HOME$/git/srs-stack/platform" PASS_PARENT_ENVS_2="true" PROJECT_NAME="srs" TARGET_NAME="srs" CONFIG_NAME="Debug" RUN_TARGET_PROJECT_NAME="srs" RUN_TARGET_NAME="srs">
3+
<envs>
4+
<env name="SRS_RTC_SERVER_ENABLED" value="on" />
5+
<env name="MallocNanoZone" value="0" />
6+
</envs>
7+
<method v="2">
8+
<option name="com.jetbrains.cidr.execution.CidrBuildBeforeRunTaskProvider$BuildBeforeRunTask" enabled="true" />
9+
</method>
10+
</configuration>
11+
</component>

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ developers listed below:
119119
[![](https://opencollective.com/srs-server/backers.svg?width=800&button=false)](https://opencollective.com/srs-server)
120120

121121
We at SRS aim to establish a non-profit, open-source community that assists developers worldwide in creating
122-
their own high-quality streaming and RTC platforms to support your businesses.
122+
your own high-quality streaming and RTC platforms to support your businesses.
123123

124124
## AUTHORS
125125

trunk/doc/CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ The changelog for SRS.
77
<a name="v6-changes"></a>
88

99
## SRS 6.0 Changelog
10+
* v6.0, 2023-08-28, Merge [#3781](https://github.com/ossrs/srs/pull/3781): HLS: Fix on_hls and hls_dispose critical zone issue. v6.0.69 (#3781)
1011
* v6.0, 2023-08-28, Merge [#3768](https://github.com/ossrs/srs/pull/3768): Support include empty config file. v6.0.68 (#3768)
1112
* v6.0, 2023-08-25, Merge [#3782](https://github.com/ossrs/srs/pull/3782): HLS: Support reload HLS asynchronously. v6.0.67 (#3782)
1213
* v6.0, 2023-08-22, Merge [#3775](https://github.com/ossrs/srs/pull/3775): Bugfix: Log format output type does not match. v6.0.66 (#3699)
@@ -80,6 +81,7 @@ The changelog for SRS.
8081
<a name="v5-changes"></a>
8182

8283
## SRS 5.0 Changelog
84+
* v5.0, 2023-08-28, Merge [#3781](https://github.com/ossrs/srs/pull/3781): HLS: Fix on_hls and hls_dispose critical zone issue. v5.0.174 (#3781)
8385
* v5.0, 2023-08-28, Merge [#3768](https://github.com/ossrs/srs/pull/3768): Support include empty config file. v5.0.173 (#3768)
8486
* v5.0, 2023-08-25, Merge [#3782](https://github.com/ossrs/srs/pull/3782): HLS: Support reload HLS asynchronously. v5.0.172 (#3782)
8587
* v5.0, 2023-08-22, Merge [#3775](https://github.com/ossrs/srs/pull/3775): Bugfix: Log format output type does not match. v5.0.171 (#3699)

trunk/src/app/srs_app_hls.cpp

+16-5
Original file line numberDiff line numberDiff line change
@@ -1136,6 +1136,7 @@ SrsHls::SrsHls()
11361136

11371137
enabled = false;
11381138
disposable = false;
1139+
unpublishing_ = false;
11391140
async_reload_ = reloading_ = false;
11401141
last_update_time = 0;
11411142
hls_dts_directly = false;
@@ -1222,7 +1223,7 @@ void SrsHls::dispose()
12221223
srs_error_t SrsHls::cycle()
12231224
{
12241225
srs_error_t err = srs_success;
1225-
1226+
12261227
if (last_update_time <= 0) {
12271228
last_update_time = srs_get_system_time();
12281229
}
@@ -1231,6 +1232,9 @@ srs_error_t SrsHls::cycle()
12311232
return err;
12321233
}
12331234

1235+
// When unpublishing, we must wait for it done.
1236+
if (unpublishing_) return err;
1237+
12341238
// When reloading, we must wait for it done.
12351239
if (async_reload_) return err;
12361240

@@ -1243,12 +1247,12 @@ srs_error_t SrsHls::cycle()
12431247
return err;
12441248
}
12451249
last_update_time = srs_get_system_time();
1246-
1250+
12471251
if (!disposable) {
12481252
return err;
12491253
}
12501254
disposable = false;
1251-
1255+
12521256
srs_trace("hls cycle to dispose hls %s, timeout=%dms", req->get_stream_url().c_str(), hls_dispose);
12531257
dispose();
12541258

@@ -1295,6 +1299,8 @@ srs_error_t SrsHls::on_publish()
12951299

12961300
// if enabled, open the muxer.
12971301
enabled = true;
1302+
// Reset the unpublishing state.
1303+
unpublishing_ = false;
12981304

12991305
// ok, the hls can be dispose, or need to be dispose.
13001306
disposable = true;
@@ -1310,21 +1316,26 @@ void SrsHls::on_unpublish()
13101316
if (!enabled) {
13111317
return;
13121318
}
1319+
1320+
// During unpublishing, there maybe callback that switch to other coroutines.
1321+
if (unpublishing_) return;
1322+
unpublishing_ = true;
13131323

13141324
if ((err = controller->on_unpublish()) != srs_success) {
13151325
srs_warn("hls: ignore unpublish failed %s", srs_error_desc(err).c_str());
13161326
srs_freep(err);
13171327
}
13181328

13191329
enabled = false;
1330+
unpublishing_ = false;
13201331
}
13211332

13221333
srs_error_t SrsHls::on_audio(SrsSharedPtrMessage* shared_audio, SrsFormat* format)
13231334
{
13241335
srs_error_t err = srs_success;
13251336

13261337
// If not able to transmux to HLS, ignore.
1327-
if (!enabled) return err;
1338+
if (!enabled || unpublishing_) return err;
13281339
if (async_reload_) return reload();
13291340

13301341
// Ignore if no format->acodec, it means the codec is not parsed, or unknown codec.
@@ -1406,7 +1417,7 @@ srs_error_t SrsHls::on_video(SrsSharedPtrMessage* shared_video, SrsFormat* forma
14061417
srs_error_t err = srs_success;
14071418

14081419
// If not able to transmux to HLS, ignore.
1409-
if (!enabled) return err;
1420+
if (!enabled || unpublishing_) return err;
14101421
if (async_reload_) return reload();
14111422

14121423
// Ignore if no format->vcodec, it means the codec is not parsed, or unknown codec.

trunk/src/app/srs_app_hls.hpp

+3-1
Original file line numberDiff line numberDiff line change
@@ -279,10 +279,12 @@ class SrsHls
279279
bool enabled;
280280
// Whether the HLS stream is able to be disposed.
281281
bool disposable;
282+
// Whether the HLS stream is unpublishing.
283+
bool unpublishing_;
282284
// Whether requires HLS to do reload asynchronously.
283285
bool async_reload_;
284286
bool reloading_;
285-
// To detect heartbeat and dipose it if configured.
287+
// To detect heartbeat and dispose it if configured.
286288
srs_utime_t last_update_time;
287289
private:
288290
// If the diff=dts-previous_audio_dts is about 23,

trunk/src/core/srs_core_version5.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
#define VERSION_MAJOR 5
1111
#define VERSION_MINOR 0
12-
#define VERSION_REVISION 173
12+
#define VERSION_REVISION 174
1313

1414
#endif

trunk/src/core/srs_core_version6.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,6 @@
99

1010
#define VERSION_MAJOR 6
1111
#define VERSION_MINOR 0
12-
#define VERSION_REVISION 68
12+
#define VERSION_REVISION 69
1313

1414
#endif

0 commit comments

Comments
 (0)