diff --git a/CHANGELOG.md b/CHANGELOG.md index f66a29984f7c3c48fb0fea1e9c86895e4a82e979..9ed2292f07f9c81dd5300f0d424fb10fa1b0fae8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,6 +20,7 @@ The format is based on [keep a changelog](http://keepachangelog.com) and this pr - New runtime function to retrieve multiple user accounts by user ID. - Send notifications to admins of non-open groups when a user requests to join. - Send notifications to users when their request to join a group is accepted. +- New configuration parameter for presence event buffer size. ### Changed - Replace standard logger supplied to the Go runtime with a more powerful interface. diff --git a/main.go b/main.go index 7540f9fbaabaec862bab80d275106af23deb525f..bdef19cb5c450f1fa92ddfde77bfb91227c44863 100644 --- a/main.go +++ b/main.go @@ -98,7 +98,7 @@ func main() { // Start up server components. matchmaker := server.NewLocalMatchmaker(startupLogger, config.GetName()) sessionRegistry := server.NewSessionRegistry() - tracker := server.StartLocalTracker(logger, sessionRegistry, jsonpbMarshaler, config.GetName()) + tracker := server.StartLocalTracker(logger, config, sessionRegistry, jsonpbMarshaler) router := server.NewLocalMessageRouter(sessionRegistry, tracker, jsonpbMarshaler) leaderboardCache := server.NewLocalLeaderboardCache(logger, startupLogger, db) leaderboardRankCache := server.NewLocalLeaderboardRankCache(logger, startupLogger, db, config.GetLeaderboard(), leaderboardCache) diff --git a/server/config.go b/server/config.go index 3fbeb4f8960665fbfa65af0de179b6d7b037510a..19dd2cbfe9f05b7ac149cc3dff17ed3dd372ac41 100644 --- a/server/config.go +++ b/server/config.go @@ -43,6 +43,7 @@ type Config interface { GetSocial() *SocialConfig GetRuntime() *RuntimeConfig GetMatch() *MatchConfig + GetTracker() *TrackerConfig GetConsole() *ConsoleConfig GetLeaderboard() *LeaderboardConfig } @@ -147,6 +148,9 @@ func ParseArgs(logger *zap.Logger, args []string) Config { if mainConfig.GetMatch().DeferredQueueSize < 1 { logger.Fatal("Match deferred queue size must be >= 1", zap.Int("match.deferred_queue_size", mainConfig.GetMatch().DeferredQueueSize)) } + if mainConfig.GetTracker().EventQueueSize < 1 { + logger.Fatal("Tracker presence event queue size must be >= 1", zap.Int("tracker.event_queue_size", mainConfig.GetTracker().EventQueueSize)) + } // If the runtime path is not overridden, set it to `datadir/modules`. if mainConfig.GetRuntime().Path == "" { @@ -226,6 +230,7 @@ type config struct { Social *SocialConfig `yaml:"social" json:"social" usage:"Properties for social provider integrations."` Runtime *RuntimeConfig `yaml:"runtime" json:"runtime" usage:"Script Runtime properties."` Match *MatchConfig `yaml:"match" json:"match" usage:"Authoritative realtime match properties."` + Tracker *TrackerConfig `yaml:"tracker" json:"tracker" usage:"Presence tracker properties."` Console *ConsoleConfig `yaml:"console" json:"console" usage:"Console settings."` Leaderboard *LeaderboardConfig `yaml:"leaderboard" json:"leaderboard" usage:"Leaderboard settings."` } @@ -248,6 +253,7 @@ func NewConfig(logger *zap.Logger) *config { Social: NewSocialConfig(), Runtime: NewRuntimeConfig(), Match: NewMatchConfig(), + Tracker: NewTrackerConfig(), Console: NewConsoleConfig(), Leaderboard: NewLeaderboardConfig(), } @@ -297,6 +303,10 @@ func (c *config) GetMatch() *MatchConfig { return c.Match } +func (c *config) GetTracker() *TrackerConfig { + return c.Tracker +} + func (c *config) GetConsole() *ConsoleConfig { return c.Console } @@ -490,6 +500,18 @@ func NewMatchConfig() *MatchConfig { } } +// TrackerConfig is configuration relevant to the presence tracker. +type TrackerConfig struct { + EventQueueSize int `yaml:"event_queue_size" json:"event_queue_size" usage:"Size of the tracker presence event buffer. Increase if the server is expected to generate a large number of presence events in a short time. Default 1024."` +} + +// NewTrackerConfig creates a new TrackerConfig struct. +func NewTrackerConfig() *TrackerConfig { + return &TrackerConfig{ + EventQueueSize: 1024, + } +} + // ConsoleConfig is configuration relevant to the embedded console. type ConsoleConfig struct { Port int `yaml:"port" json:"port" usage:"The port for accepting connections for the embedded console, listening on all interfaces."` diff --git a/server/tracker.go b/server/tracker.go index 2be84dc384337a8031ef377240d95629db5a5459..816691c0f796247fc13f86ba08c4454323985abb 100644 --- a/server/tracker.go +++ b/server/tracker.go @@ -38,8 +38,6 @@ const ( StreamModeMatchAuthoritative ) -const EventsQueueSize = 512 - type PresenceID struct { Node string SessionID uuid.UUID @@ -168,13 +166,13 @@ type LocalTracker struct { presencesBySession map[uuid.UUID]map[presenceCompact]PresenceMeta } -func StartLocalTracker(logger *zap.Logger, sessionRegistry *SessionRegistry, jsonpbMarshaler *jsonpb.Marshaler, name string) Tracker { +func StartLocalTracker(logger *zap.Logger, config Config, sessionRegistry *SessionRegistry, jsonpbMarshaler *jsonpb.Marshaler) Tracker { t := &LocalTracker{ logger: logger, sessionRegistry: sessionRegistry, jsonpbMarshaler: jsonpbMarshaler, - name: name, - eventsCh: make(chan *PresenceEvent, EventsQueueSize), + name: config.GetName(), + eventsCh: make(chan *PresenceEvent, config.GetTracker().EventQueueSize), stopCh: make(chan struct{}), presencesByStream: make(map[uint8]map[PresenceStream]map[presenceCompact]PresenceMeta), presencesBySession: make(map[uuid.UUID]map[presenceCompact]PresenceMeta),