Skip to content

Commit

Permalink
Update only scheduler state when autoscaling
Browse files Browse the repository at this point in the history
  • Loading branch information
Luiz Felipe Takakura committed May 1, 2019
1 parent b66f6f9 commit 7c08fed
Show file tree
Hide file tree
Showing 7 changed files with 107 additions and 22 deletions.
14 changes: 7 additions & 7 deletions api/scheduler_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -329,7 +329,7 @@ var _ = Describe("Scheduler Handler", func() {
mockPipeline.EXPECT().SAdd(models.GetRoomStatusSetRedisKey("scheduler-name", "creating"), gomock.Any()).Times(100)
mockPipeline.EXPECT().Exec().Times(100)
MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)

mockRedisClient.EXPECT().
Get(models.GlobalPortsPoolKey).
Expand Down Expand Up @@ -424,12 +424,12 @@ autoscaling:
mockPipeline.EXPECT().Exec().Times(2)

MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)
mockRedisClient.EXPECT().Get(models.GlobalPortsPoolKey).
Return(goredis.NewStringResult(workerPortRange, nil))

MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)
mockRedisClient.EXPECT().Get(models.GlobalPortsPoolKey).
Return(goredis.NewStringResult(workerPortRange, nil))

Expand Down Expand Up @@ -587,7 +587,7 @@ autoscaling:
mockEventForwarder1.EXPECT().Forward(gomock.Any(), "schedulerEvent", gomock.Any(), gomock.Any())

MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)
mockRedisClient.EXPECT().Get(models.GlobalPortsPoolKey).
Return(goredis.NewStringResult(workerPortRange, nil)).Times(100)

Expand Down Expand Up @@ -850,7 +850,7 @@ autoscaling:
Times(configYaml1.AutoScaling.Min)

MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)

err = MockSetScallingAmount(
mockRedisClient,
Expand Down Expand Up @@ -1339,7 +1339,7 @@ autoscaling:
Times(configYaml1.AutoScaling.Min)

MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)

mockDb.EXPECT().Query(
gomock.Any(),
Expand Down Expand Up @@ -3084,7 +3084,7 @@ game: game-name
Times(configYaml1.AutoScaling.Min)

MockInsertScheduler(mockDb, nil)
MockUpdateSchedulerStatus(mockDb, nil, nil)
MockUpdateScheduler(mockDb, nil, nil)

mockRedisClient.EXPECT().Ping().AnyTimes()

Expand Down
7 changes: 7 additions & 0 deletions controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,13 @@ func CreateNamespaceIfNecessary(
})
}

// UpdateSchedulerState updates a scheduler state
func UpdateSchedulerState(logger logrus.FieldLogger, mr *models.MixedMetricsReporter, db pginterfaces.DB, scheduler *models.Scheduler) error {
return mr.WithSegment(models.SegmentUpdate, func() error {
return scheduler.UpdateState(db)
})
}

