From 4db708096b0797f28637da2e7ce5cdc22e604178 Mon Sep 17 00:00:00 2001 From: Steven Zou Date: Thu, 10 May 2018 15:06:28 +0800 Subject: [PATCH] Add retry for getting configs from admin server when doing job conetxt initialization --- src/jobservice/job/impl/context.go | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/src/jobservice/job/impl/context.go b/src/jobservice/job/impl/context.go index ae5fba9ff..da770fec0 100644 --- a/src/jobservice/job/impl/context.go +++ b/src/jobservice/job/impl/context.go @@ -6,7 +6,9 @@ import ( "context" "errors" "fmt" + "math" "reflect" + "time" "github.com/vmware/harbor/src/adminserver/client" "github.com/vmware/harbor/src/common" @@ -19,6 +21,10 @@ import ( "github.com/vmware/harbor/src/jobservice/logger" ) +const ( + maxRetryTimes = 5 +) + //Context ... type Context struct { //System context @@ -51,9 +57,25 @@ func NewContext(sysCtx context.Context, adminClient client.Client) *Context { //Init ... func (c *Context) Init() error { - configs, err := c.adminClient.GetCfgs() - if err != nil { - return err + var ( + counter = 0 + err error + configs map[string]interface{} + ) + + for counter == 0 || err != nil { + counter++ + configs, err = c.adminClient.GetCfgs() + if err != nil { + logger.Errorf("Job context initialization error: %s\n", err.Error()) + if counter < maxRetryTimes { + backoff := (int)(math.Pow(2, (float64)(counter))) + 2*counter + 5 + logger.Infof("Retry in %d seconds", backoff) + time.Sleep(time.Duration(backoff) * time.Second) + } else { + return fmt.Errorf("job context initialization error: %s (%d times tried)", err.Error(), counter) + } + } } db := getDBFromConfig(configs)