xtaci / kcptun

A Quantum-Safe Secure Tunnel based on QPP, KCP, FEC, and N:M multiplexing.
MIT License
13.88k stars 2.54k forks source link

client/main.go里没有显式关闭session会不会引起内存泄露 #937

Closed WSitong closed 8 months ago

WSitong commented 8 months ago

kcptun/client/main.go第477行:muxes[idx].session = waitConn(),这里没有关闭旧session,我猜想可能是存在还在使用的stream。但是它会在什么时机关闭,还是它在等待服务端关闭?可是服务端要在acceptStream出错时才会关闭。

// do auto expiration && reconnection
if muxes[idx].session == nil || muxes[idx].session.IsClosed() ||
    (config.AutoExpire > 0 && time.Now().After(muxes[idx].expiryDate)) {
    muxes[idx].session = waitConn() // 这里直接替换,没有关闭原来session
    muxes[idx].expiryDate = time.Now().Add(time.Duration(config.AutoExpire) * time.Second)
    if config.AutoExpire > 0 { // only when autoexpire set
        chScavenger <- muxes[idx]
    }
}
WSitong commented 8 months ago

我有一个想法是在旧seesion被新session替换后,再启动一个协程调用下面这个函数,确保所有stream关闭后立即关闭旧session。但是这样就需要维护一个切片保存每个session的所有stream。不知道这样做是不是多余。

func closeSessionAfterTheStreamsClosed(session *smux.Session, streams []*smux.Stream) {
    if streams != nil {
        for _, stream := range streams {
            if stream != nil {
                <-stream.GetDieCh()
            }
        }
    }
    if session != nil && !session.IsClosed() {
        session.Close()
    }
}
WSitong commented 8 months ago

抱歉,我发现最后面有个scavenger函数在做定时清理。