[
https://issues.apache.org/jira/browse/SCB-980?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16664739#comment-16664739
]
ASF GitHub Bot commented on SCB-980:
------------------------------------
little-cui closed pull request #464: SCB-980 The dependency will be broken when
commit etcd failed
URL: https://github.com/apache/incubator-servicecomb-service-center/pull/464
This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:
As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):
diff --git a/server/service/util/dependency.go
b/server/service/util/dependency.go
index 752bb546..57b0ef31 100644
--- a/server/service/util/dependency.go
+++ b/server/service/util/dependency.go
@@ -18,8 +18,6 @@ package util
import (
"encoding/json"
- "errors"
- "github.com/apache/incubator-servicecomb-service-center/pkg/gopool"
"github.com/apache/incubator-servicecomb-service-center/pkg/log"
apt "github.com/apache/incubator-servicecomb-service-center/server/core"
"github.com/apache/incubator-servicecomb-service-center/server/core/backend"
@@ -34,27 +32,18 @@ type Dependency struct {
Consumer *pb.MicroServiceKey
ProvidersRule []*pb.MicroServiceKey
// store the parsed rules from Dependency object
- removedDependencyRuleList []*pb.MicroServiceKey
- newDependencyRuleList []*pb.MicroServiceKey
-
- err chan error
- chanNum int8
-}
-
-func (dep *Dependency) RemoveConsumerOfProviderRule() {
- dep.chanNum++
- gopool.Go(dep.removeConsumerOfProviderRule)
+ DeleteDependencyRuleList []*pb.MicroServiceKey
+ CreateDependencyRuleList []*pb.MicroServiceKey
}
-func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context) {
- opts := make([]registry.PluginOp, 0, len(dep.removedDependencyRuleList))
- for _, providerRule := range dep.removedDependencyRuleList {
+func (dep *Dependency) removeConsumerOfProviderRule(ctx context.Context)
([]registry.PluginOp, error) {
+ opts := make([]registry.PluginOp, 0, len(dep.DeleteDependencyRuleList))
+ for _, providerRule := range dep.DeleteDependencyRuleList {
proProkey :=
apt.GenerateProviderDependencyRuleKey(providerRule.Tenant, providerRule)
log.Debugf("This proProkey is %s.", proProkey)
consumerValue, err := TransferToMicroServiceDependency(ctx,
proProkey)
if err != nil {
- dep.err <- err
- return
+ return nil, err
}
for key, tmp := range consumerValue.Dependency {
if ok := equalServiceDependency(tmp, dep.Consumer); ok {
@@ -70,45 +59,30 @@ func (dep *Dependency) removeConsumerOfProviderRule(ctx
context.Context) {
}
data, err := json.Marshal(consumerValue)
if err != nil {
- log.Errorf(nil, "Marshal tmpValue failed.")
- dep.err <- err
- return
+ log.Errorf(err, "Marshal tmpValue failed.")
+ return nil, err
}
opts = append(opts, registry.OpPut(
registry.WithStrKey(proProkey),
registry.WithValue(data)))
}
- if len(opts) != 0 {
- err := backend.BatchCommit(ctx, opts)
- if err != nil {
- dep.err <- err
- return
- }
- }
- dep.err <- nil
-}
-
-func (dep *Dependency) AddConsumerOfProviderRule() {
- dep.chanNum++
- gopool.Go(dep.addConsumerOfProviderRule)
+ return opts, nil
}
-func (dep *Dependency) addConsumerOfProviderRule(ctx context.Context) {
- opts := []registry.PluginOp{}
- for _, providerRule := range dep.newDependencyRuleList {
+func (dep *Dependency) addConsumerOfProviderRule(ctx context.Context)
([]registry.PluginOp, error) {
+ opts := make([]registry.PluginOp, 0, len(dep.CreateDependencyRuleList))
+ for _, providerRule := range dep.CreateDependencyRuleList {
proProkey :=
apt.GenerateProviderDependencyRuleKey(providerRule.Tenant, providerRule)
tmpValue, err := TransferToMicroServiceDependency(ctx,
proProkey)
if err != nil {
- dep.err <- err
- return
+ return nil, err
}
tmpValue.Dependency = append(tmpValue.Dependency, dep.Consumer)
data, errMarshal := json.Marshal(tmpValue)
if errMarshal != nil {
- log.Errorf(nil, "Marshal tmpValue failed.")
- dep.err <- errors.New("Marshal tmpValue failed.")
- return
+ log.Errorf(errMarshal, "Marshal tmpValue failed.")
+ return nil, errMarshal
}
opts = append(opts, registry.OpPut(
registry.WithStrKey(proProkey),
@@ -117,27 +91,13 @@ func (dep *Dependency) addConsumerOfProviderRule(ctx
context.Context) {
break
}
}
- if len(opts) != 0 {
- err := backend.BatchCommit(ctx, opts)
- if err != nil {
- dep.err <- err
- return
- }
- }
- dep.err <- nil
+ return opts, nil
}
-func (dep *Dependency) UpdateProvidersRuleOfConsumer(ctx context.Context,
conKey string) error {
+func (dep *Dependency) updateProvidersRuleOfConsumer(_ context.Context)
([]registry.PluginOp, error) {
+ conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject,
dep.Consumer)
if len(dep.ProvidersRule) == 0 {
- _, err := backend.Registry().Do(ctx,
- registry.DEL,
- registry.WithStrKey(conKey),
- )
- if err != nil {
- log.Errorf(nil, "Upload dependency rule failed.")
- return err
- }
- return nil
+ return
[]registry.PluginOp{registry.OpDel(registry.WithStrKey(conKey))}, nil
}
dependency := &pb.MicroServiceDependency{
@@ -145,16 +105,24 @@ func (dep *Dependency) UpdateProvidersRuleOfConsumer(ctx
context.Context, conKey
}
data, err := json.Marshal(dependency)
if err != nil {
- log.Errorf(nil, "Marshal tmpValue fialed.")
+ log.Errorf(err, "Marshal tmpValue failed.")
+ return nil, err
+ }
+ return []registry.PluginOp{registry.OpPut(registry.WithStrKey(conKey),
registry.WithValue(data))}, nil
+}
+
+func (dep *Dependency) Commit(ctx context.Context) error {
+ dopts, err := dep.removeConsumerOfProviderRule(ctx)
+ if err != nil {
+ return err
+ }
+ copts, err := dep.addConsumerOfProviderRule(ctx)
+ if err != nil {
return err
}
- _, err = backend.Registry().Do(ctx,
- registry.PUT,
- registry.WithStrKey(conKey),
- registry.WithValue(data))
+ uopts, err := dep.updateProvidersRuleOfConsumer(ctx)
if err != nil {
- log.Errorf(nil, "Upload dependency rule failed.")
return err
}
- return nil
+ return backend.BatchCommit(ctx, append(append(dopts, copts...),
uopts...))
}
diff --git a/server/service/util/dependency_test.go
b/server/service/util/dependency_test.go
index 80efcc30..68b3da59 100644
--- a/server/service/util/dependency_test.go
+++ b/server/service/util/dependency_test.go
@@ -199,16 +199,14 @@ func TestUpdateServiceForAddDependency(t *testing.T) {
func TestDependency(t *testing.T) {
d := &Dependency{
- removedDependencyRuleList: []*proto.MicroServiceKey{
+ DeleteDependencyRuleList: []*proto.MicroServiceKey{
{ServiceName: "a", Version: "1.0.0"},
},
- newDependencyRuleList: []*proto.MicroServiceKey{
+ CreateDependencyRuleList: []*proto.MicroServiceKey{
{ServiceName: "a", Version: "1.0.0"},
},
}
- d.RemoveConsumerOfProviderRule()
- d.AddConsumerOfProviderRule()
- err := d.UpdateProvidersRuleOfConsumer(context.Background(), "")
+ err := d.Commit(context.Background())
if err != nil {
t.Fatalf(`Dependency_UpdateProvidersRuleOfConsumer failed`)
}
diff --git a/server/service/util/dependency_util.go
b/server/service/util/dependency_util.go
index 2c0c3b49..f35e63d4 100644
--- a/server/service/util/dependency_util.go
+++ b/server/service/util/dependency_util.go
@@ -230,7 +230,7 @@ func toString(in *pb.MicroServiceKey) string {
return apt.GenerateProviderDependencyRuleKey(in.Tenant, in)
}
-func parseAddOrUpdateRules(ctx context.Context, dep *Dependency)
(newDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList
[]*pb.MicroServiceKey) {
+func parseAddOrUpdateRules(ctx context.Context, dep *Dependency)
(createDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList
[]*pb.MicroServiceKey) {
conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject,
dep.Consumer)
oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
@@ -241,7 +241,7 @@ func parseAddOrUpdateRules(ctx context.Context, dep
*Dependency) (newDependencyR
}
deleteDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(oldProviderRules.Dependency))
- newDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(dep.ProvidersRule))
+ createDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(dep.ProvidersRule))
existDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(oldProviderRules.Dependency))
for _, tmpProviderRule := range dep.ProvidersRule {
if ok, _ :=
containServiceDependency(oldProviderRules.Dependency, tmpProviderRule); ok {
@@ -249,12 +249,12 @@ func parseAddOrUpdateRules(ctx context.Context, dep
*Dependency) (newDependencyR
}
if tmpProviderRule.ServiceName == "*" {
- newDependencyRuleList = append([]*pb.MicroServiceKey{},
tmpProviderRule)
+ createDependencyRuleList =
append([]*pb.MicroServiceKey{}, tmpProviderRule)
deleteDependencyRuleList = oldProviderRules.Dependency
break
}
- newDependencyRuleList = append(newDependencyRuleList,
tmpProviderRule)
+ createDependencyRuleList = append(createDependencyRuleList,
tmpProviderRule)
old := isNeedUpdate(oldProviderRules.Dependency,
tmpProviderRule)
if old != nil {
deleteDependencyRuleList =
append(deleteDependencyRuleList, old)
@@ -262,7 +262,7 @@ func parseAddOrUpdateRules(ctx context.Context, dep
*Dependency) (newDependencyR
}
for _, oldProviderRule := range oldProviderRules.Dependency {
if oldProviderRule.ServiceName == "*" {
- newDependencyRuleList = nil
+ createDependencyRuleList = nil
deleteDependencyRuleList = nil
return
}
@@ -271,11 +271,11 @@ func parseAddOrUpdateRules(ctx context.Context, dep
*Dependency) (newDependencyR
}
}
- dep.ProvidersRule = append(newDependencyRuleList,
existDependencyRuleList...)
+ dep.ProvidersRule = append(createDependencyRuleList,
existDependencyRuleList...)
return
}
-func parseOverrideRules(ctx context.Context, dep *Dependency)
(newDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList
[]*pb.MicroServiceKey) {
+func parseOverrideRules(ctx context.Context, dep *Dependency)
(createDependencyRuleList, existDependencyRuleList, deleteDependencyRuleList
[]*pb.MicroServiceKey) {
conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject,
dep.Consumer)
oldProviderRules, err := TransferToMicroServiceDependency(ctx, conKey)
@@ -286,7 +286,7 @@ func parseOverrideRules(ctx context.Context, dep
*Dependency) (newDependencyRule
}
deleteDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(oldProviderRules.Dependency))
- newDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(dep.ProvidersRule))
+ createDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(dep.ProvidersRule))
existDependencyRuleList = make([]*pb.MicroServiceKey, 0,
len(oldProviderRules.Dependency))
for _, oldProviderRule := range oldProviderRules.Dependency {
if ok, _ := containServiceDependency(dep.ProvidersRule,
oldProviderRule); !ok {
@@ -297,7 +297,7 @@ func parseOverrideRules(ctx context.Context, dep
*Dependency) (newDependencyRule
}
for _, tmpProviderRule := range dep.ProvidersRule {
if ok, _ := containServiceDependency(existDependencyRuleList,
tmpProviderRule); !ok {
- newDependencyRuleList = append(newDependencyRuleList,
tmpProviderRule)
+ createDependencyRuleList =
append(createDependencyRuleList, tmpProviderRule)
}
}
return
@@ -307,43 +307,22 @@ func syncDependencyRule(ctx context.Context, dep
*Dependency, filter func(contex
//更新consumer的providers的值,consumer的版本是确定的
consumerFlag := strings.Join([]string{dep.Consumer.AppId,
dep.Consumer.ServiceName, dep.Consumer.Version}, "/")
- newDependencyRuleList, existDependencyRuleList,
deleteDependencyRuleList := filter(ctx, dep)
- if len(newDependencyRuleList) == 0 && len(existDependencyRuleList) == 0
&& len(deleteDependencyRuleList) == 0 {
+ createDependencyRuleList, existDependencyRuleList,
deleteDependencyRuleList := filter(ctx, dep)
+ if len(createDependencyRuleList) == 0 && len(existDependencyRuleList)
== 0 && len(deleteDependencyRuleList) == 0 {
return nil
}
- dep.err = make(chan error, 5)
- dep.chanNum = 0
if len(deleteDependencyRuleList) != 0 {
log.Infof("Delete dependency rule remove for consumer %s, %v,
", consumerFlag, deleteDependencyRuleList)
- dep.removedDependencyRuleList = deleteDependencyRuleList
- dep.RemoveConsumerOfProviderRule()
+ dep.DeleteDependencyRuleList = deleteDependencyRuleList
}
- if len(newDependencyRuleList) != 0 {
- log.Infof("New dependency rule add for consumer %s, %v, ",
consumerFlag, newDependencyRuleList)
- dep.newDependencyRuleList = newDependencyRuleList
- dep.AddConsumerOfProviderRule()
+ if len(createDependencyRuleList) != 0 {
+ log.Infof("New dependency rule add for consumer %s, %v, ",
consumerFlag, createDependencyRuleList)
+ dep.CreateDependencyRuleList = createDependencyRuleList
}
- conKey := apt.GenerateConsumerDependencyRuleKey(dep.DomainProject,
dep.Consumer)
- err := dep.UpdateProvidersRuleOfConsumer(ctx, conKey)
- if err != nil {
- return err
- }
-
- if dep.chanNum != 0 {
- for tmpErr := range dep.err {
- dep.chanNum--
- if tmpErr != nil {
- return tmpErr
- }
- if 0 == dep.chanNum {
- close(dep.err)
- }
- }
- }
- return nil
+ return dep.Commit(ctx)
}
func AddDependencyRule(ctx context.Context, dep *Dependency) error {
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
> The dependency will be broken when commit etcd failed
> -----------------------------------------------------
>
> Key: SCB-980
> URL: https://issues.apache.org/jira/browse/SCB-980
> Project: Apache ServiceComb
> Issue Type: Bug
> Components: Service-Center
> Reporter: little-cui
> Assignee: little-cui
> Priority: Major
> Fix For: service-center-1.1.0
>
>
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)