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 8011c4b  Add no dependence when find shared service instances (#694)
8011c4b is described below

commit 8011c4bc83095b1f8d78b31b67a2f2847c0a6d4d
Author: humingcheng <[email protected]>
AuthorDate: Mon Sep 21 09:59:47 2020 +0800

    Add no dependence when find shared service instances (#694)
    
    * Add no dependence when find shared service instances
    
    * Do not ignore type assertion exception
---
 server/service/instance.go | 108 ++++++++++++++++++++++++++++++---------------
 1 file changed, 72 insertions(+), 36 deletions(-)

diff --git a/server/service/instance.go b/server/service/instance.go
index a4f17c0..aafa7b4 100644
--- a/server/service/instance.go
+++ b/server/service/instance.go
@@ -579,8 +579,34 @@ func (s *InstanceService) Find(ctx context.Context, in 
*pb.FindInstancesRequest)
                }, nil
        }
 
-       domainProject := util.ParseDomainProject(ctx)
+       provider := &pb.MicroServiceKey{
+               Tenant:      util.ParseTargetDomainProject(ctx),
+               Environment: in.Environment,
+               AppId:       in.AppId,
+               ServiceName: in.ServiceName,
+               Alias:       in.ServiceName,
+               Version:     in.VersionRule,
+       }
 
+       rev, ok := ctx.Value(util.CtxRequestRevision).(string)
+       if !ok {
+               err = errors.New("rev in context is not type string")
+               log.Error("", err)
+               return &pb.FindInstancesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInternal, 
err.Error()),
+               }, err
+       }
+
+       if apt.IsShared(provider) {
+               return s.findSharedServiceInstance(ctx, in, provider, rev)
+       }
+       return s.findInstance(ctx, in, provider, rev)
+}
+
+func (s *InstanceService) findInstance(ctx context.Context, in 
*pb.FindInstancesRequest,
+       provider *pb.MicroServiceKey, rev string) (*pb.FindInstancesResponse, 
error) {
+       var err error
+       domainProject := util.ParseDomainProject(ctx)
        service := &pb.MicroService{Environment: in.Environment}
        if len(in.ConsumerServiceId) > 0 {
                service, err = serviceUtil.GetService(ctx, domainProject, 
in.ConsumerServiceId)
@@ -599,51 +625,29 @@ func (s *InstanceService) Find(ctx context.Context, in 
*pb.FindInstancesRequest)
                                        fmt.Sprintf("Consumer[%s] does not 
exist.", in.ConsumerServiceId)),
                        }, nil
                }
+               provider.Environment = service.Environment
        }
 
-       var findFlag func() string
-       provider := &pb.MicroServiceKey{
-               Tenant:      util.ParseTargetDomainProject(ctx),
-               Environment: service.Environment,
-               AppId:       in.AppId,
-               ServiceName: in.ServiceName,
-               Alias:       in.ServiceName,
-               Version:     in.VersionRule,
-       }
-       if apt.IsShared(provider) {
-               // it means the shared micro-services must be the same env with 
SC.
-               provider.Environment = apt.Service.Environment
+       // provider is not a shared micro-service,
+       // only allow shared micro-service instances found in different domains.
+       ctx = util.SetTargetDomainProject(ctx, util.ParseDomain(ctx), 
util.ParseProject(ctx))
+       provider.Tenant = util.ParseTargetDomainProject(ctx)
 
-               findFlag = func() string {
-                       return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find 
shared provider[%s/%s/%s/%s]",
-                               in.ConsumerServiceId, service.Environment, 
service.AppId, service.ServiceName, service.Version,
-                               provider.Environment, provider.AppId, 
provider.ServiceName, provider.Version)
-               }
-       } else {
-               // provider is not a shared micro-service,
-               // only allow shared micro-service instances found in different 
domains.
-               ctx = util.SetTargetDomainProject(ctx, util.ParseDomain(ctx), 
util.ParseProject(ctx))
-               provider.Tenant = util.ParseTargetDomainProject(ctx)
-
-               findFlag = func() string {
-                       return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find 
provider[%s/%s/%s/%s]",
-                               in.ConsumerServiceId, service.Environment, 
service.AppId, service.ServiceName, service.Version,
-                               provider.Environment, provider.AppId, 
provider.ServiceName, provider.Version)
-               }
-       }
+       findFlag := fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find 
provider[%s/%s/%s/%s]",
+               in.ConsumerServiceId, service.Environment, service.AppId, 
service.ServiceName, service.Version,
+               provider.Environment, provider.AppId, provider.ServiceName, 
provider.Version)
 
        // cache
        var item *cache.VersionRuleCacheItem
