This is an automated email from the ASF dual-hosted git repository.
tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git
The following commit(s) were added to refs/heads/master by this push:
new 512a9cc Bug: try dlock before start retirement job (#1193)
512a9cc is described below
commit 512a9cc7b4cd73ec93522ffb42d8f9dcf0ad4125
Author: little-cui <[email protected]>
AuthorDate: Thu Dec 30 09:57:39 2021 +0800
Bug: try dlock before start retirement job (#1193)
---
datasource/etcd/dlock.go | 10 +++++-----
server/job/disco/schema.go | 24 +++++++++++++++++++-----
server/job/disco/{retire.go => service.go} | 24 +++++++++++++++++++-----
server/service/dlock/dlock.go | 10 ++++++++--
server/service/dlock/dlock_test.go | 5 +++--
5 files changed, 54 insertions(+), 19 deletions(-)
diff --git a/datasource/etcd/dlock.go b/datasource/etcd/dlock.go
index 13dcf29..3182be7 100644
--- a/datasource/etcd/dlock.go
+++ b/datasource/etcd/dlock.go
@@ -18,12 +18,12 @@
package etcd
import (
+ "fmt"
"sync"
- "github.com/go-chassis/openlog"
- "github.com/little-cui/etcdadpt"
-
"github.com/apache/servicecomb-service-center/datasource/dlock"
+ "github.com/apache/servicecomb-service-center/pkg/log"
+ "github.com/little-cui/etcdadpt"
)
func init() {
@@ -60,7 +60,7 @@ func (d *DB) Renew(key string) error {
if lock, ok := d.lockMap.Load(key); ok {
err := lock.(*etcdadpt.DLock).Refresh()
if err != nil {
- openlog.Error("fail to renew key")
+ log.Error(fmt.Sprintf("fail to renew key %s", key), err)
d.lockMap.Delete(key)
}
return err
@@ -81,7 +81,7 @@ func (d *DB) Unlock(key string) error {
if lock, ok := d.lockMap.Load(key); ok {
err := lock.(*etcdadpt.DLock).Unlock()
if err != nil {
- openlog.Error("fail to unlock")
+ log.Error(fmt.Sprintf("fail to unlock %s", key), err)
}
d.lockMap.Delete(key)
return err
diff --git a/server/job/disco/schema.go b/server/job/disco/schema.go
index 9ba782f..2fa2db1 100644
--- a/server/job/disco/schema.go
+++ b/server/job/disco/schema.go
@@ -24,11 +24,14 @@ import (
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/server/config"
discosvc
"github.com/apache/servicecomb-service-center/server/service/disco"
+ "github.com/apache/servicecomb-service-center/server/service/dlock"
"github.com/robfig/cron/v3"
)
const (
defaultRetireSchemaCron = "0 2 * * *"
+ retireSchemaLockTTL = 60
+ retireSchemaLockKey = "retire-schema-job"
)
func init() {
@@ -36,11 +39,7 @@ func init() {
log.Info(fmt.Sprintf("start retire schema job, plan is %v", cronExpr))
c := cron.New()
_, err := c.AddFunc(cronExpr, func() {
- //TODO use DLock
- err := discosvc.RetireSchema(context.Background())
- if err != nil {
- log.Error("retire schema failed", err)
- }
+ retireSchema()
})
if err != nil {
log.Error("cron add func failed", err)
@@ -48,3 +47,18 @@ func init() {
}
c.Start()
}
+
+func retireSchema() {
+ err := dlock.TryLock(retireSchemaLockKey, retireSchemaLockTTL)
+ if err != nil {
+ log.Error(fmt.Sprintf("try lock %s failed",
retireSchemaLockKey), err)
+ return
+ }
+ defer dlock.Unlock(retireSchemaLockKey)
+
+ log.Info("start retire schema")
+ err = discosvc.RetireSchema(context.Background())
+ if err != nil {
+ log.Error("retire schema failed", err)
+ }
+}
diff --git a/server/job/disco/retire.go b/server/job/disco/service.go
similarity index 74%
rename from server/job/disco/retire.go
rename to server/job/disco/service.go
index fcc8f6e..a4dbef1 100644
--- a/server/job/disco/retire.go
+++ b/server/job/disco/service.go
@@ -25,12 +25,15 @@ import (
"github.com/apache/servicecomb-service-center/pkg/log"
"github.com/apache/servicecomb-service-center/server/config"
discosvc
"github.com/apache/servicecomb-service-center/server/service/disco"
+ "github.com/apache/servicecomb-service-center/server/service/dlock"
"github.com/robfig/cron/v3"
)
const (
defaultRetireMicroserviceCron = "0 1 * * *"
defaultReserveVersionCount = 3
+ retireServiceLockTTL = 60
+ retireServiceLockKey = "retire-service-job"
)
func init() {
@@ -50,11 +53,7 @@ func startRetireServiceJob() {
c := cron.New()
_, err := c.AddFunc(localPlan.Cron, func() {
- //TODO use DLock
- err := discosvc.RetireService(context.Background(), localPlan)
- if err != nil {
- log.Error("retire microservice failed", err)
- }
+ retireService(localPlan)
})
if err != nil {
log.Error("cron add func failed", err)
@@ -62,3 +61,18 @@ func startRetireServiceJob() {
}
c.Start()
}
+
+func retireService(localPlan *datasource.RetirePlan) {
+ err := dlock.TryLock(retireServiceLockKey, retireServiceLockTTL)
+ if err != nil {
+ log.Error(fmt.Sprintf("try lock %s failed",
retireServiceLockKey), err)
+ return
+ }
+ defer dlock.Unlock(retireServiceLockKey)
+
+ log.Info("start retire microservice")
+ err = discosvc.RetireService(context.Background(), localPlan)
+ if err != nil {
+ log.Error("retire microservice failed", err)
+ }
+}
diff --git a/server/service/dlock/dlock.go b/server/service/dlock/dlock.go
index ac7c914..d2bd936 100644
--- a/server/service/dlock/dlock.go
+++ b/server/service/dlock/dlock.go
@@ -19,7 +19,10 @@
package dlock
import (
+ "fmt"
+
"github.com/apache/servicecomb-service-center/datasource/dlock"
+ "github.com/apache/servicecomb-service-center/pkg/log"
)
func Lock(key string, ttl int64) error {
@@ -38,6 +41,9 @@ func IsHoldLock(key string) bool {
return dlock.Instance().IsHoldLock(key)
}
-func Unlock(key string) error {
- return dlock.Instance().Unlock(key)
+func Unlock(key string) {
+ err := dlock.Instance().Unlock(key)
+ if err != nil {
+ log.Error(fmt.Sprintf("unlock key %s failed", key), err)
+ }
}
diff --git a/server/service/dlock/dlock_test.go
b/server/service/dlock/dlock_test.go
index 625bb0c..e981722 100644
--- a/server/service/dlock/dlock_test.go
+++ b/server/service/dlock/dlock_test.go
@@ -87,8 +87,9 @@ func TestDLock(t *testing.T) {
t.Run("unlock the unlock key should pass", func(t *testing.T) {
err := dlock.Lock("unlock", 5)
assert.Nil(t, err)
- err = dlock.Unlock("unlock")
- assert.Nil(t, err)
+ dlock.Unlock("unlock")
+ lock := dlock.IsHoldLock("unlock")
+ assert.False(t, lock)
})
})
}