// UpdateScheduler updates a scheduler
func UpdateScheduler(logger logrus.FieldLogger, mr *models.MixedMetricsReporter, db pginterfaces.DB, scheduler *models.Scheduler) error {
return mr.WithSegment(models.SegmentUpdate, func() error {
Expand Down
43 changes: 36 additions & 7 deletions controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,7 @@ var _ = Describe("Controller", func() {
mockPipeline.EXPECT().Exec().Times(configYaml1.AutoScaling.Min)

mt.MockInsertScheduler(mockDb, nil)
mt.MockUpdateSchedulerStatus(mockDb, nil, nil)
mt.MockUpdateScheduler(mockDb, nil, nil)

mt.MockGetPortsFromPool(&configYaml1, mockRedisClient, mockPortChooser, workerPortRange, portStart, portEnd)

Expand Down Expand Up @@ -438,7 +438,7 @@ cmd:
mockPipeline.EXPECT().Exec().Times(configYaml1.AutoScaling.Min)

mt.MockInsertScheduler(mockDb, nil)
mt.MockUpdateSchedulerStatus(mockDb, nil, nil)
mt.MockUpdateScheduler(mockDb, nil, nil)

mt.MockGetPortsFromPool(&configYaml1, mockRedisClient, mockPortChooser, workerPortRange, portStart, portEnd)

Expand Down Expand Up @@ -533,7 +533,7 @@ portRange:
mockPipeline.EXPECT().Exec().Times(configYaml1.AutoScaling.Min)

mt.MockInsertScheduler(mockDb, nil)
mt.MockUpdateSchedulerStatus(mockDb, nil, nil)
mt.MockUpdateScheduler(mockDb, nil, nil)

mockDb.EXPECT().Query(gomock.Any(), `SELECT name FROM schedulers`)
mockDb.EXPECT().Query(gomock.Any(), `SELECT * FROM schedulers WHERE name IN (?)`, gomock.Any())
Expand Down Expand Up @@ -942,7 +942,7 @@ portRange:
scheduler.ID = "random-id"
})

mt.MockUpdateSchedulerStatus(mockDb, errDB, nil)
mt.MockUpdateScheduler(mockDb, errDB, nil)

err = controller.DeleteScheduler(logger, mr, mockDb, mockRedisClient, clientset, configYaml1.Name, timeoutSec)
Expect(err).To(HaveOccurred())
Expand Down Expand Up @@ -1092,7 +1092,7 @@ cmd:
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()

mt.MockUpdateSchedulerStatus(mockDb, nil, nil)
mt.MockUpdateScheduler(mockDb, nil, nil)

err := controller.UpdateScheduler(logger, mr, mockDb, scheduler)
Expect(err).NotTo(HaveOccurred())
Expand All @@ -1105,7 +1105,7 @@ cmd:
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()

mt.MockUpdateSchedulerStatus(mockDb, errDB, nil)
mt.MockUpdateScheduler(mockDb, errDB, nil)

err := controller.UpdateScheduler(logger, mr, mockDb, scheduler)
Expect(err).To(HaveOccurred())
Expand All @@ -1119,14 +1119,43 @@ cmd:
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()

mt.MockUpdateSchedulerStatus(mockDb, nil, errDB)
mt.MockUpdateScheduler(mockDb, nil, errDB)

err := controller.UpdateScheduler(logger, mr, mockDb, scheduler)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("error inserting on scheduler_versions: some error in db"))
})
})

Describe("UpdateSchedulerState", func() {
It("should succeed", func() {
name := "scheduler-name"
scheduler := models.NewScheduler(name, name, yaml1)
scheduler.State = "in-sync"
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()

mt.MockUpdateSchedulerStatus(mockDb, nil, nil)

err := controller.UpdateSchedulerState(logger, mr, mockDb, scheduler)
Expect(err).NotTo(HaveOccurred())
})

It("should fail if fail to update on schedulers table", func() {
name := "scheduler-name"
scheduler := models.NewScheduler(name, name, yaml1)
scheduler.State = "in-sync"
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()

mt.MockUpdateSchedulerStatus(mockDb, errDB, nil)

err := controller.UpdateSchedulerState(logger, mr, mockDb, scheduler)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("error updating status on schedulers: some error in db"))
})
})

