fix mem leak in hubConnectionIndex (#22560)

Этот коммит содержится в:
byigorv
2023-03-24 08:52:37 +03:00
коммит произвёл GitHub
родитель 9b5afb1b5f
Коммит 017c51c246
2 изменённых файлов: 39 добавлений и 0 удалений

Просмотреть файл

@@ -599,6 +599,8 @@ func (i *hubConnectionIndex) Remove(wc *WebConn) {
last := userConnections[len(userConnections)-1] last := userConnections[len(userConnections)-1]
// set the slot that we are trying to remove to be the last connection. // set the slot that we are trying to remove to be the last connection.
userConnections[userConnIndex] = last userConnections[userConnIndex] = last
// remove the last connection pointer from slice.
userConnections[len(userConnections)-1] = nil
// remove the last connection from the slice. // remove the last connection from the slice.
i.byUserId[wc.UserId] = userConnections[:len(userConnections)-1] i.byUserId[wc.UserId] = userConnections[:len(userConnections)-1]
// set the index of the connection that was moved to the new index. // set the index of the connection that was moved to the new index.

Просмотреть файл

@@ -8,6 +8,7 @@ import (
"net" "net"
"net/http" "net/http"
"net/http/httptest" "net/http/httptest"
"runtime"
"testing" "testing"
"time" "time"
@@ -539,6 +540,42 @@ func BenchmarkHubConnIndex(b *testing.B) {
}) })
} }
func TestHubConnIndexRemoveMemLeak(t *testing.T) {
th := Setup(t)
defer th.TearDown()
connIndex := newHubConnectionIndex(1 * time.Second)
wc := &WebConn{
Platform: th.Service,
Suite: th.Suite,
}
wc.SetConnectionID(model.NewId())
wc.SetSession(&model.Session{})
ch := make(chan struct{})
runtime.SetFinalizer(wc, func(*WebConn) {
close(ch)
})
connIndex.Add(wc)
connIndex.Remove(wc)
runtime.GC()
timer := time.NewTimer(3 * time.Second)
defer timer.Stop()
select {
case <-ch:
case <-timer.C:
require.Fail(t, "timeout waiting for collection of wc")
}
assert.Len(t, connIndex.byConnection, 0)
}
var hubSink *Hub var hubSink *Hub
func BenchmarkGetHubForUserId(b *testing.B) { func BenchmarkGetHubForUserId(b *testing.B) {