[bugfix] set sync context when call SyncAll func (#1265)

diff --git a/datasource/etcd/sync.go b/datasource/etcd/sync.go
index 3e52f56..c64bc9c 100644
--- a/datasource/etcd/sync.go
+++ b/datasource/etcd/sync.go
@@ -57,6 +57,7 @@
 	if !enable {
 		return nil
 	}
+	ctx = putil.SetContext(ctx, putil.CtxEnableSync, "1")
 	exist, err := etcdadpt.Exist(ctx, SyncAllKey)
 	if err != nil {
 		return err
diff --git a/datasource/etcd/sync_test.go b/datasource/etcd/sync_test.go
index 1fe4603..eed303c 100644
--- a/datasource/etcd/sync_test.go
+++ b/datasource/etcd/sync_test.go
@@ -510,4 +510,82 @@
 			assert.NoError(t, err)
 		})
 	})
+
+	t.Run("enableOnStart is true ,syncAllKey not exists and context is context.Background() will do sync", func(t *testing.T) {
+		_ = archaius.Set("sync.enableOnStart", true)
+		var accountName string
+		ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "sync-all-background", "sync-all-background"))
+		ctx = util.WithNoCache(util.SetContext(ctx, util.CtxEnableSync, "1"))
+		t.Run("create a account and delete the task should pass", func(t *testing.T) {
+			a1 := crbac.Account{
+				ID:                  "sync-create-11111-sync-all",
+				Name:                "sync-create-account1-sync-all",
+				Password:            "tnuocca-tset",
+				Roles:               []string{"admin"},
+				TokenExpirationTime: "2020-12-30",
+				CurrentPassword:     "tnuocca-tset1",
+			}
+			err := rbac.Instance().CreateAccount(ctx, &a1)
+			assert.NoError(t, err)
+			accountName = a1.Name
+			r, err := rbac.Instance().GetAccount(ctx, a1.Name)
+			assert.NoError(t, err)
+			assert.Equal(t, a1, *r)
+			listTaskReq := model.ListTaskRequest{
+				Domain:       "",
+				Project:      "",
+				ResourceType: datasource.ResourceAccount,
+			}
+			tasks, err := task.List(ctx, &listTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tasks))
+			err = task.Delete(ctx, tasks...)
+			assert.NoError(t, err)
+			tasks, err = task.List(ctx, &listTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 0, len(tasks))
+		})
+
+		t.Run("do sync will create task should pass", func(t *testing.T) {
+			err := datasource.GetSyncManager().SyncAll(context.Background())
+			assert.Nil(t, err)
+			listAccountTaskReq := model.ListTaskRequest{
+				Domain:       "",
+				Project:      "",
+				ResourceType: datasource.ResourceAccount,
+			}
+			tasks, err := task.List(ctx, &listAccountTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tasks))
+			err = task.Delete(ctx, tasks...)
+			assert.NoError(t, err)
+			tasks, err = task.List(ctx, &listAccountTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 0, len(tasks))
+		})
+		t.Run("delete account resource should pass", func(t *testing.T) {
+			_, err := rbac.Instance().DeleteAccount(ctx, []string{accountName})
+			assert.NoError(t, err)
+			listAccountTaskReq := model.ListTaskRequest{
+				Domain:       "",
+				Project:      "",
+				ResourceType: datasource.ResourceAccount,
+			}
+			tasks, err := task.List(ctx, &listAccountTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tasks))
+			err = task.Delete(ctx, tasks...)
+			assert.NoError(t, err)
+
+			tombstoneListReq := model.ListTombstoneRequest{
+				Domain:  "sync-all-background",
+				Project: "sync-all-background",
+			}
+			tombstones, err := tombstone.List(ctx, &tombstoneListReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tombstones))
+			err = tombstone.Delete(ctx, tombstones...)
+			assert.NoError(t, err)
+		})
+	})
 }
diff --git a/datasource/mongo/sync.go b/datasource/mongo/sync.go
index 8aa3d53..e1b63c9 100644
--- a/datasource/mongo/sync.go
+++ b/datasource/mongo/sync.go
@@ -48,6 +48,7 @@
 	if !enable {
 		return nil
 	}