Describe("List Schedulers Names", func() {
It("should get schedulers names from the database", func() {
expectedNames := []string{"scheduler1", "scheduler2", "scheduler3"}
Expand Down
13 changes: 13 additions & 0 deletions models/scheduler.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,6 +275,19 @@ func (c *Scheduler) Update(db interfaces.DB) error {
return nil
}

// UpdateState updates a scheduler status in the database
func (c *Scheduler) UpdateState(db interfaces.DB) error {
_, err := db.Query(c, `UPDATE schedulers
SET (state, state_last_changed_at, last_scale_op_at) = (?state, ?state_last_changed_at, ?last_scale_op_at)
WHERE id=?id`, c)
if err != nil {
err = fmt.Errorf("error updating status on schedulers: %s", err.Error())
return err
}

return nil
}

// UpdateVersion updates a scheduler on database
// Instead of Update, it creates a new scheduler and delete the oldest one if necessary
func (c *Scheduler) UpdateVersion(
Expand Down
6 changes: 3 additions & 3 deletions models/scheduler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ var _ = Describe("Scheduler", func() {
scheduler.State = "terminating"
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()
testing.MockUpdateSchedulerStatus(mockDb, nil, nil)
testing.MockUpdateScheduler(mockDb, nil, nil)
err := scheduler.Update(mockDb)
Expect(err).NotTo(HaveOccurred())
})
Expand All @@ -296,7 +296,7 @@ var _ = Describe("Scheduler", func() {
scheduler.State = "terminating"
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()
testing.MockUpdateSchedulerStatus(mockDb, errDB, nil)
testing.MockUpdateScheduler(mockDb, errDB, nil)
err := scheduler.Update(mockDb)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("error updating status on schedulers: db failed"))
Expand All @@ -307,7 +307,7 @@ var _ = Describe("Scheduler", func() {
scheduler.State = "terminating"
scheduler.StateLastChangedAt = time.Now().Unix()
scheduler.LastScaleOpAt = time.Now().Unix()
testing.MockUpdateSchedulerStatus(mockDb, nil, errDB)
testing.MockUpdateScheduler(mockDb, nil, errDB)
err := scheduler.Update(mockDb)
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("error inserting on scheduler_versions: db failed"))
Expand Down
44 changes: 40 additions & 4 deletions testing/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -358,7 +358,7 @@ func MockCreateScheduler(
MockGetPortsFromPool(&configYaml, mockRedisClient, mockPortChooser, workerPortRange, portStart, portEnd))

calls.Append(
MockUpdateSchedulerStatus(mockDb, nil, nil))
MockUpdateScheduler(mockDb, nil, nil))

err = controller.CreateScheduler(logger, roomManager, mr, mockDb, mockRedisClient, clientset, &configYaml, timeoutSec)
gomega.Expect(err).NotTo(gomega.HaveOccurred())
Expand Down Expand Up @@ -431,13 +431,49 @@ func MockInsertScheduler(
return calls
}

// MockUpdateSchedulerStatus mocks the scheduler update query on database
// MockUpdateSchedulerStatus mocks the scheduler update state query on database
func MockUpdateSchedulerStatus(
mockDb *pgmocks.MockDB,
errUpdate, errInsert error,
) (calls *Calls) {
calls = NewCalls()

calls.Add(
mockDb.EXPECT().
Query(gomock.Any(), `UPDATE schedulers
SET (state, state_last_changed_at, last_scale_op_at) = (?state, ?state_last_changed_at, ?last_scale_op_at)
WHERE id=?id`, gomock.Any()).
Return(pg.NewTestResult(nil, 1), errUpdate))

return calls
}

// MockUpdateSchedulerStatusAndDo mocks the scheduler update state query on database
func MockUpdateSchedulerStatusAndDo(
do func(base *models.Scheduler, query string, scheduler *models.Scheduler),
mockDb *pgmocks.MockDB,
errUpdate, errInsert error,
) (calls *Calls) {
calls = NewCalls()

calls.Add(
mockDb.EXPECT().
Query(gomock.Any(), `UPDATE schedulers
SET (state, state_last_changed_at, last_scale_op_at) = (?state, ?state_last_changed_at, ?last_scale_op_at)
WHERE id=?id`, gomock.Any()).
Return(pg.NewTestResult(nil, 1), errUpdate).
Do(do))

return calls
}

// MockUpdateScheduler mocks the scheduler update query on database
func MockUpdateScheduler(
mockDb *pgmocks.MockDB,
errUpdate, errInsert error,
) (calls *Calls) {
calls = NewCalls()

calls.Add(
mockDb.EXPECT().
Query(gomock.Any(), `UPDATE schedulers
Expand All @@ -457,8 +493,8 @@ func MockUpdateSchedulerStatus(
return calls
}

// MockUpdateSchedulerStatusAndDo mocks the scheduler update query on database
func MockUpdateSchedulerStatusAndDo(
// MockUpdateSchedulerAndDo mocks the scheduler update query on database
func MockUpdateSchedulerAndDo(
do func(base *models.Scheduler, query string, scheduler *models.Scheduler),
mockDb *pgmocks.MockDB,
errUpdate, errInsert error,
Expand Down
2 changes: 1 addition & 1 deletion watcher/watcher.go
Original file line number Diff line number Diff line change
Expand Up @@ -747,7 +747,7 @@ func (w *Watcher) AutoScale() {
}

if scaling.ChangedState {
err = controller.UpdateScheduler(logger, w.MetricsReporter, w.DB, scheduler)
err = controller.UpdateSchedulerState(logger, w.MetricsReporter, w.DB, scheduler)
if err != nil {
logger.WithError(err).Error("failed to update scheduler info")
}
Expand Down

0 comments on commit 7c08fed

Please sign in to comment.