Skip to content

Commit

Permalink
using redis instead of ram as cache
Browse files Browse the repository at this point in the history
  • Loading branch information
ghostec committed Jun 5, 2019
1 parent 29a07e5 commit be80457
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 75 deletions.
6 changes: 3 additions & 3 deletions api/app.go
Original file line number Diff line number Diff line change
Expand Up @@ -446,7 +446,7 @@ func (a *App) loadConfigurationDefaults() {
a.Config.SetDefault("api.limitManager.keyTimeout", 1*time.Minute)
a.Config.SetDefault("jaeger.disabled", false)
a.Config.SetDefault("jaeger.samplingProbability", 1.0)
a.Config.SetDefault("addrGetter.cache.use", true)
a.Config.SetDefault("addrGetter.cache.use", false)
a.Config.SetDefault("addrGetter.cache.expirationInterval", "10m")
a.Config.SetDefault("addrGetter.cache.cleanupInterval", "30s")
a.Config.SetDefault(EnvironmentConfig, ProdEnvironment)
Expand Down Expand Up @@ -572,19 +572,19 @@ func (a *App) configureServer(showProfile bool) {

func (a *App) configureEnvironment() {
a.RoomAddrGetter = models.NewRoomAddressesFromHostPort(
a.Logger,
a.Config.GetString(Ipv6KubernetesLabelKey),
a.Config.GetBool("addrGetter.cache.use"),
a.Config.GetDuration("addrGetter.cache.expirationInterval"),
a.Config.GetDuration("addrGetter.cache.cleanupInterval"),
)
a.RoomManager = &models.GameRoom{}

if a.Config.GetString(EnvironmentConfig) == DevEnvironment {
a.RoomAddrGetter = models.NewRoomAddressesFromNodePort(
a.Logger,
a.Config.GetString(Ipv6KubernetesLabelKey),
a.Config.GetBool("addrGetter.cache.use"),
a.Config.GetDuration("addrGetter.cache.expirationInterval"),
a.Config.GetDuration("addrGetter.cache.cleanupInterval"),
)
a.RoomManager = &models.GameRoomWithService{}
a.Logger.Info("development environment")
Expand Down
5 changes: 4 additions & 1 deletion api/room_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ func (g *RoomPingHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
_, err = eventforwarder.ForwardRoomEvent(
ctx,
g.App.Forwarders,
g.App.RedisClient.Trace(ctx),
g.App.DBClient.WithContext(ctx),
kubernetesClient,
room, fmt.Sprintf("ping%s", strings.Title(payload.Status)),
Expand Down Expand Up @@ -212,6 +213,7 @@ func (g *RoomEventHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
resp, err := eventforwarder.ForwardRoomEvent(
r.Context(),
g.App.Forwarders,
g.App.RedisClient.Trace(ctx),
g.App.DBClient.WithContext(ctx),
kubernetesClient,
room,
Expand Down Expand Up @@ -293,6 +295,7 @@ func (g *RoomStatusHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
_, err = eventforwarder.ForwardRoomEvent(
ctx,
g.App.Forwarders,
g.App.RedisClient.Trace(ctx),
g.App.DBClient.WithContext(ctx),
kubernetesClient,
room, payload.Status, "",
Expand Down Expand Up @@ -337,7 +340,7 @@ func (h *RoomAddressHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {

room := models.NewRoom(params.Name, params.Scheduler)
kubernetesClient := kubernetes.TryWithContext(h.App.KubernetesClient, ctx)
roomAddresses, err := h.App.RoomAddrGetter.Get(room, kubernetesClient)
roomAddresses, err := h.App.RoomAddrGetter.Get(room, kubernetesClient, h.App.RedisClient.Trace(ctx))

if err != nil {
status := http.StatusInternalServerError
Expand Down
13 changes: 13 additions & 0 deletions api/room_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,7 @@ forwarders:
})
request, _ = http.NewRequest("PUT", url, reader)

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -146,6 +147,8 @@ forwarders:
})
request, _ = http.NewRequest("PUT", url, reader)

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -277,6 +280,7 @@ forwarders:
})
request, _ = http.NewRequest("PUT", url, reader)

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -329,6 +333,7 @@ forwarders:
})
request, _ = http.NewRequest("PUT", url, reader)

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -437,6 +442,7 @@ forwarders:
})
request, _ = http.NewRequest("PUT", url, reader)

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -591,6 +597,7 @@ forwarders:
mockPipeline.EXPECT().SRem(key, rKey)
}
mockPipeline.EXPECT().Exec()
mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -629,6 +636,7 @@ forwarders:
mockPipeline.EXPECT().SRem(key, rKey)
}
mockPipeline.EXPECT().Exec()
mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", namespace).
Do(func(scheduler *models.Scheduler, query string, modifier string) {
scheduler.YAML = yamlStr
Expand Down Expand Up @@ -906,6 +914,7 @@ forwarders:
scheduler.Game = game
})

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockEventForwarder1.EXPECT().Forward(gomock.Any(), "roomEvent", gomock.Any(), gomock.Any()).Return(
int32(500), "", errors.New("some error occurred"),
)
Expand All @@ -929,6 +938,7 @@ forwarders:
"metadata": make(map[string]interface{}),
})
request, _ = http.NewRequest("POST", url, reader)
mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(
gomock.Any(),
"SELECT * FROM schedulers WHERE name = ?",
Expand Down Expand Up @@ -961,6 +971,7 @@ forwarders:
"metadata": make(map[string]interface{}),
})
request, _ = http.NewRequest("POST", url, reader)
mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
mockDb.EXPECT().Query(
gomock.Any(),
"SELECT * FROM schedulers WHERE name = ?",
Expand Down Expand Up @@ -1025,6 +1036,7 @@ forwarders:
_, err = pod.Create(clientset)
Expect(err).NotTo(HaveOccurred())

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
url := fmt.Sprintf(
"/scheduler/%s/rooms/%s/address",
namespace,
Expand Down Expand Up @@ -1053,6 +1065,7 @@ forwarders:
_, err = pod.Create(clientset)
Expect(err).NotTo(HaveOccurred())

mockRedisTraceWrapper.EXPECT().WithContext(gomock.Any(), mockRedisClient).Return(mockRedisClient)
namespace := "unexisting-name"
url := fmt.Sprintf(
"/scheduler/%s/rooms/%s/address",
Expand Down
1 change: 0 additions & 1 deletion config/local.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,3 @@ addrGetter:
cache:
use: true
expirationInterval: 10m
cleanupInterval: 30s
6 changes: 5 additions & 1 deletion eventforwarder/eventforwarder_suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"testing"

pgmocks "github.com/topfreegames/extensions/pg/mocks"
redismocks "github.com/topfreegames/extensions/redis/mocks"
eventforwardermock "github.com/topfreegames/maestro/eventforwarder/mock"
reportermock "github.com/topfreegames/maestro/reporters/mocks"
)
Expand All @@ -36,6 +37,7 @@ var (
mockDB *pgmocks.MockDB
mockEventForwarder *eventforwardermock.MockEventForwarder
mockForwarders []*eventforwarder.Info
mockRedisClient *redismocks.MockRedisClient
mockReporter *reportermock.MockReporter
room *models.Room
clientset *fake.Clientset
Expand Down Expand Up @@ -77,6 +79,8 @@ var _ = BeforeEach(func() {
mockReporter = reportermock.NewMockReporter(mockCtrl)
r.SetReporter("mockReporter", mockReporter)

mockRedisClient = redismocks.NewMockRedisClient(mockCtrl)

clientset = fake.NewSimpleClientset()

mockDB = pgmocks.NewMockDB(mockCtrl)
Expand Down Expand Up @@ -114,5 +118,5 @@ var _ = BeforeEach(func() {
_, err = clientset.CoreV1().Nodes().Create(node)

room = models.NewRoom(roomName, schedulerName)
roomAddrGetter = models.NewRoomAddressesFromHostPort(ipv6KubernetesLabelKey, false, 0, 0)
roomAddrGetter = models.NewRoomAddressesFromHostPort(logger, ipv6KubernetesLabelKey, false, 0)
})
14 changes: 8 additions & 6 deletions eventforwarder/forward.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ import (
"time"

"github.com/sirupsen/logrus"
"github.com/topfreegames/extensions/pg/interfaces"
pginterfaces "github.com/topfreegames/extensions/pg/interfaces"
redisinterfaces "github.com/topfreegames/extensions/redis/interfaces"
"github.com/topfreegames/maestro/models"
"github.com/topfreegames/maestro/reporters"
reportersConstants "github.com/topfreegames/maestro/reporters/constants"
Expand Down Expand Up @@ -52,7 +53,8 @@ func getEnabledForwarders(
func ForwardRoomEvent(
ctx context.Context,
forwarders []*Info,
db interfaces.DB,
redis redisinterfaces.RedisClient,
db pginterfaces.DB,
kubernetesClient kubernetes.Interface,
room *models.Room,
status string,
Expand Down Expand Up @@ -113,7 +115,7 @@ func ForwardRoomEvent(
"game": cachedScheduler.Scheduler.Game,
}
if eventType != PingTimeoutEvent && eventType != OccupiedTimeoutEvent {
infos, err = room.GetRoomInfos(db, kubernetesClient, schedulerCache, cachedScheduler.Scheduler, addrGetter)
infos, err = room.GetRoomInfos(redis, db, kubernetesClient, schedulerCache, cachedScheduler.Scheduler, addrGetter)
metadata["ipv6Label"] = infos["ipv6Label"]

if err != nil {
Expand Down Expand Up @@ -146,7 +148,7 @@ func ForwardRoomEvent(
func ForwardRoomInfo(
ctx context.Context,
forwarders []*Info,
db interfaces.DB,
db pginterfaces.DB,
kubernetesClient kubernetes.Interface,
schedulerName string,
schedulerCache *models.SchedulerCache,
Expand Down Expand Up @@ -201,7 +203,7 @@ func ForwardRoomInfo(
func ForwardPlayerEvent(
ctx context.Context,
forwarders []*Info,
db interfaces.DB,
db pginterfaces.DB,
kubernetesClient kubernetes.Interface,
room *models.Room,
event string,
Expand Down Expand Up @@ -296,7 +298,7 @@ func ForwardEventToForwarders(
func reportRPCStatus(
eventWasForwarded bool,
schedulerName, forwardRoute string,
db interfaces.DB,
db pginterfaces.DB,
cache *models.SchedulerCache,
logger logrus.FieldLogger,
eventForwarderErr error,
Expand Down
8 changes: 7 additions & 1 deletion eventforwarder/forward_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ var _ = Describe("Forward", func() {
response, err := ForwardRoomEvent(
ctx,
mockForwarders,
mockRedisClient,
mockDB,
clientset,
room,
Expand Down Expand Up @@ -95,6 +96,7 @@ var _ = Describe("Forward", func() {
response, err := ForwardRoomEvent(
ctx,
mockForwarders,
mockRedisClient,
mockDB,
clientset,
room,
Expand Down Expand Up @@ -136,6 +138,7 @@ var _ = Describe("Forward", func() {
response, err = ForwardRoomEvent(
ctx,
mockForwarders,
mockRedisClient,
mockDB,
clientset,
room,
Expand All @@ -155,7 +158,7 @@ var _ = Describe("Forward", func() {
It("should report fail if event forward fails", func() {
errMsg := "event forward failed"
ctx := context.Background()
noIpv6roomAddrGetter := models.NewRoomAddressesFromHostPort("", false, 0, 0)
noIpv6roomAddrGetter := models.NewRoomAddressesFromHostPort(logger, "", false, 0)
mockEventForwarder.EXPECT().Forward(
ctx,
models.StatusReady,
Expand Down Expand Up @@ -190,6 +193,7 @@ var _ = Describe("Forward", func() {
response, err := ForwardRoomEvent(
ctx,
mockForwarders,
mockRedisClient,
mockDB,
clientset,
room,
Expand Down Expand Up @@ -229,6 +233,7 @@ var _ = Describe("Forward", func() {
_, err := ForwardRoomEvent(
ctx,
mockForwarders,
mockRedisClient,
mockDB,
clientset,
room,
Expand Down Expand Up @@ -258,6 +263,7 @@ game: game
response, err := ForwardRoomEvent(
context.Background(),
mockForwarders,
mockRedisClient,
mockDB,
clientset,
room,
Expand Down
4 changes: 2 additions & 2 deletions models/interfaces.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import (
"github.com/sirupsen/logrus"
pginterfaces "github.com/topfreegames/extensions/pg/interfaces"
redisinterfaces "github.com/topfreegames/extensions/redis/interfaces"
"k8s.io/api/core/v1"
v1 "k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
)

Expand Down Expand Up @@ -40,7 +40,7 @@ type ContainerIface interface {

// AddrGetter return IP and ports of a room
type AddrGetter interface {
Get(room *Room, kubernetesClient kubernetes.Interface) (*RoomAddresses, error)
Get(*Room, kubernetes.Interface, redisinterfaces.RedisClient) (*RoomAddresses, error)
}

// RoomManager should create and delete a game room
Expand Down
4 changes: 3 additions & 1 deletion models/room.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import (
"github.com/go-redis/redis"
pginterfaces "github.com/topfreegames/extensions/pg/interfaces"
"github.com/topfreegames/extensions/redis/interfaces"
redisinterfaces "github.com/topfreegames/extensions/redis/interfaces"
"github.com/topfreegames/maestro/reporters"
reportersConstants "github.com/topfreegames/maestro/reporters/constants"
"k8s.io/client-go/kubernetes"
Expand Down Expand Up @@ -389,6 +390,7 @@ func GetRoomMetricsRedisKey(schedulerName string, metric string) string {

// GetRoomInfos returns a map with room informations
func (r *Room) GetRoomInfos(
redis redisinterfaces.RedisClient,
db pginterfaces.DB,
kubernetesClient kubernetes.Interface,
schedulerCache *SchedulerCache,
Expand All @@ -402,7 +404,7 @@ func (r *Room) GetRoomInfos(
}
scheduler = cachedScheduler.Scheduler
}
address, err := addrGetter.Get(r, kubernetesClient)
address, err := addrGetter.Get(r, kubernetesClient, redis)
if err != nil {
return nil, err
}
Expand Down
Loading

0 comments on commit be80457

Please sign in to comment.