aboutsummaryrefslogtreecommitdiff
path: root/roomserver/internal/input
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2020-10-05 17:47:08 +0100
committerGitHub <noreply@github.com>2020-10-05 17:47:08 +0100
commit2e71d2708f7c922dcb6361c8a49022470b8b6e33 (patch)
tree7b8241f2bd45f18fc2eee8efd1cb6561553e0601 /roomserver/internal/input
parent4e6b7f726d6741e0faa77ad0c8ba373ea58ef3f8 (diff)
Resolve state after event against current room state when determining latest state changes (#1479)
* Resolve state after event against current room state when determining latest state changes * Update sytest-whitelist * Update sytest-whitelist, blacklist
Diffstat (limited to 'roomserver/internal/input')
-rw-r--r--roomserver/internal/input/input_latest_events.go23
1 files changed, 20 insertions, 3 deletions
diff --git a/roomserver/internal/input/input_latest_events.go b/roomserver/internal/input/input_latest_events.go
index 5c2a1de6..2e9f3b4e 100644
--- a/roomserver/internal/input/input_latest_events.go
+++ b/roomserver/internal/input/input_latest_events.go
@@ -215,10 +215,27 @@ func (u *latestEventsUpdater) latestState() error {
var err error
roomState := state.NewStateResolution(u.api.DB, *u.roomInfo)
- // Get a list of the current latest events.
- latestStateAtEvents := make([]types.StateAtEvent, len(u.latest))
+ // Get a list of the current room state events if available.
+ var currentState []types.StateEntry
+ if u.roomInfo.StateSnapshotNID != 0 {
+ currentState, _ = roomState.LoadStateAtSnapshot(u.ctx, u.roomInfo.StateSnapshotNID)
+ }
+
+ // Get a list of the current latest events. This will include both
+ // the current room state and the latest events after the input event.
+ // The idea is that we will perform state resolution on this set and
+ // any conflicting events will be resolved properly.
+ latestStateAtEvents := make([]types.StateAtEvent, len(u.latest)+len(currentState))
+ offset := 0
+ for i := range currentState {
+ latestStateAtEvents[i] = types.StateAtEvent{
+ BeforeStateSnapshotNID: u.roomInfo.StateSnapshotNID,
+ StateEntry: currentState[i],
+ }
+ offset++
+ }
for i := range u.latest {
- latestStateAtEvents[i] = u.latest[i].StateAtEvent
+ latestStateAtEvents[offset+i] = u.latest[i].StateAtEvent
}
// Takes the NIDs of the latest events and creates a state snapshot