[
https://issues.apache.org/jira/browse/SCB-929?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16621834#comment-16621834
]
ASF GitHub Bot commented on SCB-929:
------------------------------------
asifdxtreme closed pull request #446: SCB-929 Concurrent error in update
resource APIs
URL: https://github.com/apache/incubator-servicecomb-service-center/pull/446
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/instance.go b/server/service/instance.go
index f33fe486..d147cf58 100644
--- a/server/service/instance.go
+++ b/server/service/instance.go
@@ -653,9 +653,10 @@ func (s *InstanceService) UpdateStatus(ctx
context.Context, in *pb.UpdateInstanc
}, nil
}
- instance.Status = in.Status
+ copyInstanceRef := *instance
+ copyInstanceRef.Status = in.Status
- if err := serviceUtil.UpdateInstance(ctx, domainProject, instance); err
!= nil {
+ if err := serviceUtil.UpdateInstance(ctx, domainProject,
©InstanceRef); err != nil {
log.Errorf(err, "update instance status failed, %s",
updateStatusFlag)
resp := &pb.UpdateInstanceStatusResponse{
Response: pb.CreateResponseWithSCErr(err),
@@ -696,9 +697,10 @@ func (s *InstanceService) UpdateInstanceProperties(ctx
context.Context, in *pb.U
}, nil
}
- instance.Properties = in.Properties
+ copyInstanceRef := *instance
+ copyInstanceRef.Properties = in.Properties
- if err := serviceUtil.UpdateInstance(ctx, domainProject, instance); err
!= nil {
+ if err := serviceUtil.UpdateInstance(ctx, domainProject,
©InstanceRef); err != nil {
log.Errorf(err, "update instance properties failed, %s",
instanceFlag)
resp := &pb.UpdateInstancePropsResponse{
Response: pb.CreateResponseWithSCErr(err),
diff --git a/server/service/microservice.go b/server/service/microservice.go
index d93c537b..cbde70fc 100644
--- a/server/service/microservice.go
+++ b/server/service/microservice.go
@@ -518,13 +518,12 @@ func (s *MicroServiceService) UpdateProperties(ctx
context.Context, in *pb.Updat
Response: pb.CreateResponse(scerr.ErrServiceNotExists,
"service does not exist."),
}, nil
}
- service.Properties = make(map[string]string)
- for propertyKey := range in.Properties {
- service.Properties[propertyKey] = in.Properties[propertyKey]
- }
- service.ModTimestamp = strconv.FormatInt(time.Now().Unix(), 10)
- data, err := json.Marshal(service)
+ copyServiceRef := *service
+ copyServiceRef.Properties = in.Properties
+ copyServiceRef.ModTimestamp = strconv.FormatInt(time.Now().Unix(), 10)
+
+ data, err := json.Marshal(copyServiceRef)
if err != nil {
log.Errorf(err, "update service properties failed, serviceId is
%s: json marshal service failed.", in.ServiceId)
return &pb.UpdateServicePropsResponse{
diff --git a/server/service/rule.go b/server/service/rule.go
index 40ca4bdc..ad3efc70 100644
--- a/server/service/rule.go
+++ b/server/service/rule.go
@@ -199,23 +199,24 @@ func (s *MicroServiceService) UpdateRule(ctx
context.Context, in *pb.UpdateServi
}, nil
}
- oldRulePatten := rule.Pattern
- oldRuleAttr := rule.Attribute
+ copyRuleRef := *rule
+ oldRulePatten := copyRuleRef.Pattern
+ oldRuleAttr := copyRuleRef.Attribute
isChangeIndex := false
- if rule.Attribute != in.GetRule().Attribute {
+ if copyRuleRef.Attribute != in.GetRule().Attribute {
isChangeIndex = true
- rule.Attribute = in.GetRule().Attribute
+ copyRuleRef.Attribute = in.GetRule().Attribute
}
- if rule.Pattern != in.GetRule().Pattern {
+ if copyRuleRef.Pattern != in.GetRule().Pattern {
isChangeIndex = true
- rule.Pattern = in.GetRule().Pattern
+ copyRuleRef.Pattern = in.GetRule().Pattern
}
- rule.RuleType = in.GetRule().RuleType
- rule.Description = in.GetRule().Description
- rule.ModTimestamp = strconv.FormatInt(time.Now().Unix(), 10)
+ copyRuleRef.RuleType = in.GetRule().RuleType
+ copyRuleRef.Description = in.GetRule().Description
+ copyRuleRef.ModTimestamp = strconv.FormatInt(time.Now().Unix(), 10)
key := apt.GenerateServiceRuleKey(domainProject, in.ServiceId,
in.RuleId)
- data, err := json.Marshal(rule)
+ data, err := json.Marshal(copyRuleRef)
if err != nil {
log.Errorf(err, "update rule failed, serviceId is %s, ruleId is
%s: marshal service rule failed.", in.ServiceId, in.RuleId)
return &pb.UpdateServiceRuleResponse{
@@ -225,8 +226,8 @@ func (s *MicroServiceService) UpdateRule(ctx
context.Context, in *pb.UpdateServi
opts := []registry.PluginOp{}
if isChangeIndex {
//加入新的rule index
- indexKey := apt.GenerateRuleIndexKey(domainProject,
in.ServiceId, rule.Attribute, rule.Pattern)
- opts = append(opts,
registry.OpPut(registry.WithStrKey(indexKey),
registry.WithStrValue(rule.RuleId)))
+ indexKey := apt.GenerateRuleIndexKey(domainProject,
in.ServiceId, copyRuleRef.Attribute, copyRuleRef.Pattern)
+ opts = append(opts,
registry.OpPut(registry.WithStrKey(indexKey),
registry.WithStrValue(copyRuleRef.RuleId)))
//删除旧的rule index
oldIndexKey := apt.GenerateRuleIndexKey(domainProject,
in.ServiceId, oldRuleAttr, oldRulePatten)
diff --git a/server/service/tag.go b/server/service/tag.go
index aafaf82b..d07a1dbd 100644
--- a/server/service/tag.go
+++ b/server/service/tag.go
@@ -71,13 +71,13 @@ func (s *MicroServiceService) AddTags(ctx context.Context,
in *pb.AddServiceTags
Response: pb.CreateResponse(scerr.ErrInternal,
err.Error()),
}, err
}
- if len(dataTags) > 0 {
- for key, value := range addTags {
- dataTags[key] = value
+ for key, value := range dataTags {
+ if _, ok := addTags[key]; ok {
+ continue
}
- } else {
- dataTags = addTags
+ addTags[key] = value
}
+ dataTags = addTags
checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject,
in.ServiceId, dataTags)
if checkErr != nil {
@@ -130,9 +130,14 @@ func (s *MicroServiceService) UpdateTag(ctx
context.Context, in *pb.UpdateServic
Response: pb.CreateResponse(scerr.ErrTagNotExists,
"Update tag for service failed for update tags not exist, please add first."),
}, nil
}
- tags[in.Key] = in.Value
- checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject,
in.ServiceId, tags)
+ copyTags := make(map[string]string, len(tags))
+ for k, v := range tags {
+ copyTags[k] = v
+ }
+ copyTags[in.Key] = in.Value
+
+ checkErr := serviceUtil.AddTagIntoETCD(ctx, domainProject,
in.ServiceId, copyTags)
if checkErr != nil {
log.Errorf(checkErr, "update service tag failed, serviceId %s,
tag %s.", in.ServiceId, tagFlag)
resp := &pb.UpdateServiceTagResponse{
@@ -175,18 +180,23 @@ func (s *MicroServiceService) DeleteTags(ctx
context.Context, in *pb.DeleteServi
Response: pb.CreateResponse(scerr.ErrInternal,
err.Error()),
}, err
}
+
+ copyTags := make(map[string]string, len(tags))
+ for k, v := range tags {
+ copyTags[k] = v
+ }
for _, key := range in.Keys {
- if _, ok := tags[key]; !ok {
+ if _, ok := copyTags[key]; !ok {
log.Errorf(nil, "delete service tags failed, serviceId
%s, tags %v: tag %s not exist.", in.ServiceId, in.Keys, key)
return &pb.DeleteServiceTagsResponse{
Response:
pb.CreateResponse(scerr.ErrTagNotExists, "Delete tags failed for this key
"+key+" does not exist."),
}, nil
}
- delete(tags, key)
+ delete(copyTags, key)
}
// tags 可能size == 0
- data, err := json.Marshal(tags)
+ data, err := json.Marshal(copyTags)
if err != nil {
log.Errorf(err, "delete service tags failed, serviceId %s, tags
%v: marshall service tag failed.", in.ServiceId, in.Keys)
return &pb.DeleteServiceTagsResponse{
----------------------------------------------------------------
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]
> Concurrent error in update resource APIs
> ----------------------------------------
>
> Key: SCB-929
> URL: https://issues.apache.org/jira/browse/SCB-929
> 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)