diff options
author | Neil Alexander <neilalexander@users.noreply.github.com> | 2022-09-13 12:52:09 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-13 12:52:09 +0100 |
commit | b05e028f7d8befc045dcb62e87d09ad462bb277c (patch) | |
tree | ac402b3a283cfacc59c1af67da87581d812fab56 /roomserver/state | |
parent | 3e55856254f6bc918f5075d7adb85d53da92c7c8 (diff) |
Tweak `LoadMembershipAtEvent` behaviour when state not known (#2716)
Previously `LoadMembershipAtEvent` would fail if the state before one of
the events was not known, i.e. because it was an outlier. This modifies
it so that it gracefully handles not knowing the state and returns no
memberships instead, so that history visibility doesn't freak out and
kill `/sync` requests dead.
Diffstat (limited to 'roomserver/state')
-rw-r--r-- | roomserver/state/state.go | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/roomserver/state/state.go b/roomserver/state/state.go index a40a2e9b..cb96d83e 100644 --- a/roomserver/state/state.go +++ b/roomserver/state/state.go @@ -18,6 +18,7 @@ package state import ( "context" + "database/sql" "fmt" "sort" "sync" @@ -134,11 +135,14 @@ func (v *StateResolution) LoadMembershipAtEvent( for i := range eventIDs { eventID := eventIDs[i] snapshotNID, err := v.db.SnapshotNIDFromEventID(ctx, eventID) - if err != nil { + if err != nil && err != sql.ErrNoRows { return nil, fmt.Errorf("LoadStateAtEvent.SnapshotNIDFromEventID failed for event %s : %w", eventID, err) } if snapshotNID == 0 { - return nil, fmt.Errorf("LoadStateAtEvent.SnapshotNIDFromEventID(%s) returned 0 NID, was this event stored?", eventID) + // If we don't know a state snapshot for this event then we can't calculate + // memberships at the time of the event, so skip over it. This means that + // it isn't guaranteed that the response map will contain every single event. + continue } snapshotNIDMap[snapshotNID] = append(snapshotNIDMap[snapshotNID], eventID) } |