8e4dc6b4ae
Changes how many `PrevEventIDs` we send to other servers when backfilling, capped to 100 events. Unsure about how representative this benchmark is.. ``` goos: linux goarch: amd64 pkg: github.com/matrix-org/dendrite/roomserver/api cpu: Intel(R) Core(TM) i7-7700HQ CPU @ 2.80GHz │ old.txt │ new.txt │ │ sec/op │ sec/op vs base │ PrevEventIDs/Original1-8 264.9n ± 5% 237.4n ± 7% -10.36% (p=0.000 n=10) PrevEventIDs/Original10-8 3.101µ ± 4% 1.590µ ± 2% -48.72% (p=0.000 n=10) PrevEventIDs/Original100-8 44.32µ ± 2% 12.80µ ± 4% -71.11% (p=0.000 n=10) PrevEventIDs/Original500-8 263.835µ ± 4% 7.907µ ± 4% -97.00% (p=0.000 n=10) PrevEventIDs/Original1000-8 578.798µ ± 2% 7.620µ ± 2% -98.68% (p=0.000 n=10) PrevEventIDs/Original2000-8 1272.039µ ± 2% 8.241µ ± 9% -99.35% (p=0.000 n=10) geomean 43.81µ 3.659µ -91.65% │ old.txt │ new.txt │ │ B/op │ B/op vs base │ PrevEventIDs/Original1-8 72.00 ± 0% 48.00 ± 0% -33.33% (p=0.000 n=10) PrevEventIDs/Original10-8 1512.0 ± 0% 500.0 ± 0% -66.93% (p=0.000 n=10) PrevEventIDs/Original100-8 11.977Ki ± 0% 7.023Ki ± 0% -41.36% (p=0.000 n=10) PrevEventIDs/Original500-8 67.227Ki ± 0% 7.023Ki ± 0% -89.55% (p=0.000 n=10) PrevEventIDs/Original1000-8 163.227Ki ± 0% 7.023Ki ± 0% -95.70% (p=0.000 n=10) PrevEventIDs/Original2000-8 347.227Ki ± 0% 7.023Ki ± 0% -97.98% (p=0.000 n=10) geomean 12.96Ki 1.954Ki -84.92% │ old.txt │ new.txt │ │ allocs/op │ allocs/op vs base │ PrevEventIDs/Original1-8 2.000 ± 0% 1.000 ± 0% -50.00% (p=0.000 n=10) PrevEventIDs/Original10-8 6.000 ± 0% 2.000 ± 0% -66.67% (p=0.000 n=10) PrevEventIDs/Original100-8 9.000 ± 0% 3.000 ± 0% -66.67% (p=0.000 n=10) PrevEventIDs/Original500-8 12.000 ± 0% 3.000 ± 0% -75.00% (p=0.000 n=10) PrevEventIDs/Original1000-8 14.000 ± 0% 3.000 ± 0% -78.57% (p=0.000 n=10) PrevEventIDs/Original2000-8 16.000 ± 0% 3.000 ± 0% -81.25% (p=0.000 n=10) geomean 8.137 2.335 -71.31% ```
176 lines
5.4 KiB
Go
176 lines
5.4 KiB
Go
package api
|
|
|
|
import (
|
|
"crypto/ed25519"
|
|
"encoding/json"
|
|
"time"
|
|
|
|
"github.com/matrix-org/dendrite/roomserver/types"
|
|
"github.com/matrix-org/gomatrixserverlib"
|
|
"github.com/matrix-org/gomatrixserverlib/spec"
|
|
)
|
|
|
|
type PerformCreateRoomRequest struct {
|
|
InvitedUsers []string
|
|
RoomName string
|
|
Visibility string
|
|
Topic string
|
|
StatePreset string
|
|
CreationContent json.RawMessage
|
|
InitialState []gomatrixserverlib.FledglingEvent
|
|
RoomAliasName string
|
|
RoomVersion gomatrixserverlib.RoomVersion
|
|
PowerLevelContentOverride json.RawMessage
|
|
IsDirect bool
|
|
|
|
UserDisplayName string
|
|
UserAvatarURL string
|
|
KeyID gomatrixserverlib.KeyID
|
|
PrivateKey ed25519.PrivateKey
|
|
EventTime time.Time
|
|
}
|
|
|
|
type PerformJoinRequest struct {
|
|
RoomIDOrAlias string `json:"room_id_or_alias"`
|
|
UserID string `json:"user_id"`
|
|
IsGuest bool `json:"is_guest"`
|
|
Content map[string]interface{} `json:"content"`
|
|
ServerNames []spec.ServerName `json:"server_names"`
|
|
Unsigned map[string]interface{} `json:"unsigned"`
|
|
}
|
|
|
|
type PerformLeaveRequest struct {
|
|
RoomID string
|
|
Leaver spec.UserID
|
|
}
|
|
|
|
type PerformLeaveResponse struct {
|
|
Code int `json:"code,omitempty"`
|
|
Message interface{} `json:"message,omitempty"`
|
|
}
|
|
|
|
type InviteInput struct {
|
|
RoomID spec.RoomID
|
|
Inviter spec.UserID
|
|
Invitee spec.UserID
|
|
DisplayName string
|
|
AvatarURL string
|
|
Reason string
|
|
IsDirect bool
|
|
KeyID gomatrixserverlib.KeyID
|
|
PrivateKey ed25519.PrivateKey
|
|
EventTime time.Time
|
|
}
|
|
|
|
type PerformInviteRequest struct {
|
|
InviteInput InviteInput
|
|
InviteRoomState []gomatrixserverlib.InviteStrippedState `json:"invite_room_state"`
|
|
SendAsServer string `json:"send_as_server"`
|
|
TransactionID *TransactionID `json:"transaction_id"`
|
|
}
|
|
|
|
type PerformPeekRequest struct {
|
|
RoomIDOrAlias string `json:"room_id_or_alias"`
|
|
UserID string `json:"user_id"`
|
|
DeviceID string `json:"device_id"`
|
|
ServerNames []spec.ServerName `json:"server_names"`
|
|
}
|
|
|
|
// PerformBackfillRequest is a request to PerformBackfill.
|
|
type PerformBackfillRequest struct {
|
|
// The room to backfill
|
|
RoomID string `json:"room_id"`
|
|
// A map of backwards extremity event ID to a list of its prev_event IDs.
|
|
BackwardsExtremities map[string][]string `json:"backwards_extremities"`
|
|
// The maximum number of events to retrieve.
|
|
Limit int `json:"limit"`
|
|
// The server interested in the events.
|
|
ServerName spec.ServerName `json:"server_name"`
|
|
// Which virtual host are we doing this for?
|
|
VirtualHost spec.ServerName `json:"virtual_host"`
|
|
}
|
|
|
|
// limitPrevEventIDs is the maximum of eventIDs we
|
|
// return when calling PrevEventIDs.
|
|
const limitPrevEventIDs = 100
|
|
|
|
// PrevEventIDs returns the prev_event IDs of either 100 backwards extremities or
|
|
// len(r.BackwardsExtremities). Limited to 100, due to Synapse/Dendrite stopping after reaching
|
|
// this limit. (which sounds sane)
|
|
func (r *PerformBackfillRequest) PrevEventIDs() []string {
|
|
var uniqueIDs map[string]struct{}
|
|
|
|
// Create a unique eventID map of either 100 or len(r.BackwardsExtremities).
|
|
// 100 since Synapse/Dendrite stops after reaching 100 events.
|
|
if len(r.BackwardsExtremities) > limitPrevEventIDs {
|
|
uniqueIDs = make(map[string]struct{}, limitPrevEventIDs)
|
|
} else {
|
|
uniqueIDs = make(map[string]struct{}, len(r.BackwardsExtremities))
|
|
}
|
|
|
|
outerLoop:
|
|
for _, pes := range r.BackwardsExtremities {
|
|
for _, evID := range pes {
|
|
uniqueIDs[evID] = struct{}{}
|
|
// We found enough unique eventIDs.
|
|
if len(uniqueIDs) >= limitPrevEventIDs {
|
|
break outerLoop
|
|
}
|
|
}
|
|
}
|
|
|
|
// map -> []string
|
|
result := make([]string, len(uniqueIDs))
|
|
i := 0
|
|
for evID := range uniqueIDs {
|
|
result[i] = evID
|
|
i++
|
|
}
|
|
|
|
return result
|
|
}
|
|
|
|
// PerformBackfillResponse is a response to PerformBackfill.
|
|
type PerformBackfillResponse struct {
|
|
// Missing events, arbritrary order.
|
|
Events []*types.HeaderedEvent `json:"events"`
|
|
HistoryVisibility gomatrixserverlib.HistoryVisibility `json:"history_visibility"`
|
|
}
|
|
|
|
type PerformPublishRequest struct {
|
|
RoomID string
|
|
Visibility string
|
|
AppserviceID string
|
|
NetworkID string
|
|
}
|
|
|
|
type PerformInboundPeekRequest struct {
|
|
UserID string `json:"user_id"`
|
|
RoomID string `json:"room_id"`
|
|
PeekID string `json:"peek_id"`
|
|
ServerName spec.ServerName `json:"server_name"`
|
|
RenewalInterval int64 `json:"renewal_interval"`
|
|
}
|
|
|
|
type PerformInboundPeekResponse struct {
|
|
// Does the room exist on this roomserver?
|
|
// If the room doesn't exist this will be false and StateEvents will be empty.
|
|
RoomExists bool `json:"room_exists"`
|
|
// The room version of the room.
|
|
RoomVersion gomatrixserverlib.RoomVersion `json:"room_version"`
|
|
// The current state and auth chain events.
|
|
// The lists will be in an arbitrary order.
|
|
StateEvents []*types.HeaderedEvent `json:"state_events"`
|
|
AuthChainEvents []*types.HeaderedEvent `json:"auth_chain_events"`
|
|
// The event at which this state was captured
|
|
LatestEvent *types.HeaderedEvent `json:"latest_event"`
|
|
}
|
|
|
|
// PerformForgetRequest is a request to PerformForget
|
|
type PerformForgetRequest struct {
|
|
RoomID string `json:"room_id"`
|
|
UserID string `json:"user_id"`
|
|
}
|
|
|
|
type PerformForgetResponse struct{}
|