MM-61225: Revert session pooling (#28901)
This originated from https://github.com/mattermost/mattermost/issues/15249. However, the original idea was discarded https://github.com/mattermost/mattermost/issues/15249#issuecomment-709713065 as being too complicated to implement. Then I had another idea to implement it just for session objects. My thinking was that since every single request allocates a new session struct, it would be good to use a sync.Pool for that. However, 4 years later, now we know that the primary bottleneck in app performance comes from websocket event marshalling. Therefore, while it would be good to do this, it is difficult to do it correctly (as shown by the numerous racy tests). Hence, reverting this. ```release-note NONE ```
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
a8cf496e31
Коммит
6075b1cd4e
@@ -194,6 +194,15 @@ func (ps *PlatformService) PopulateWebConnConfig(s *model.Session, cfg *WebConnC
|
||||
|
||||
// NewWebConn returns a new WebConn instance.
|
||||
func (ps *PlatformService) NewWebConn(cfg *WebConnConfig, suite SuiteIFace, runner HookRunner) *WebConn {
|
||||
userID := cfg.Session.UserId
|
||||
session := cfg.Session
|
||||
if cfg.Session.UserId != "" {
|
||||
ps.Go(func() {
|
||||
ps.SetStatusOnline(userID, false)
|
||||
ps.UpdateLastActivityAtIfNeeded(session)
|
||||
})
|
||||
}
|
||||
|
||||
// Disable TCP_NO_DELAY for higher throughput
|
||||
var tcpConn *net.TCPConn
|
||||
switch conn := cfg.WebSocket.UnderlyingConn().(type) {
|
||||
@@ -245,23 +254,9 @@ func (ps *PlatformService) NewWebConn(cfg *WebConnConfig, suite SuiteIFace, runn
|
||||
remoteAddress: cfg.RemoteAddress,
|
||||
xForwardedFor: cfg.XForwardedFor,
|
||||
}
|
||||
|
||||
wc.SetSession(&cfg.Session)
|
||||
userID := cfg.Session.UserId
|
||||
if userID != "" {
|
||||
// UpdateLastActivityAtIfNeeded might block if the Hub is busy.
|
||||
// Create a goroutine to avoid blocking the creation of the websocket connection.
|
||||
ps.Go(func() {
|
||||
ps.SetStatusOnline(userID, false)
|
||||
session := wc.GetSession()
|
||||
if session != nil {
|
||||
ps.UpdateLastActivityAtIfNeeded(*session)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
wc.Active.Store(cfg.Active)
|
||||
|
||||
wc.SetSession(&cfg.Session)
|
||||
wc.SetSessionToken(cfg.Session.Token)
|
||||
wc.SetSessionExpiresAt(cfg.Session.ExpiresAt)
|
||||
wc.SetConnectionID(cfg.ConnectionID)
|
||||
@@ -393,8 +388,6 @@ func (wc *WebConn) GetSession() *model.Session {
|
||||
|
||||
// SetSession sets the session of the connection.
|
||||
func (wc *WebConn) SetSession(v *model.Session) {
|
||||
// Clone the session first as WebConn takes ownership of the object
|
||||
// and the web.Hub will return it to the [sync.Pool] once the WebConn gets removed.
|
||||
if v != nil {
|
||||
v = v.DeepCopy()
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user