Per-room input mutex

This commit is contained in:
Neil Alexander 2020-08-20 14:11:51 +01:00
parent 5ad47d3b3d
commit bbb86553c9
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944
2 changed files with 8 additions and 6 deletions

View file

@ -20,7 +20,7 @@ type RoomserverInternalAPI struct {
ServerName gomatrixserverlib.ServerName ServerName gomatrixserverlib.ServerName
KeyRing gomatrixserverlib.JSONVerifier KeyRing gomatrixserverlib.JSONVerifier
FedClient *gomatrixserverlib.FederationClient FedClient *gomatrixserverlib.FederationClient
OutputRoomEventTopic string // Kafka topic for new output room events OutputRoomEventTopic string // Kafka topic for new output room events
mutex sync.Mutex // Protects calls to processRoomEvent mutexes sync.Map // room ID -> *sync.Mutex, protects calls to processRoomEvent
fsAPI fsAPI.FederationSenderInternalAPI fsAPI fsAPI.FederationSenderInternalAPI
} }

View file

@ -18,6 +18,7 @@ package internal
import ( import (
"context" "context"
"encoding/json" "encoding/json"
"sync"
"github.com/Shopify/sarama" "github.com/Shopify/sarama"
"github.com/matrix-org/dendrite/roomserver/api" "github.com/matrix-org/dendrite/roomserver/api"
@ -71,13 +72,14 @@ func (r *RoomserverInternalAPI) InputRoomEvents(
request *api.InputRoomEventsRequest, request *api.InputRoomEventsRequest,
response *api.InputRoomEventsResponse, response *api.InputRoomEventsResponse,
) (err error) { ) (err error) {
// We lock as processRoomEvent can only be called once at a time for i, e := range request.InputRoomEvents {
r.mutex.Lock() mutex, _ := r.mutexes.LoadOrStore(e.Event.RoomID(), &sync.Mutex{})
defer r.mutex.Unlock() mutex.(*sync.Mutex).Lock()
for i := range request.InputRoomEvents {
if response.EventID, err = r.processRoomEvent(ctx, request.InputRoomEvents[i]); err != nil { if response.EventID, err = r.processRoomEvent(ctx, request.InputRoomEvents[i]); err != nil {
mutex.(*sync.Mutex).Unlock()
return err return err
} }
mutex.(*sync.Mutex).Unlock()
} }
return nil return nil
} }