fix mem leak in hubConnectionIndex (#22560)

This commit is contained in:
byigorv
2023-03-24 08:52:37 +03:00
committed by GitHub
parent 9b5afb1b5f
commit 017c51c246
2 changed files with 39 additions and 0 deletions

View File

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

View File

@@ -8,6 +8,7 @@ import (
"net"
"net/http"
"net/http/httptest"
"runtime"
"testing"
"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
func BenchmarkGetHubForUserId(b *testing.B) {