aboutsummaryrefslogtreecommitdiff
path: root/roomserver
diff options
context:
space:
mode:
authorNeil Alexander <neilalexander@users.noreply.github.com>2022-08-25 09:51:36 +0100
committerGitHub <noreply@github.com>2022-08-25 09:51:36 +0100
commit16156b0b0988e7b1746b2834e6357c3c90bc8465 (patch)
treeb2813ef5396092d2c30161a692f757531d6e7a1a /roomserver
parent522bd2999f605258e95565c6d648d2f7ea001ea4 (diff)
Fix 500s on `/state`, `/state_ids` when state not known (#2672)
This was due to bad error bubbling.
Diffstat (limited to 'roomserver')
-rw-r--r--roomserver/api/query.go1
-rw-r--r--roomserver/internal/query/query.go17
2 files changed, 11 insertions, 7 deletions
diff --git a/roomserver/api/query.go b/roomserver/api/query.go
index c8e6f9dc..32d63bb5 100644
--- a/roomserver/api/query.go
+++ b/roomserver/api/query.go
@@ -227,6 +227,7 @@ type QueryStateAndAuthChainResponse struct {
// Do all the previous events exist on this roomserver?
// If some of previous events do not exist this will be false and StateEvents will be empty.
PrevEventsExist bool `json:"prev_events_exist"`
+ StateKnown bool `json:"state_known"`
// The state and auth chain events that were requested.
// The lists will be in an arbitrary order.
StateEvents []*gomatrixserverlib.HeaderedEvent `json:"state_events"`
diff --git a/roomserver/internal/query/query.go b/roomserver/internal/query/query.go
index f5d8c2d4..6dce2bc3 100644
--- a/roomserver/internal/query/query.go
+++ b/roomserver/internal/query/query.go
@@ -503,10 +503,11 @@ func (r *Queryer) QueryStateAndAuthChain(
}
var stateEvents []*gomatrixserverlib.Event
- stateEvents, rejected, err := r.loadStateAtEventIDs(ctx, info, request.PrevEventIDs)
+ stateEvents, rejected, stateMissing, err := r.loadStateAtEventIDs(ctx, info, request.PrevEventIDs)
if err != nil {
return err
}
+ response.StateKnown = !stateMissing
response.IsRejected = rejected
response.PrevEventsExist = true
@@ -542,15 +543,18 @@ func (r *Queryer) QueryStateAndAuthChain(
return err
}
-func (r *Queryer) loadStateAtEventIDs(ctx context.Context, roomInfo *types.RoomInfo, eventIDs []string) ([]*gomatrixserverlib.Event, bool, error) {
+// first bool: is rejected, second bool: state missing
+func (r *Queryer) loadStateAtEventIDs(ctx context.Context, roomInfo *types.RoomInfo, eventIDs []string) ([]*gomatrixserverlib.Event, bool, bool, error) {
roomState := state.NewStateResolution(r.DB, roomInfo)
prevStates, err := r.DB.StateAtEventIDs(ctx, eventIDs)
if err != nil {
switch err.(type) {
case types.MissingEventError:
- return nil, false, nil
+ return nil, false, true, nil
+ case types.MissingStateError:
+ return nil, false, true, nil
default:
- return nil, false, err
+ return nil, false, false, err
}
}
// Currently only used on /state and /state_ids
@@ -567,12 +571,11 @@ func (r *Queryer) loadStateAtEventIDs(ctx context.Context, roomInfo *types.RoomI
ctx, prevStates,
)
if err != nil {
- return nil, rejected, err
+ return nil, rejected, false, err
}
events, err := helpers.LoadStateEvents(ctx, r.DB, stateEntries)
-
- return events, rejected, err
+ return events, rejected, false, err
}
type eventsFromIDs func(context.Context, []string) ([]types.Event, error)