From cc2e31e4353f00c604b05c5e099ba86de4cac1ce Mon Sep 17 00:00:00 2001 From: Henrique Rodrigues Date: Thu, 5 Oct 2017 16:53:41 -0300 Subject: [PATCH] fixed logic to scaleup --- controller/controller.go | 32 ++++++++++++-------- controller/controller_test.go | 54 ++++++++++++++++++++++++++++++++++ helm/charts/maestro/Chart.yaml | 2 +- metadata/version.go | 2 +- 4 files changed, 75 insertions(+), 15 deletions(-) diff --git a/controller/controller.go b/controller/controller.go index ae477674b..0243b80e2 100644 --- a/controller/controller.go +++ b/controller/controller.go @@ -1226,22 +1226,28 @@ func SetRoomStatus( } if status == models.StatusOccupied { - if roomsCountByStatus.Total()*configYaml.AutoScaling.Up.Trigger.Limit > 100*roomsCountByStatus.Ready { + if roomsCountByStatus.Total()*configYaml.AutoScaling.Up.Trigger.Limit < 100*roomsCountByStatus.Occupied { log.WithFields(logrus.Fields{ "readyRooms": roomsCountByStatus.Ready, }).Info("few ready rooms, scaling up") - - go ScaleUp( - logger, - mr, - db, - redisClient, - clientset, - scheduler, - configYaml.AutoScaling.Up.Delta, - config.GetInt("scaleUpTimeoutSeconds"), - false, - ) + go func() { + err := ScaleUp( + logger, + mr, + db, + redisClient, + clientset, + scheduler, + configYaml.AutoScaling.Up.Delta, + config.GetInt("scaleUpTimeoutSeconds"), + false, + ) + if err != nil { + log.WithError(err).Error(err) + return + } + log.Debug("finished scaling up") + }() return nil } } diff --git a/controller/controller_test.go b/controller/controller_test.go index a39935b1e..7d5ea22e0 100644 --- a/controller/controller_test.go +++ b/controller/controller_test.go @@ -3901,6 +3901,60 @@ cmd: time.Sleep(1 * time.Second) }) + It("should not scale up if has enough ready rooms", func() { + kCreating := models.GetRoomStatusSetRedisKey(configYaml1.Name, "creating") + kReady := models.GetRoomStatusSetRedisKey(configYaml1.Name, "ready") + kOccupied := models.GetRoomStatusSetRedisKey(configYaml1.Name, "occupied") + kTerminating := models.GetRoomStatusSetRedisKey(configYaml1.Name, "terminating") + status := "occupied" + + mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline) + mockPipeline.EXPECT().HMSet(rKey, map[string]interface{}{ + "lastPing": time.Now().Unix(), + "status": status, + }) + mockPipeline.EXPECT().ZAdd(pKey, gomock.Any()) + mockPipeline.EXPECT().Eval(models.ZaddIfNotExists, gomock.Any(), roomName) + mockPipeline.EXPECT().SAdd(oKey, rKey) + for _, key := range allStatusKeys { + if !strings.Contains(key, status) { + mockPipeline.EXPECT().SRem(key, rKey) + } + } + expC := &models.RoomsStatusCount{ + Creating: 0, + Occupied: 3, + Ready: 3, + Terminating: 0, + } + mockPipeline.EXPECT().SCard(kCreating).Return(redis.NewIntResult(int64(expC.Creating), nil)) + mockPipeline.EXPECT().SCard(kReady).Return(redis.NewIntResult(int64(expC.Ready), nil)) + mockPipeline.EXPECT().SCard(kOccupied).Return(redis.NewIntResult(int64(expC.Occupied), nil)) + mockPipeline.EXPECT().SCard(kTerminating).Return(redis.NewIntResult(int64(expC.Terminating), nil)) + mockPipeline.EXPECT().Exec() + + mockDb.EXPECT(). + Query(gomock.Any(), "SELECT * FROM schedulers WHERE name = ?", configYaml1.Name). + Do(func(scheduler *models.Scheduler, query string, modifier string) { + *scheduler = *models.NewScheduler(configYaml1.Name, configYaml1.Game, yaml1) + }) + + err := controller.SetRoomStatus( + logger, + mockRedisClient, + mockDb, + mr, + clientset, + status, + config, + room, + schedulerCache, + ) + + time.Sleep(1 * time.Second) + Expect(err).NotTo(HaveOccurred()) + }) + It("should not scale up if error on db", func() { status := "occupied" diff --git a/helm/charts/maestro/Chart.yaml b/helm/charts/maestro/Chart.yaml index a0ac86fd2..c8b562c3b 100644 --- a/helm/charts/maestro/Chart.yaml +++ b/helm/charts/maestro/Chart.yaml @@ -1,7 +1,7 @@ name: maestro home: https://github.com/topfreegames/maestro description: Maestro api and worker -version: 3.10.2 +version: 3.10.3 maintainers: - name: TFGCo email: backend@tfgco.com diff --git a/metadata/version.go b/metadata/version.go index 3a2d532ea..2231c4a1b 100644 --- a/metadata/version.go +++ b/metadata/version.go @@ -8,7 +8,7 @@ package metadata //Version of Maestro -var Version = "3.10.2" +var Version = "3.10.3" //KubeVersion is the desired Kubernetes version var KubeVersion = "v1.7.5"