Optimize/fix concurrency for chat

This commit is contained in:
Gabe Kangas
2021-03-03 20:44:13 -08:00
parent 1e0b1b389d
commit 49bb899d51
5 changed files with 38 additions and 15 deletions

View File

@@ -73,6 +73,9 @@ func GetModerationChatMessages() []models.ChatEvent {
}
func GetClient(clientID string) *Client {
l.RLock()
defer l.RUnlock()
for _, client := range _server.Clients {
if client.ClientID == clientID {
return client

View File

@@ -153,10 +153,9 @@ func (c *Client) listenRead() {
if err != nil {
if err == io.EOF {
c.doneCh <- true
} else {
c.handleClientSocketError(err)
return
}
return
c.handleClientSocketError(err)
}
var messageTypeCheck map[string]interface{}
@@ -165,12 +164,12 @@ func (c *Client) listenRead() {
log.Errorln(err)
}
messageType := messageTypeCheck["type"].(string)
if !c.passesRateLimit() {
continue
}
messageType := messageTypeCheck["type"].(string)
if messageType == models.MessageSent {
c.chatMessageReceived(data)
} else if messageType == models.UserNameChanged {

View File

@@ -18,7 +18,7 @@ var (
_server *server
)
var l = sync.Mutex{}
var l = &sync.RWMutex{}
// Server represents the server which handles the chat.
type server struct {
@@ -56,32 +56,42 @@ func (s *server) err(err error) {
}
func (s *server) sendAll(msg models.ChatEvent) {
l.RLock()
for _, c := range s.Clients {
c.write(msg)
}
l.RUnlock()
}
func (s *server) ping() {
ping := models.PingMessage{MessageType: models.PING}
l.RLock()
for _, c := range s.Clients {
c.pingch <- ping
}
l.RUnlock()
}
func (s *server) usernameChanged(msg models.NameChangeEvent) {
l.RLock()
for _, c := range s.Clients {
c.usernameChangeChannel <- msg
}
l.RUnlock()
go webhooks.SendChatEventUsernameChanged(msg)
}
func (s *server) userJoined(msg models.UserJoinedEvent) {
l.RLock()
if s.listener.IsStreamConnected() {
for _, c := range s.Clients {
c.userJoinedChannel <- msg
}
}
l.RUnlock()
go webhooks.SendChatEventUserJoined(msg)
}
@@ -92,7 +102,8 @@ func (s *server) onConnection(ws *websocket.Conn) {
s.removeClient(client)
if err := ws.Close(); err != nil {
s.errCh <- err
log.Debugln(err)
//s.errCh <- err
}
}()
@@ -113,12 +124,12 @@ func (s *server) Listen() {
case c := <-s.addCh:
l.Lock()
s.Clients[c.socketID] = c
l.Unlock()
if !c.Ignore {
s.listener.ClientAdded(c.GetViewerClientFromChatClient())
s.sendWelcomeMessageToClient(c)
}
l.Unlock()
// remove a client
case c := <-s.delCh:
@@ -158,12 +169,10 @@ func (s *server) Listen() {
func (s *server) removeClient(c *Client) {
l.Lock()
if _, ok := s.Clients[c.socketID]; ok {
delete(s.Clients, c.socketID)
s.listener.ClientRemoved(c.socketID)
log.Tracef("The client was connected for %s and sent %d messages (%s)", time.Since(c.ConnectedAt), c.MessageCount, c.ClientID)
}
l.Unlock()