fedsender: de-duplicate without sorting server names
MODIFY
federationsender/api/perform.go
federationsender/api/perform.go
@@ -46,6 +46,7 @@ func (h *httpFederationSenderInternalAPI) PerformDirectoryLookup(
type PerformJoinRequest struct {
RoomID string `json:"room_id"`
UserID string `json:"user_id"`
+ // The sorted list of servers to try. Servers will be tried sequentially, after de-duplication.
ServerNames types.ServerNames `json:"server_names"`
Content map[string]interface{} `json:"content"`
}

MODIFY
federationsender/internal/perform.go
federationsender/internal/perform.go
@@ -46,8 +46,19 @@ func (r *FederationSenderInternalAPI) PerformJoin(
supportedVersions = append(supportedVersions, version)
}
- // Deduplicate the server names we were provided.
- util.SortAndUnique(request.ServerNames)
+ // Deduplicate the server names we were provided but keep the ordering
+ // as this encodes useful information about which servers are most likely
+ // to respond.
+ seenSet := make(map[gomatrixserverlib.ServerName]bool)
+ var uniqueList []gomatrixserverlib.ServerName
+ for _, srv := range request.ServerNames {
+ if seenSet[srv] {
+ continue
+ }
+ seenSet[srv] = true
+ uniqueList = append(uniqueList, srv)
+ }
+ request.ServerNames = uniqueList
// Try each server that we were provided until we land on one that
// successfully completes the make-join send-join dance.

fedsender: de-duplicate without sorting server names (#1073)