From 6c0c369286050b2655f12490b597bf1fec7b72f6 Mon Sep 17 00:00:00 2001 From: Neil Alexander Date: Mon, 31 Oct 2022 09:35:18 +0000 Subject: [PATCH] Split `"timeline"` and `"state"` after applying filtering --- syncapi/streams/stream_pdu.go | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/syncapi/streams/stream_pdu.go b/syncapi/streams/stream_pdu.go index 3ab0f4ed4..3e001b583 100644 --- a/syncapi/streams/stream_pdu.go +++ b/syncapi/streams/stream_pdu.go @@ -251,8 +251,10 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse( } return r.From, fmt.Errorf("p.DB.RecentEvents: %w", err) } - recentEvents := snapshot.StreamEventsToEvents(device, recentStreamEvents) - delta.StateEvents = removeDuplicates(delta.StateEvents, recentEvents) // roll back + recentEvents := gomatrixserverlib.HeaderedReverseTopologicalOrdering( + snapshot.StreamEventsToEvents(device, recentStreamEvents), + gomatrixserverlib.TopologicalOrderByPrevEvents, + ) prevBatch, err := snapshot.GetBackwardTopologyPos(ctx, recentStreamEvents) if err != nil { return r.From, fmt.Errorf("p.DB.GetBackwardTopologyPos: %w", err) @@ -263,10 +265,6 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse( return r.To, nil } - // Sort the events so that we can pick out the latest events from both sections. - recentEvents = gomatrixserverlib.HeaderedReverseTopologicalOrdering(recentEvents, gomatrixserverlib.TopologicalOrderByPrevEvents) - delta.StateEvents = gomatrixserverlib.HeaderedReverseTopologicalOrdering(delta.StateEvents, gomatrixserverlib.TopologicalOrderByAuthEvents) - // Work out what the highest stream position is for all of the events in this // room that were returned. latestPosition := r.To @@ -314,6 +312,14 @@ func (p *PDUStreamProvider) addRoomDeltaToResponse( limited = true } + // Now that we've filtered the timeline, work out which state events are still + // left. Anything that appears in the filtered timeline will be removed from the + // "state" section and kept in "timeline". + delta.StateEvents = gomatrixserverlib.HeaderedReverseTopologicalOrdering( + removeDuplicates(delta.StateEvents, recentEvents), + gomatrixserverlib.TopologicalOrderByAuthEvents, + ) + if len(delta.StateEvents) > 0 { updateLatestPosition(delta.StateEvents[len(delta.StateEvents)-1].EventID()) }