Loading server/core_storage.go +4 −4 Original line number Diff line number Diff line Loading @@ -523,7 +523,7 @@ func storageWriteObject(ctx context.Context, logger *zap.Logger, metrics Metrics if err == sql.ErrNoRows { if object.Version != "" && object.Version != "*" { // Conditional write with a specific version but the object did not exist at all. metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } } else { Loading @@ -536,7 +536,7 @@ func storageWriteObject(ctx context.Context, logger *zap.Logger, metrics Metrics // An object existed, and it's a conditional write that either: // - Expects no object. // - Or expects a given version, but it does not match. metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } Loading Loading @@ -605,14 +605,14 @@ func storageWriteObject(ctx context.Context, logger *zap.Logger, metrics Metrics logger.Debug("Could not write storage object, exec error.", zap.Any("object", object), zap.String("query", query), zap.Error(err)) var pgErr *pgconn.PgError if errors.As(err, &pgErr) && pgErr.Code == dbErrorUniqueViolation { metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } return nil, err } if rowsAffected, err := res.RowsAffected(); rowsAffected != 1 { logger.Debug("Could not write storage object, rowsAffected error.", zap.Any("object", object), zap.String("query", query), zap.Error(err)) metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } Loading server/match_common_test.go +1 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,7 @@ func (s *testMetrics) GaugeSessions(value float64) func (s *testMetrics) GaugePresences(value float64) {} func (s *testMetrics) Matchmaker(tickets, activeTickets float64, processTime time.Duration) {} func (s *testMetrics) PresenceEvent(dequeueElapsed, processElapsed time.Duration) {} func (s *testMetrics) StorageRejectCount(tags map[string]string, delta int64) {} func (s *testMetrics) CustomCounter(name string, tags map[string]string, delta int64) {} func (s *testMetrics) CustomGauge(name string, tags map[string]string, value float64) {} func (s *testMetrics) CustomTimer(name string, tags map[string]string, value time.Duration) {} Loading server/matchmaker.go +9 −2 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ type Matchmaker interface { Resume() Stop() OnMatchedEntries(fn func(entries [][]*MatchmakerEntry)) Add(presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) Add(ctx context.Context, presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) Insert(extracts []*MatchmakerExtract) error Extract() []*MatchmakerExtract RemoveSession(sessionID, ticket string) error Loading Loading @@ -681,7 +681,7 @@ func (m *LocalMatchmaker) Process() { } } func (m *LocalMatchmaker) Add(presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) { func (m *LocalMatchmaker) Add(ctx context.Context, presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) { // Check if the matchmaker has been stopped. if m.stopped.Load() { return "", 0, runtime.ErrMatchmakerNotAvailable Loading Loading @@ -739,6 +739,13 @@ func (m *LocalMatchmaker) Add(presences []*MatchmakerPresence, sessionID, partyI m.Lock() select { case <-ctx.Done(): m.Unlock() return "", 0, nil default: } // Check if all presences are allowed to create more tickets. for _, presence := range presences { if existingTickets := m.sessionTickets[presence.SessionId]; len(existingTickets) >= m.config.GetMatchmaker().MaxTickets { Loading server/matchmaker_test.go +46 −46 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package server import ( "context" "errors" "go.uber.org/atomic" "io/ioutil" "math" "os" Loading @@ -28,6 +27,7 @@ import ( "github.com/gofrs/uuid" "github.com/heroiclabs/nakama-common/rtapi" "github.com/heroiclabs/nakama-common/runtime" "go.uber.org/atomic" "go.uber.org/zap" "google.golang.org/protobuf/encoding/protojson" ) Loading @@ -42,7 +42,7 @@ func TestMatchmakerAddOnly(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -70,7 +70,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -92,7 +92,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { t.Fatalf("error matchmaker remove: %v", err) } ticket, _, err = matchMaker.Add([]*MatchmakerPresence{ ticket, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -114,7 +114,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { t.Fatalf("error matchmaker remove: %v", err) } ticket, _, err = matchMaker.Add([]*MatchmakerPresence{ ticket, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -136,7 +136,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { t.Fatalf("error matchmaker remove: %v", err) } ticket, _, err = matchMaker.Add([]*MatchmakerPresence{ ticket, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -387,7 +387,7 @@ func TestMatchmakerAddAndRemove(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -426,7 +426,7 @@ func TestMatchmakerAddWithBasicMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -445,7 +445,7 @@ func TestMatchmakerAddWithBasicMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -537,7 +537,7 @@ func TestMatchmakerAddWithMatchOnStar(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -556,7 +556,7 @@ func TestMatchmakerAddWithMatchOnStar(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -654,7 +654,7 @@ func TestMatchmakerAddWithMatchOnRange(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -673,7 +673,7 @@ func TestMatchmakerAddWithMatchOnRange(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -771,7 +771,7 @@ func TestMatchmakerAddWithMatchOnRangeAndValue(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -796,7 +796,7 @@ func TestMatchmakerAddWithMatchOnRangeAndValue(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -897,7 +897,7 @@ func TestMatchmakerAddRemoveNotMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -944,7 +944,7 @@ func TestMatchmakerAddButNotMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -967,7 +967,7 @@ func TestMatchmakerAddButNotMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1016,7 +1016,7 @@ func TestMatchmakerAddButNotMatchOnRange(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1041,7 +1041,7 @@ func TestMatchmakerAddButNotMatchOnRange(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1092,7 +1092,7 @@ func TestMatchmakerAddButNotMatchOnRangeAndValue(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1118,7 +1118,7 @@ func TestMatchmakerAddButNotMatchOnRangeAndValue(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1167,7 +1167,7 @@ func TestMatchmakerAddMultipleAndSomeMatch(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1191,7 +1191,7 @@ func TestMatchmakerAddMultipleAndSomeMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1215,7 +1215,7 @@ func TestMatchmakerAddMultipleAndSomeMatch(t *testing.T) { } sessionID3, _ := uuid.NewV4() ticket3, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket3, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1269,7 +1269,7 @@ func TestMatchmakerAddMultipleAndSomeMatchWithBoost(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1295,7 +1295,7 @@ func TestMatchmakerAddMultipleAndSomeMatchWithBoost(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1321,7 +1321,7 @@ func TestMatchmakerAddMultipleAndSomeMatchWithBoost(t *testing.T) { } sessionID3, _ := uuid.NewV4() ticket3, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket3, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1387,7 +1387,7 @@ func TestMatchmakerAddMultipleAndSomeMatchOptionalTextAlteringScore(t *testing.T testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1411,7 +1411,7 @@ func TestMatchmakerAddMultipleAndSomeMatchOptionalTextAlteringScore(t *testing.T } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1435,7 +1435,7 @@ func TestMatchmakerAddMultipleAndSomeMatchOptionalTextAlteringScore(t *testing.T } sessionID3, _ := uuid.NewV4() ticket3, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket3, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1487,7 +1487,7 @@ func TestMatchmakerAddAndMatchAuthoritative(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1510,7 +1510,7 @@ func TestMatchmakerAddAndMatchAuthoritative(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1739,7 +1739,7 @@ func TestMatchmakerRequireMutualMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -1759,7 +1759,7 @@ func TestMatchmakerRequireMutualMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1821,7 +1821,7 @@ func TestMatchmakerRequireMutualMatchLarger(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -1843,7 +1843,7 @@ func TestMatchmakerRequireMutualMatchLarger(t *testing.T) { } sessionID2, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1865,7 +1865,7 @@ func TestMatchmakerRequireMutualMatchLarger(t *testing.T) { } sessionID3, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1923,7 +1923,7 @@ func TestMatchmakerRequireMutualMatchLargerReversed(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -1945,7 +1945,7 @@ func TestMatchmakerRequireMutualMatchLargerReversed(t *testing.T) { } sessionID2, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1967,7 +1967,7 @@ func TestMatchmakerRequireMutualMatchLargerReversed(t *testing.T) { } sessionID3, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -2126,7 +2126,7 @@ func benchmarkMatchmakerHelper(b *testing.B, activeCount, minCount, maxCount, co matchQuery, props := withQueryAndProps(matchMakerAdded) sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: sessionID.String(), SessionId: sessionID.String(), Loading Loading @@ -2181,7 +2181,7 @@ func TestMatchmakerMaxPartyTracking(t *testing.T) { createTicketFunc := func(party string) error { sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: sessionID.String(), SessionId: sessionID.String(), Loading Loading @@ -2261,7 +2261,7 @@ func TestMatchmakerMaxSessionTracking(t *testing.T) { defer cleanup() createTicketFunc := func(sessionID uuid.UUID) error { _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: sessionID.String(), SessionId: sessionID.String(), Loading Loading @@ -2354,7 +2354,7 @@ func benchmarkMatchmakerProcessTickets(ticketsMax int32, unmatchable int, minCou userID, _ := uuid.NewV4() userIDStr := userID.String() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: userIDStr, SessionId: sessionIDStr, Loading Loading @@ -2385,7 +2385,7 @@ func benchmarkMatchmakerProcessTickets(ticketsMax int32, unmatchable int, minCou userID, _ := uuid.NewV4() userIDStr := userID.String() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: userIDStr, SessionId: sessionIDStr, Loading server/metrics.go +3 −3 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ type Metrics interface { PresenceEvent(dequeueElapsed, processElapsed time.Duration) StorageOccErrorCount(tags map[string]string, delta int64) StorageRejectCount(tags map[string]string, delta int64) CustomCounter(name string, tags map[string]string, delta int64) CustomGauge(name string, tags map[string]string, value float64) Loading Loading @@ -431,12 +431,12 @@ func (m *LocalMetrics) PresenceEvent(dequeueElapsed, processElapsed time.Duratio m.PrometheusScope.Timer("presence_event_process_latency_ms").Record(processElapsed) } func (m *LocalMetrics) StorageOccErrorCount(tags map[string]string, delta int64) { func (m *LocalMetrics) StorageRejectCount(tags map[string]string, delta int64) { scope := m.PrometheusScope if len(tags) != 0 { scope = scope.Tagged(tags) } scope.Counter("storage_occ_error_count").Inc(delta) scope.Counter("storage_reject_count").Inc(delta) } // CustomCounter adds the given delta to a counter with the specified name and tags. Loading Loading
server/core_storage.go +4 −4 Original line number Diff line number Diff line Loading @@ -523,7 +523,7 @@ func storageWriteObject(ctx context.Context, logger *zap.Logger, metrics Metrics if err == sql.ErrNoRows { if object.Version != "" && object.Version != "*" { // Conditional write with a specific version but the object did not exist at all. metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } } else { Loading @@ -536,7 +536,7 @@ func storageWriteObject(ctx context.Context, logger *zap.Logger, metrics Metrics // An object existed, and it's a conditional write that either: // - Expects no object. // - Or expects a given version, but it does not match. metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } Loading Loading @@ -605,14 +605,14 @@ func storageWriteObject(ctx context.Context, logger *zap.Logger, metrics Metrics logger.Debug("Could not write storage object, exec error.", zap.Any("object", object), zap.String("query", query), zap.Error(err)) var pgErr *pgconn.PgError if errors.As(err, &pgErr) && pgErr.Code == dbErrorUniqueViolation { metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } return nil, err } if rowsAffected, err := res.RowsAffected(); rowsAffected != 1 { logger.Debug("Could not write storage object, rowsAffected error.", zap.Any("object", object), zap.String("query", query), zap.Error(err)) metrics.StorageOccErrorCount(map[string]string{"collection": object.Collection}, 1) metrics.StorageRejectCount(map[string]string{"collection": object.Collection}, 1) return nil, runtime.ErrStorageRejectedVersion } Loading
server/match_common_test.go +1 −0 Original line number Diff line number Diff line Loading @@ -183,6 +183,7 @@ func (s *testMetrics) GaugeSessions(value float64) func (s *testMetrics) GaugePresences(value float64) {} func (s *testMetrics) Matchmaker(tickets, activeTickets float64, processTime time.Duration) {} func (s *testMetrics) PresenceEvent(dequeueElapsed, processElapsed time.Duration) {} func (s *testMetrics) StorageRejectCount(tags map[string]string, delta int64) {} func (s *testMetrics) CustomCounter(name string, tags map[string]string, delta int64) {} func (s *testMetrics) CustomGauge(name string, tags map[string]string, value float64) {} func (s *testMetrics) CustomTimer(name string, tags map[string]string, value time.Duration) {} Loading
server/matchmaker.go +9 −2 Original line number Diff line number Diff line Loading @@ -173,7 +173,7 @@ type Matchmaker interface { Resume() Stop() OnMatchedEntries(fn func(entries [][]*MatchmakerEntry)) Add(presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) Add(ctx context.Context, presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) Insert(extracts []*MatchmakerExtract) error Extract() []*MatchmakerExtract RemoveSession(sessionID, ticket string) error Loading Loading @@ -681,7 +681,7 @@ func (m *LocalMatchmaker) Process() { } } func (m *LocalMatchmaker) Add(presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) { func (m *LocalMatchmaker) Add(ctx context.Context, presences []*MatchmakerPresence, sessionID, partyId, query string, minCount, maxCount, countMultiple int, stringProperties map[string]string, numericProperties map[string]float64) (string, int64, error) { // Check if the matchmaker has been stopped. if m.stopped.Load() { return "", 0, runtime.ErrMatchmakerNotAvailable Loading Loading @@ -739,6 +739,13 @@ func (m *LocalMatchmaker) Add(presences []*MatchmakerPresence, sessionID, partyI m.Lock() select { case <-ctx.Done(): m.Unlock() return "", 0, nil default: } // Check if all presences are allowed to create more tickets. for _, presence := range presences { if existingTickets := m.sessionTickets[presence.SessionId]; len(existingTickets) >= m.config.GetMatchmaker().MaxTickets { Loading
server/matchmaker_test.go +46 −46 Original line number Diff line number Diff line Loading @@ -17,7 +17,6 @@ package server import ( "context" "errors" "go.uber.org/atomic" "io/ioutil" "math" "os" Loading @@ -28,6 +27,7 @@ import ( "github.com/gofrs/uuid" "github.com/heroiclabs/nakama-common/rtapi" "github.com/heroiclabs/nakama-common/runtime" "go.uber.org/atomic" "go.uber.org/zap" "google.golang.org/protobuf/encoding/protojson" ) Loading @@ -42,7 +42,7 @@ func TestMatchmakerAddOnly(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -70,7 +70,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -92,7 +92,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { t.Fatalf("error matchmaker remove: %v", err) } ticket, _, err = matchMaker.Add([]*MatchmakerPresence{ ticket, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -114,7 +114,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { t.Fatalf("error matchmaker remove: %v", err) } ticket, _, err = matchMaker.Add([]*MatchmakerPresence{ ticket, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -136,7 +136,7 @@ func TestMatchmakerAddRemoveRepeated(t *testing.T) { t.Fatalf("error matchmaker remove: %v", err) } ticket, _, err = matchMaker.Add([]*MatchmakerPresence{ ticket, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -387,7 +387,7 @@ func TestMatchmakerAddAndRemove(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -426,7 +426,7 @@ func TestMatchmakerAddWithBasicMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -445,7 +445,7 @@ func TestMatchmakerAddWithBasicMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -537,7 +537,7 @@ func TestMatchmakerAddWithMatchOnStar(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -556,7 +556,7 @@ func TestMatchmakerAddWithMatchOnStar(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -654,7 +654,7 @@ func TestMatchmakerAddWithMatchOnRange(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -673,7 +673,7 @@ func TestMatchmakerAddWithMatchOnRange(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -771,7 +771,7 @@ func TestMatchmakerAddWithMatchOnRangeAndValue(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -796,7 +796,7 @@ func TestMatchmakerAddWithMatchOnRangeAndValue(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -897,7 +897,7 @@ func TestMatchmakerAddRemoveNotMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading Loading @@ -944,7 +944,7 @@ func TestMatchmakerAddButNotMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -967,7 +967,7 @@ func TestMatchmakerAddButNotMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1016,7 +1016,7 @@ func TestMatchmakerAddButNotMatchOnRange(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1041,7 +1041,7 @@ func TestMatchmakerAddButNotMatchOnRange(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1092,7 +1092,7 @@ func TestMatchmakerAddButNotMatchOnRangeAndValue(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1118,7 +1118,7 @@ func TestMatchmakerAddButNotMatchOnRangeAndValue(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1167,7 +1167,7 @@ func TestMatchmakerAddMultipleAndSomeMatch(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1191,7 +1191,7 @@ func TestMatchmakerAddMultipleAndSomeMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1215,7 +1215,7 @@ func TestMatchmakerAddMultipleAndSomeMatch(t *testing.T) { } sessionID3, _ := uuid.NewV4() ticket3, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket3, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1269,7 +1269,7 @@ func TestMatchmakerAddMultipleAndSomeMatchWithBoost(t *testing.T) { testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1295,7 +1295,7 @@ func TestMatchmakerAddMultipleAndSomeMatchWithBoost(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1321,7 +1321,7 @@ func TestMatchmakerAddMultipleAndSomeMatchWithBoost(t *testing.T) { } sessionID3, _ := uuid.NewV4() ticket3, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket3, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1387,7 +1387,7 @@ func TestMatchmakerAddMultipleAndSomeMatchOptionalTextAlteringScore(t *testing.T testID, _ := uuid.NewV4() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1411,7 +1411,7 @@ func TestMatchmakerAddMultipleAndSomeMatchOptionalTextAlteringScore(t *testing.T } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1435,7 +1435,7 @@ func TestMatchmakerAddMultipleAndSomeMatchOptionalTextAlteringScore(t *testing.T } sessionID3, _ := uuid.NewV4() ticket3, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket3, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1487,7 +1487,7 @@ func TestMatchmakerAddAndMatchAuthoritative(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "a", SessionId: "a", Loading @@ -1510,7 +1510,7 @@ func TestMatchmakerAddAndMatchAuthoritative(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1739,7 +1739,7 @@ func TestMatchmakerRequireMutualMatch(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() ticket1, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket1, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -1759,7 +1759,7 @@ func TestMatchmakerRequireMutualMatch(t *testing.T) { } sessionID2, _ := uuid.NewV4() ticket2, _, err := matchMaker.Add([]*MatchmakerPresence{ ticket2, _, err := matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading Loading @@ -1821,7 +1821,7 @@ func TestMatchmakerRequireMutualMatchLarger(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -1843,7 +1843,7 @@ func TestMatchmakerRequireMutualMatchLarger(t *testing.T) { } sessionID2, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1865,7 +1865,7 @@ func TestMatchmakerRequireMutualMatchLarger(t *testing.T) { } sessionID3, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -1923,7 +1923,7 @@ func TestMatchmakerRequireMutualMatchLargerReversed(t *testing.T) { defer cleanup() sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: "a", SessionId: "a", Loading @@ -1945,7 +1945,7 @@ func TestMatchmakerRequireMutualMatchLargerReversed(t *testing.T) { } sessionID2, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "b", SessionId: "b", Loading @@ -1967,7 +1967,7 @@ func TestMatchmakerRequireMutualMatchLargerReversed(t *testing.T) { } sessionID3, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: "c", SessionId: "c", Loading Loading @@ -2126,7 +2126,7 @@ func benchmarkMatchmakerHelper(b *testing.B, activeCount, minCount, maxCount, co matchQuery, props := withQueryAndProps(matchMakerAdded) sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: sessionID.String(), SessionId: sessionID.String(), Loading Loading @@ -2181,7 +2181,7 @@ func TestMatchmakerMaxPartyTracking(t *testing.T) { createTicketFunc := func(party string) error { sessionID, _ := uuid.NewV4() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: sessionID.String(), SessionId: sessionID.String(), Loading Loading @@ -2261,7 +2261,7 @@ func TestMatchmakerMaxSessionTracking(t *testing.T) { defer cleanup() createTicketFunc := func(sessionID uuid.UUID) error { _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ &MatchmakerPresence{ UserId: sessionID.String(), SessionId: sessionID.String(), Loading Loading @@ -2354,7 +2354,7 @@ func benchmarkMatchmakerProcessTickets(ticketsMax int32, unmatchable int, minCou userID, _ := uuid.NewV4() userIDStr := userID.String() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: userIDStr, SessionId: sessionIDStr, Loading Loading @@ -2385,7 +2385,7 @@ func benchmarkMatchmakerProcessTickets(ticketsMax int32, unmatchable int, minCou userID, _ := uuid.NewV4() userIDStr := userID.String() _, _, err = matchMaker.Add([]*MatchmakerPresence{ _, _, err = matchMaker.Add(context.Background(), []*MatchmakerPresence{ { UserId: userIDStr, SessionId: sessionIDStr, Loading
server/metrics.go +3 −3 Original line number Diff line number Diff line Loading @@ -60,7 +60,7 @@ type Metrics interface { PresenceEvent(dequeueElapsed, processElapsed time.Duration) StorageOccErrorCount(tags map[string]string, delta int64) StorageRejectCount(tags map[string]string, delta int64) CustomCounter(name string, tags map[string]string, delta int64) CustomGauge(name string, tags map[string]string, value float64) Loading Loading @@ -431,12 +431,12 @@ func (m *LocalMetrics) PresenceEvent(dequeueElapsed, processElapsed time.Duratio m.PrometheusScope.Timer("presence_event_process_latency_ms").Record(processElapsed) } func (m *LocalMetrics) StorageOccErrorCount(tags map[string]string, delta int64) { func (m *LocalMetrics) StorageRejectCount(tags map[string]string, delta int64) { scope := m.PrometheusScope if len(tags) != 0 { scope = scope.Tagged(tags) } scope.Counter("storage_occ_error_count").Inc(delta) scope.Counter("storage_reject_count").Inc(delta) } // CustomCounter adds the given delta to a counter with the specified name and tags. Loading