Merge pull request #742 from strukturag/leave-room-lock-order-inversion

Fix lock order inversion when leaving room / publishing room sessions.
This commit is contained in:
Joachim Bauch 2024-05-21 09:20:34 +02:00 committed by GitHub
commit 1bbc49351a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -69,10 +69,12 @@ type ClientSession struct {
mu sync.Mutex
client HandlerClient
room atomic.Pointer[Room]
roomJoinTime atomic.Int64
roomSessionId string
client HandlerClient
room atomic.Pointer[Room]
roomJoinTime atomic.Int64
roomSessionIdLock sync.RWMutex
roomSessionId string
publisherWaiters ChannelWaiters
@ -158,8 +160,8 @@ func (s *ClientSession) PublicId() string {
}
func (s *ClientSession) RoomSessionId() string {
s.mu.Lock()
defer s.mu.Unlock()
s.roomSessionIdLock.RLock()
defer s.roomSessionIdLock.RUnlock()
return s.roomSessionId
}
@ -403,8 +405,8 @@ func (s *ClientSession) SubscribeEvents() error {
}
func (s *ClientSession) UpdateRoomSessionId(roomSessionId string) error {
s.mu.Lock()
defer s.mu.Unlock()
s.roomSessionIdLock.Lock()
defer s.roomSessionIdLock.Unlock()
if s.roomSessionId == roomSessionId {
return nil
@ -433,8 +435,8 @@ func (s *ClientSession) UpdateRoomSessionId(roomSessionId string) error {
}
func (s *ClientSession) SubscribeRoomEvents(roomid string, roomSessionId string) error {
s.mu.Lock()
defer s.mu.Unlock()
s.roomSessionIdLock.Lock()
defer s.roomSessionIdLock.Unlock()
if err := s.events.RegisterRoomListener(roomid, s.backend, s); err != nil {
return err
@ -493,6 +495,9 @@ func (s *ClientSession) doUnsubscribeRoomEvents(notify bool) {
s.events.UnregisterRoomListener(room.Id(), s.Backend(), s)
}
s.hub.roomSessions.DeleteRoomSession(s)
s.roomSessionIdLock.Lock()
defer s.roomSessionIdLock.Unlock()
if notify && room != nil && s.roomSessionId != "" {
// Notify
go func(sid string) {