Skip to content

Commit 9f5070a

Browse files
authored
Ensure the create event is cached prior to sorting (#459)
Else calling `ReverseTopologicalOrdering` will fail on v12 rooms.
1 parent 7a73c05 commit 9f5070a

File tree

2 files changed

+23
-2
lines changed

2 files changed

+23
-2
lines changed

performinvite.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,9 @@ func PerformInvite(ctx context.Context, input PerformInviteInput, fedClient Fede
112112
if len(stateNeeded.Tuples()) == 0 {
113113
return nil, spec.InternalServerError{}
114114
}
115+
if stateNeeded.Create && verImpl.DomainlessRoomIDs() {
116+
stateNeeded.Create = false
117+
}
115118

116119
latestEvents, err := input.EventQuerier(ctx, input.RoomID, stateNeeded.Tuples())
117120
if err != nil {

stateresolutionv2.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,17 +391,26 @@ func ResolveStateConflictsV2New(
391391
// using Kahn's algorithm in order to topologically order them. The
392392
// result array of events will be sorted so that "earlier" events appear
393393
// first.
394+
// FIXME: this function does not sort correctly because it doesn't lookup PL events
395+
// correctly, meaning it will sort incorrectly for PL tiebreaks.
394396
func ReverseTopologicalOrdering(input []PDU, order TopologicalOrder) []PDU {
395-
r := stateResolverV2{}
397+
r := stateResolverV2{
398+
resolvedCreate: getCreateEvent(input),
399+
}
396400
return r.reverseTopologicalOrdering(input, order)
397401
}
398402

403+
// TODO: Remove this function. Use ReverseTopologicalOrdering.
399404
// HeaderedReverseTopologicalOrdering takes a set of input events and sorts
400405
// them using Kahn's algorithm in order to topologically order them. The
401406
// result array of events will be sorted so that "earlier" events appear
402407
// first.
408+
// FIXME: this function does not sort correctly because it doesn't lookup PL events
409+
// correctly, meaning it will sort incorrectly for PL tiebreaks.
403410
func HeaderedReverseTopologicalOrdering(events []PDU, order TopologicalOrder) []PDU {
404-
r := stateResolverV2{}
411+
r := stateResolverV2{
412+
resolvedCreate: getCreateEvent(events),
413+
}
405414
input := make([]PDU, len(events))
406415
for i := range events {
407416
unwrapped := events[i]
@@ -414,6 +423,15 @@ func HeaderedReverseTopologicalOrdering(events []PDU, order TopologicalOrder) []
414423
return result
415424
}
416425

426+
func getCreateEvent(input []PDU) PDU {
427+
for _, ev := range input {
428+
if ev.Type() == spec.MRoomCreate && ev.StateKeyEquals("") {
429+
return ev
430+
}
431+
}
432+
return nil
433+
}
434+
417435
// isControlEvent returns true if the event meets the criteria for being classed
418436
// as a "control" event for reverse topological sorting. If not then the event
419437
// will be mainline sorted.

0 commit comments

Comments
 (0)