aboutsummaryrefslogtreecommitdiff
path: root/syncapi
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-03-16 10:18:08 +0000
committerGitHub <noreply@github.com>2022-03-16 10:18:08 +0000
commitfc0bdf5d88afd286ecc238ed8224126bef2b9674 (patch)
treef85885bd81bb853f545682a7a950a0c425c65555 /syncapi
parent69268fc48e7ba6327378e8bcd8eb2a677a3a2c77 (diff)
Truncate `recentStreamEvents` before working out which event IDs to exclude from `stateEvents` (#2281)
Diffstat (limited to 'syncapi')
-rw-r--r--syncapi/streams/stream_pdu.go35
1 files changed, 19 insertions, 16 deletions
diff --git a/syncapi/streams/stream_pdu.go b/syncapi/streams/stream_pdu.go
index 1486ad3c..1afcbe75 100644
--- a/syncapi/streams/stream_pdu.go
+++ b/syncapi/streams/stream_pdu.go
@@ -271,22 +271,6 @@ func (p *PDUStreamProvider) getJoinResponseForCompleteSync(
return
}
- // Get the event IDs of the stream events we fetched. There's no point in us
- var excludingEventIDs []string
- if !wantFullState {
- excludingEventIDs = make([]string, 0, len(recentStreamEvents))
- for _, event := range recentStreamEvents {
- if event.StateKey() != nil {
- excludingEventIDs = append(excludingEventIDs, event.EventID())
- }
- }
- }
-
- stateEvents, err := p.DB.CurrentState(ctx, roomID, stateFilter, excludingEventIDs)
- if err != nil {
- return
- }
-
// TODO FIXME: We don't fully implement history visibility yet. To avoid leaking events which the
// user shouldn't see, we check the recent events and remove any prior to the join event of the user
// which is equiv to history_visibility: joined
@@ -314,6 +298,25 @@ func (p *PDUStreamProvider) getJoinResponseForCompleteSync(
limited = false // so clients know not to try to backpaginate
}
+ // Work our way through the timeline events and pick out the event IDs
+ // of any state events that appear in the timeline. We'll specifically
+ // exclude them at the next step, so that we don't get duplicate state
+ // events in both `recentStreamEvents` and `stateEvents`.
+ var excludingEventIDs []string
+ if !wantFullState {
+ excludingEventIDs = make([]string, 0, len(recentStreamEvents))
+ for _, event := range recentStreamEvents {
+ if event.StateKey() != nil {
+ excludingEventIDs = append(excludingEventIDs, event.EventID())
+ }
+ }
+ }
+
+ stateEvents, err := p.DB.CurrentState(ctx, roomID, stateFilter, excludingEventIDs)
+ if err != nil {
+ return
+ }
+
// Retrieve the backward topology position, i.e. the position of the
// oldest event in the room's topology.
var prevBatch *types.TopologyToken