From 787e4e655db9f307558a73cae3e06877a41dc363 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Fri, 16 Oct 2020 09:54:13 +0100 Subject: [PATCH] Don't process latest events/memberships for old events --- roomserver/internal/input/input_events.go | 23 ++++---- .../internal/input/input_latest_events.go | 56 ++++++++++--------- 2 files changed, 42 insertions(+), 37 deletions(-) diff --git a/roomserver/internal/input/input_events.go b/roomserver/internal/input/input_events.go index 4241f3891..6b8a43bd8 100644 --- a/roomserver/internal/input/input_events.go +++ b/roomserver/internal/input/input_events.go @@ -136,18 +136,17 @@ func (r *Inputer) processRoomEvent( return event.EventID(), rejectionErr } - if input.Kind == api.KindNew { - if err = r.updateLatestEvents( - ctx, // context - roomInfo, // room info for the room being updated - stateAtEvent, // state at event (below) - event, // event - input.SendAsServer, // send as server - input.TransactionID, // transaction ID - input.HasState, // rewrites state? - ); err != nil { - return "", fmt.Errorf("r.updateLatestEvents: %w", err) - } + if err = r.updateLatestEvents( + ctx, // context + roomInfo, // room info for the room being updated + stateAtEvent, // state at event (below) + input.Kind, // kind of event + event, // event + input.SendAsServer, // send as server + input.TransactionID, // transaction ID + input.HasState, // rewrites state? + ); err != nil { + return "", fmt.Errorf("r.updateLatestEvents: %w", err) } // processing this event resulted in an event (which may not be the one we're processing) diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go index ca5d214d7..ad6ec8b59 100644 --- a/roomserver/internal/input/input_latest_events.go +++ b/roomserver/internal/input/input_latest_events.go @@ -52,6 +52,7 @@ func (r *Inputer) updateLatestEvents( ctx context.Context, roomInfo *types.RoomInfo, stateAtEvent types.StateAtEvent, + kind api.Kind, event gomatrixserverlib.Event, sendAsServer string, transactionID *api.TransactionID, @@ -70,6 +71,7 @@ func (r *Inputer) updateLatestEvents( updater: updater, roomInfo: roomInfo, stateAtEvent: stateAtEvent, + kind: kind, event: event, sendAsServer: sendAsServer, transactionID: transactionID, @@ -95,6 +97,7 @@ type latestEventsUpdater struct { roomInfo *types.RoomInfo stateAtEvent types.StateAtEvent event gomatrixserverlib.Event + kind api.Kind transactionID *api.TransactionID rewritesState bool // Which server to send this event as. @@ -139,33 +142,36 @@ func (u *latestEventsUpdater) doUpdateLatestEvents() error { return nil } - // Work out what the latest events are. This will include the new - // event if it is not already referenced. - if err := u.calculateLatest( - oldLatest, - types.StateAtEventAndReference{ - EventReference: u.event.EventReference(), - StateAtEvent: u.stateAtEvent, - }, - ); err != nil { - return fmt.Errorf("u.calculateLatest: %w", err) + var updates []api.OutputEvent + var err error + if u.kind == api.KindNew { + // Work out what the latest events are. This will include the new + // event if it is not already referenced. + if err = u.calculateLatest( + oldLatest, + types.StateAtEventAndReference{ + EventReference: u.event.EventReference(), + StateAtEvent: u.stateAtEvent, + }, + ); err != nil { + return fmt.Errorf("u.calculateLatest: %w", err) + } + + // Now that we know what the latest events are, it's time to get the + // latest state. + if err = u.latestState(); err != nil { + return fmt.Errorf("u.latestState: %w", err) + } + + // If we need to generate any output events then here's where we do it. + // TODO: Move this! + updates, err = u.api.updateMemberships(u.ctx, u.updater, u.removed, u.added) + if err != nil { + return fmt.Errorf("u.api.updateMemberships: %w", err) + } } - // Now that we know what the latest events are, it's time to get the - // latest state. - if err := u.latestState(); err != nil { - return fmt.Errorf("u.latestState: %w", err) - } - - // If we need to generate any output events then here's where we do it. - // TODO: Move this! - updates, err := u.api.updateMemberships(u.ctx, u.updater, u.removed, u.added) - if err != nil { - return fmt.Errorf("u.api.updateMemberships: %w", err) - } - - var update *api.OutputEvent - update, err = u.makeOutputNewRoomEvent() + update, err := u.makeOutputNewRoomEvent() if err != nil { return fmt.Errorf("u.makeOutputNewRoomEvent: %w", err) }