Skip to content

Commit

Permalink
SPopN doesn't need to be inside a transaction
Browse files Browse the repository at this point in the history
  • Loading branch information
henrod committed May 21, 2017
1 parent 6374e1f commit 957f456
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 42 deletions.
6 changes: 3 additions & 3 deletions Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@

[[dependencies]]
name = "github.com/topfreegames/extensions"
version = "v2.5.2"
version = "v2.5.3"

[[dependencies]]
name = "github.com/go-redis/redis"
Expand Down
30 changes: 14 additions & 16 deletions controller/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -274,17 +274,11 @@ func ScaleDown(logger logrus.FieldLogger, mr *models.MixedMetricsReporter, db pg
}()

l.Debug("accessing redis")
pipe := redisClient.TxPipeline()
sReady := pipe.SPopN(models.GetRoomStatusSetRedisKey(scheduler.Name, models.StatusReady), int64(amount))
_, err := pipe.Exec()
if err != nil {
l.WithError(err).Error("scale down error")
return err
}
sReady := redisClient.SPopN(models.GetRoomStatusSetRedisKey(scheduler.Name, models.StatusReady), int64(amount))

idleRooms, err := sReady.Result()
if err != nil {
l.WithError(err).Error("scale down error")
l.WithError(err).Error("scale down error, failed to retrieve ready rooms from redis")
return err
}

Expand Down Expand Up @@ -349,14 +343,6 @@ func deleteSchedulerHelper(logger logrus.FieldLogger, mr *models.MixedMetricsRep
}
}

err = mr.WithSegment(models.SegmentDelete, func() error {
return scheduler.Delete(db)
})
if err != nil {
logger.WithError(err).Error("failed to delete scheduler from database while deleting scheduler")
return err
}

configYAML, _ := models.NewConfigYAML(scheduler.YAML)
// Delete pods and wait for graceful termination before deleting the namespace
err = mr.WithSegment(models.SegmentNamespace, func() error {
Expand Down Expand Up @@ -416,6 +402,18 @@ func deleteSchedulerHelper(logger logrus.FieldLogger, mr *models.MixedMetricsRep
time.Sleep(time.Duration(1) * time.Second)
}
}

// Delete from DB must be the last operation because
// if kubernetes failed to delete service and pods, watcher will recreate
// and keep the last state
err = mr.WithSegment(models.SegmentDelete, func() error {
return scheduler.Delete(db)
})
if err != nil {
logger.WithError(err).Error("failed to delete scheduler from database while deleting scheduler")
return err
}

return nil
}

Expand Down
26 changes: 7 additions & 19 deletions controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -739,11 +739,9 @@ var _ = Describe("Controller", func() {
names, err := controller.GetServiceNames(scaleDownAmount, scheduler.Name, clientset)
Expect(err).NotTo(HaveOccurred())

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(names, nil))
mockPipeline.EXPECT().Exec()

for _, name := range names {
mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
Expand Down Expand Up @@ -792,11 +790,9 @@ var _ = Describe("Controller", func() {
names, err := controller.GetServiceNames(scaleDownAmount, scheduler.Name, clientset)
Expect(err).NotTo(HaveOccurred())

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(names, nil))
mockPipeline.EXPECT().Exec()

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
room := models.NewRoom(names[0], scheduler.Name)
Expand Down Expand Up @@ -843,11 +839,9 @@ var _ = Describe("Controller", func() {
names, err := controller.GetServiceNames(scaleDownAmount, scheduler.Name, clientset)
Expect(err).NotTo(HaveOccurred())

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(names, nil))
mockPipeline.EXPECT().Exec().Return([]redis.Cmder{}, errors.New("some error in redis"))
Return(redis.NewStringSliceResult(names, errors.New("some error in redis")))

timeoutSec = 0
err = controller.ScaleDown(logger, mr, mockDb, mockRedisClient, clientset, scheduler, scaleDownAmount, timeoutSec)
Expand Down Expand Up @@ -878,11 +872,9 @@ var _ = Describe("Controller", func() {
// ScaleDown
scaleDownAmount := 2

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(nil, errors.New("some error in redis")))
mockPipeline.EXPECT().Exec()

timeoutSec = 0
err = controller.ScaleDown(logger, mr, mockDb, mockRedisClient, clientset, scheduler, scaleDownAmount, timeoutSec)
Expand All @@ -901,11 +893,9 @@ var _ = Describe("Controller", func() {
names := []string{"non-existing-service"}
Expect(err).NotTo(HaveOccurred())

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(names, nil))
mockPipeline.EXPECT().Exec()

timeoutSec = 300
err = controller.ScaleDown(logger, mr, mockDb, mockRedisClient, clientset, scheduler, scaleDownAmount, timeoutSec)
Expand Down Expand Up @@ -938,11 +928,9 @@ var _ = Describe("Controller", func() {
names, err := controller.GetServiceNames(scaleDownAmount, scheduler.Name, clientset)
Expect(err).NotTo(HaveOccurred())

mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(names, nil))
mockPipeline.EXPECT().Exec()

for _, name := range names {
mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
Expand Down
4 changes: 1 addition & 3 deletions watcher/watcher_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -515,11 +515,9 @@ var _ = Describe("Watcher", func() {
scaleDownAmount := 2
names, err := controller.GetServiceNames(scaleDownAmount, scheduler.Name, clientset)
Expect(err).NotTo(HaveOccurred())
mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
mockPipeline.EXPECT().
mockRedisClient.EXPECT().
SPopN(models.GetRoomStatusSetRedisKey(configYaml1.Name, models.StatusReady), int64(scaleDownAmount)).
Return(redis.NewStringSliceResult(names, nil))
mockPipeline.EXPECT().Exec()
for _, name := range names {
mockRedisClient.EXPECT().TxPipeline().Return(mockPipeline)
room := models.NewRoom(name, scheduler.Name)
Expand Down

0 comments on commit 957f456

Please sign in to comment.