+	ctx = putil.SetContext(ctx, putil.CtxEnableSync, "1")
 	exist, err := syncAllKeyExist(ctx)
 	if err != nil {
 		return err
diff --git a/datasource/mongo/sync_test.go b/datasource/mongo/sync_test.go
index f1499ac..99a090e 100644
--- a/datasource/mongo/sync_test.go
+++ b/datasource/mongo/sync_test.go
@@ -36,6 +36,7 @@
 	"github.com/apache/servicecomb-service-center/datasource/rbac"
 	emodel "github.com/apache/servicecomb-service-center/eventbase/model"
 	"github.com/apache/servicecomb-service-center/eventbase/service/task"
+	"github.com/apache/servicecomb-service-center/eventbase/service/tombstone"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 )
 
@@ -297,4 +298,81 @@
 		})
 	})
 
+	t.Run("enableOnStart is true ,syncAllKey not exists and context is context.Background() will do sync", func(t *testing.T) {
+		_ = archaius.Set("sync.enableOnStart", true)
+		var accountName string
+		ctx := util.WithNoCache(util.SetDomainProject(context.Background(), "sync-all-background", "sync-all-background"))
+		ctx = util.WithNoCache(util.SetContext(ctx, util.CtxEnableSync, "1"))
+		t.Run("create a account and delete the task should pass", func(t *testing.T) {
+			a1 := crbac.Account{
+				ID:                  "sync-create-11111-sync-all",
+				Name:                "sync-create-account1-sync-all",
+				Password:            "tnuocca-tset",
+				Roles:               []string{"admin"},
+				TokenExpirationTime: "2020-12-30",
+				CurrentPassword:     "tnuocca-tset1",
+			}
+			err := rbac.Instance().CreateAccount(ctx, &a1)
+			assert.NoError(t, err)
+			accountName = a1.Name
+			r, err := rbac.Instance().GetAccount(ctx, a1.Name)
+			assert.NoError(t, err)
+			assert.Equal(t, a1, *r)
+			listTaskReq := emodel.ListTaskRequest{
+				Domain:       "",
+				Project:      "",
+				ResourceType: datasource.ResourceAccount,
+			}
+			tasks, err := task.List(ctx, &listTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tasks))
+			err = task.Delete(ctx, tasks...)
+			assert.NoError(t, err)
+			tasks, err = task.List(ctx, &listTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 0, len(tasks))
+		})
+
+		t.Run("do sync will create task should pass", func(t *testing.T) {
+			err := datasource.GetSyncManager().SyncAll(context.Background())
+			assert.Nil(t, err)
+			listAccountTaskReq := emodel.ListTaskRequest{
+				Domain:       "",
+				Project:      "",
+				ResourceType: datasource.ResourceAccount,
+			}
+			tasks, err := task.List(ctx, &listAccountTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tasks))
+			err = task.Delete(ctx, tasks...)
+			assert.NoError(t, err)
+			tasks, err = task.List(ctx, &listAccountTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 0, len(tasks))
+		})
+		t.Run("delete account resource should pass", func(t *testing.T) {
+			_, err := rbac.Instance().DeleteAccount(ctx, []string{accountName})
+			assert.NoError(t, err)
+			listAccountTaskReq := emodel.ListTaskRequest{
+				Domain:       "",
+				Project:      "",
+				ResourceType: datasource.ResourceAccount,
+			}
+			tasks, err := task.List(ctx, &listAccountTaskReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tasks))
+			err = task.Delete(ctx, tasks...)
+			assert.NoError(t, err)
+
+			tombstoneListReq := emodel.ListTombstoneRequest{
+				Domain:  "sync-all-background",
+				Project: "sync-all-background",
+			}
+			tombstones, err := tombstone.List(ctx, &tombstoneListReq)
+			assert.NoError(t, err)
+			assert.Equal(t, 1, len(tombstones))
+			err = tombstone.Delete(ctx, tombstones...)
+			assert.NoError(t, err)
+		})
+	})
 }