-       rev, _ := ctx.Value(util.CtxRequestRevision).(string)
        item, err = cache.FindInstances.Get(ctx, service, provider, in.Tags, 
rev)
        if err != nil {
-               log.Errorf(err, "FindInstancesCache.Get failed, %s failed", 
findFlag())
+               log.Errorf(err, "FindInstancesCache.Get failed, %s failed", 
findFlag)
                return &pb.FindInstancesResponse{
                        Response: proto.CreateResponse(scerr.ErrInternal, 
err.Error()),
                }, err
        }
        if item == nil {
-               mes := fmt.Errorf("%s failed, provider does not exist", 
findFlag())
+               mes := fmt.Errorf("%s failed, provider does not exist", 
findFlag)
                log.Errorf(mes, "FindInstancesCache.Get failed")
                return &pb.FindInstancesResponse{
                        Response: 
proto.CreateResponse(scerr.ErrServiceNotExists, mes.Error()),
@@ -661,22 +665,54 @@ func (s *InstanceService) Find(ctx context.Context, in 
*pb.FindInstancesRequest)
                if provider != nil {
                        err = serviceUtil.AddServiceVersionRule(ctx, 
domainProject, service, provider)
                } else {
-                       mes := fmt.Errorf("%s failed, provider does not exist", 
findFlag())
+                       mes := fmt.Errorf("%s failed, provider does not exist", 
findFlag)
                        log.Errorf(mes, "AddServiceVersionRule failed")
                        return &pb.FindInstancesResponse{
                                Response: 
proto.CreateResponse(scerr.ErrServiceNotExists, mes.Error()),
                        }, nil
                }
                if err != nil {
-                       log.Errorf(err, "AddServiceVersionRule failed, %s 
failed", findFlag())
+                       log.Errorf(err, "AddServiceVersionRule failed, %s 
failed", findFlag)
                        return &pb.FindInstancesResponse{
                                Response: 
proto.CreateResponse(scerr.ErrInternal, err.Error()),
                        }, err
                }
        }
 
+       return s.genFindResult(ctx, rev, item)
+}
+
+func (s *InstanceService) findSharedServiceInstance(ctx context.Context, in 
*pb.FindInstancesRequest,
+       provider *pb.MicroServiceKey, rev string) (*pb.FindInstancesResponse, 
error) {
+       var err error
+       service := &pb.MicroService{Environment: in.Environment}
+       // it means the shared micro-services must be the same env with SC.
+       provider.Environment = apt.Service.Environment
+       findFlag := fmt.Sprintf("find shared provider[%s/%s/%s/%s]", 
provider.Environment, provider.AppId, provider.ServiceName, provider.Version)
+
+       // cache
+       var item *cache.VersionRuleCacheItem
+       item, err = cache.FindInstances.Get(ctx, service, provider, in.Tags, 
rev)
+       if err != nil {
+               log.Errorf(err, "FindInstancesCache.Get failed, %s failed", 
findFlag)
+               return &pb.FindInstancesResponse{
+                       Response: proto.CreateResponse(scerr.ErrInternal, 
err.Error()),
+               }, err
+       }
+       if item == nil {
+               mes := fmt.Errorf("%s failed, provider does not exist", 
findFlag)
+               log.Errorf(mes, "FindInstancesCache.Get failed")
+               return &pb.FindInstancesResponse{
+                       Response: 
proto.CreateResponse(scerr.ErrServiceNotExists, mes.Error()),
+               }, nil
+       }
+
+       return s.genFindResult(ctx, rev, item)
+}
+
+func (s *InstanceService) genFindResult(ctx context.Context, oldRev string, 
item *cache.VersionRuleCacheItem) (*pb.FindInstancesResponse, error) {
        instances := item.Instances
-       if rev == item.Rev {
+       if oldRev == item.Rev {
                instances = nil // for gRPC
        }
        // TODO support gRPC output context

Reply via email to