Handle overwriting same event type and state key

This commit is contained in:
Neil Alexander 2020-09-08 20:15:34 +01:00
parent bc5db48f2c
commit bacf54cd5e
No known key found for this signature in database
GPG key ID: A02A2019A2BB0944

View file

@ -47,7 +47,7 @@ func SendEventWithState(
ctx context.Context, rsAPI RoomserverInternalAPI, state *gomatrixserverlib.RespState, ctx context.Context, rsAPI RoomserverInternalAPI, state *gomatrixserverlib.RespState,
event gomatrixserverlib.HeaderedEvent, haveEventIDs map[string]bool, event gomatrixserverlib.HeaderedEvent, haveEventIDs map[string]bool,
) error { ) error {
outliers, err := state.Events() stateEvents, err := state.Events()
if err != nil { if err != nil {
return err return err
} }
@ -55,18 +55,34 @@ func SendEventWithState(
var ires []InputRoomEvent var ires []InputRoomEvent
var stateIDs []string var stateIDs []string
for _, outlier := range outliers { for _, stateEvent := range stateEvents {
if haveEventIDs[outlier.EventID()] { if stateEvent.StateKey() == nil {
continue
}
if haveEventIDs[stateEvent.EventID()] {
continue
}
if stateEvent.Type() == event.Type() && *stateEvent.StateKey() == *event.StateKey() {
// If this event is an old state event that will be replaced by the
// given event, then store it as an outlier instead. We don't want
// to include it in the current room state as we will end up violating
// unique constraints in the state block, but we need the event to
// be stored as it may be referred to as an auth_event or prev_event.
ires = append(ires, InputRoomEvent{
Kind: KindOutlier,
Event: stateEvent.Headered(event.RoomVersion),
AuthEventIDs: stateEvent.AuthEventIDs(),
})
continue continue
} }
ires = append(ires, InputRoomEvent{ ires = append(ires, InputRoomEvent{
Kind: KindNew, Kind: KindNew,
Event: outlier.Headered(event.RoomVersion), Event: stateEvent.Headered(event.RoomVersion),
AuthEventIDs: outlier.AuthEventIDs(), AuthEventIDs: stateEvent.AuthEventIDs(),
HasState: true, HasState: true,
StateEventIDs: stateIDs, StateEventIDs: stateIDs,
}) })
stateIDs = append(stateIDs, outlier.EventID()) stateIDs = append(stateIDs, stateEvent.EventID())
} }
ires = append(ires, InputRoomEvent{ ires = append(ires, InputRoomEvent{