mirror of
https://github.com/matrix-org/dendrite.git
synced 2025-12-16 19:33:09 -06:00
Perform state resolution at send_join
This commit is contained in:
parent
fa928be0b8
commit
99612358a2
|
|
@ -186,6 +186,7 @@ func SendJoin(
|
||||||
PrevEventIDs: event.PrevEventIDs(),
|
PrevEventIDs: event.PrevEventIDs(),
|
||||||
AuthEventIDs: event.AuthEventIDs(),
|
AuthEventIDs: event.AuthEventIDs(),
|
||||||
RoomID: roomID,
|
RoomID: roomID,
|
||||||
|
ResolveState: true,
|
||||||
}, &stateAndAuthChainResponse)
|
}, &stateAndAuthChainResponse)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
util.GetLogger(httpReq.Context()).WithError(err).Error("query.QueryStateAndAuthChain failed")
|
util.GetLogger(httpReq.Context()).WithError(err).Error("query.QueryStateAndAuthChain failed")
|
||||||
|
|
|
||||||
|
|
@ -203,6 +203,8 @@ type QueryStateAndAuthChainRequest struct {
|
||||||
PrevEventIDs []string `json:"prev_event_ids"`
|
PrevEventIDs []string `json:"prev_event_ids"`
|
||||||
// The list of auth events for the event. Used to calculate the auth chain
|
// The list of auth events for the event. Used to calculate the auth chain
|
||||||
AuthEventIDs []string `json:"auth_event_ids"`
|
AuthEventIDs []string `json:"auth_event_ids"`
|
||||||
|
// Should state resolution be ran on the result events?
|
||||||
|
ResolveState bool `json:"resolve_state"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// QueryStateAndAuthChainResponse is a response to QueryStateAndAuthChain
|
// QueryStateAndAuthChainResponse is a response to QueryStateAndAuthChain
|
||||||
|
|
|
||||||
|
|
@ -736,6 +736,14 @@ func (r *RoomserverQueryAPI) QueryStateAndAuthChain(
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if request.ResolveState {
|
||||||
|
if stateEvents, err = state.ResolveConflictsAdhoc(
|
||||||
|
roomVersion, stateEvents, authEvents,
|
||||||
|
); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, event := range stateEvents {
|
for _, event := range stateEvents {
|
||||||
response.StateEvents = append(response.StateEvents, event.Headered(roomVersion))
|
response.StateEvents = append(response.StateEvents, event.Headered(roomVersion))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -681,6 +681,53 @@ func (v StateResolution) calculateStateAfterManyEvents(
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ResolveConflictsAdhoc(
|
||||||
|
version gomatrixserverlib.RoomVersion,
|
||||||
|
events []gomatrixserverlib.Event,
|
||||||
|
authEvents []gomatrixserverlib.Event,
|
||||||
|
) ([]gomatrixserverlib.Event, error) {
|
||||||
|
type stateKeyTuple struct {
|
||||||
|
Type string
|
||||||
|
StateKey *string
|
||||||
|
}
|
||||||
|
|
||||||
|
eventMap := make(map[stateKeyTuple][]gomatrixserverlib.Event)
|
||||||
|
var conflicted, notConflicted, resolved []gomatrixserverlib.Event
|
||||||
|
|
||||||
|
for _, event := range events {
|
||||||
|
tuple := stateKeyTuple{event.Type(), event.StateKey()}
|
||||||
|
if _, ok := eventMap[tuple]; ok {
|
||||||
|
eventMap[tuple] = append(eventMap[tuple], event)
|
||||||
|
} else {
|
||||||
|
eventMap[tuple] = []gomatrixserverlib.Event{event}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, list := range eventMap {
|
||||||
|
if len(list) > 1 {
|
||||||
|
conflicted = append(conflicted, list...)
|
||||||
|
} else {
|
||||||
|
notConflicted = append(notConflicted, list...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
stateResAlgo, err := version.StateResAlgorithm()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
switch stateResAlgo {
|
||||||
|
case gomatrixserverlib.StateResV1:
|
||||||
|
resolved = gomatrixserverlib.ResolveStateConflicts(conflicted, authEvents)
|
||||||
|
resolved = append(resolved, notConflicted...)
|
||||||
|
case gomatrixserverlib.StateResV2:
|
||||||
|
resolved = gomatrixserverlib.ResolveStateConflictsV2(conflicted, notConflicted, authEvents, authEvents)
|
||||||
|
default:
|
||||||
|
return nil, errors.New("unsupported state resolution algorithm")
|
||||||
|
}
|
||||||
|
|
||||||
|
return resolved, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (v StateResolution) resolveConflicts(
|
func (v StateResolution) resolveConflicts(
|
||||||
ctx context.Context, version gomatrixserverlib.RoomVersion,
|
ctx context.Context, version gomatrixserverlib.RoomVersion,
|
||||||
notConflicted, conflicted []types.StateEntry,
|
notConflicted, conflicted []types.StateEntry,
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue