fix mem leak in hubConnectionIndex (#22560)
Этот коммит содержится в:
@@ -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) {
|
||||||
|
|||||||
Ссылка в новой задаче
Block a user