aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-10-19 14:59:13 +0100
committerGitHub <noreply@github.com>2020-10-19 14:59:13 +0100
commit6e63df1d9a3eadf924d518a1a02f04dfd03ad6b1 (patch)
treefdfab85a07f37c18b0545f042a8e70dedc1aa75b /roomserver/internal
parent0974f6e2c055d8d06b5ea9c175252b22b2399fe2 (diff)
KindOld (#1531)
* Add KindOld * Don't process latest events/memberships for old events * Allow federationsender to ignore duplicate key entries when LatestEventIDs is duplicated by RS output events * Signal to downstream components if an event has become a forward extremity * Don't exclude from sync * Soft-fail checks on KindNew * Don't run the latest events updater at all for KindOld * Don't make federation sender change after all * Kind in federation sender join * Don't send isForwardExtremity * Fix syncapi * Update comments * Fix SendEventWithState * Update sytest-whitelist * Generate old output events * Sync API consumes old room events * Update comments
Diffstat (limited to 'roomserver/internal')
-rw-r--r--roomserver/internal/input/input_events.go39
-rw-r--r--roomserver/internal/input/input_latest_events.go11
2 files changed, 33 insertions, 17 deletions
diff --git a/roomserver/internal/input/input_events.go b/roomserver/internal/input/input_events.go
index 11334159..67031609 100644
--- a/roomserver/internal/input/input_events.go
+++ b/roomserver/internal/input/input_events.go
@@ -119,7 +119,7 @@ func (r *Inputer) processRoomEvent(
// We haven't calculated a state for this event yet.
// Lets calculate one.
err = r.calculateAndSetState(ctx, input, *roomInfo, &stateAtEvent, event, isRejected)
- if err != nil {
+ if err != nil && input.Kind != api.KindOld {
return "", fmt.Errorf("r.calculateAndSetState: %w", err)
}
}
@@ -136,16 +136,31 @@ func (r *Inputer) processRoomEvent(
return event.EventID(), rejectionErr
}
- 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)
+ switch input.Kind {
+ case 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)
+ }
+ case api.KindOld:
+ err = r.WriteOutputEvents(event.RoomID(), []api.OutputEvent{
+ {
+ Type: api.OutputTypeOldRoomEvent,
+ OldRoomEvent: &api.OutputOldRoomEvent{
+ Event: headered,
+ },
+ },
+ })
+ if err != nil {
+ return "", fmt.Errorf("r.WriteOutputEvents (old): %w", err)
+ }
}
// processing this event resulted in an event (which may not be the one we're processing)
@@ -163,7 +178,7 @@ func (r *Inputer) processRoomEvent(
},
})
if err != nil {
- return "", fmt.Errorf("r.WriteOutputEvents: %w", err)
+ return "", fmt.Errorf("r.WriteOutputEvents (redactions): %w", err)
}
}
diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go
index ca5d214d..5adcd087 100644
--- a/roomserver/internal/input/input_latest_events.go
+++ b/roomserver/internal/input/input_latest_events.go
@@ -164,8 +164,7 @@ func (u *latestEventsUpdater) doUpdateLatestEvents() error {
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)
}
@@ -259,6 +258,8 @@ func (u *latestEventsUpdater) latestState() error {
return nil
}
+// calculateLatest works out the new set of forward extremities. Returns
+// true if the new event is included in those extremites, false otherwise.
func (u *latestEventsUpdater) calculateLatest(
oldLatest []types.StateAtEventAndReference,
newEvent types.StateAtEventAndReference,
@@ -326,7 +327,6 @@ func (u *latestEventsUpdater) makeOutputNewRoomEvent() (*api.OutputEvent, error)
if err != nil {
return nil, err
}
-
for _, entry := range u.added {
ore.AddsStateEventIDs = append(ore.AddsStateEventIDs, eventIDMap[entry.EventNID])
}
@@ -339,13 +339,14 @@ func (u *latestEventsUpdater) makeOutputNewRoomEvent() (*api.OutputEvent, error)
for _, entry := range u.stateBeforeEventAdds {
ore.StateBeforeAddsEventIDs = append(ore.StateBeforeAddsEventIDs, eventIDMap[entry.EventNID])
}
+
ore.SendAsServer = u.sendAsServer
// include extra state events if they were added as nearly every downstream component will care about it
// and we'd rather not have them all hit QueryEventsByID at the same time!
if len(ore.AddsStateEventIDs) > 0 {
- ore.AddStateEvents, err = u.extraEventsForIDs(u.roomInfo.RoomVersion, ore.AddsStateEventIDs)
- if err != nil {
+ var err error
+ if ore.AddStateEvents, err = u.extraEventsForIDs(u.roomInfo.RoomVersion, ore.AddsStateEventIDs); err != nil {
return nil, fmt.Errorf("failed to load add_state_events from db: %w", err)
}
}