Monibuca / engine

Monibuca 核心引擎,包含流媒体核心转发逻辑,需要配合功能插件一起组合运行
MIT License
937 stars 199 forks source link

4.15.1之后检测track存活度时,如果time.Since(s.StartTime) > timeout判断为false,走continue之后未重置定时器,疑似导致subscriber无法释放 #110

Closed gzncland closed 2 months ago

gzncland commented 2 months ago

commit 9dc92eca7b81e49f2e2adec73679f581372e004a

原代码 stream.go

if trackCount == 0 {
    s.Warn("no tracks")
    if time.Since(s.StartTime) > timeout {
        lost = true
        s.action(ACTION_CLOSE)
    } 
    continue
} // ...

我在生产环境拉的国标PS流,由于PS流上来比较慢,会经常触发这一段代码。然后subscriber会出现一直增长的现象。之后我改成

if trackCount == 0 {
    s.Warn("no tracks")
    if time.Since(s.StartTime) > timeout {
        lost = true
        s.action(ACTION_CLOSE)
    } else {
        s.timeout.Reset(time.Second * 5)
    }
    continue
}

在运行过程中subscriber一直增长的现象消失。请看看是不是存在这样一个bug

langhuihui commented 2 months ago

你是怎么想到写这行代码的,没看出来基于什么考虑

gzncland commented 2 months ago

从代码上看起来如果time.Since(s.StartTime) < timeout没有命中,定时器就不会再重置,StreamState就不会再变化了; case <-s.timeout.C:action函数每一个case都会重置定时器或将定时器停止,唯独这里没有重置,我想是不是漏了 —— 基于这样的考虑

langhuihui commented 2 months ago

看起来确实如此

langhuihui commented 2 months ago

在这个提交中修复