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)
                })
        })
 }

Reply via email to