This is an automated email from the ASF dual-hosted git repository.

littlecui pushed a commit to branch master
in repository 
https://gitbox.apache.org/repos/asf/incubator-servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 5a55d25  SCB-135 Statistic data is wrong in govern api when different 
domains … (#230)
5a55d25 is described below

commit 5a55d25c041b5fc62190c8216b4f744a3f7bb3e3
Author: little-cui <[email protected]>
AuthorDate: Wed Dec 27 17:54:09 2017 +0800

    SCB-135 Statistic data is wrong in govern api when different domains … 
(#230)
    
    * SCB-135 Statistic data is wrong in govern api when different domains has 
the same prefix.
    
    * SCB-129 Do not enable compact mechanism when the interval is empty.
    
    (cherry picked from commit 0428b43)
    
    * SCB-129 Optimize compaction log print.
    
    * SCB-127 only allow shared micro-service instances found in diff domains.
    
    * SCB-127 Optimize v4 context handler.
    
    * Fix the UT failure.
    
    * Optimize etcd.go
    
    * Optimize etcd.go
    
    (cherry picked from commit 19bfb0d)
---
 server/core/info.go                                |  2 +-
 server/govern/service.go                           |  4 ++--
 server/handler/context/context.go                  |  2 --
 server/handler/context/v3.go                       | 18 +++++-----------
 server/handler/context/v4.go                       | 25 ++++++++--------------
 .../infra/registry/embededetcd/embededetcd.go      |  7 ++----
 server/plugin/infra/registry/etcd/etcd.go          | 19 ++++++----------
 server/rest/controller/v4/instance_controller.go   |  9 ++++++++
 server/server.go                                   |  6 +++---
 server/service/instances.go                        |  9 +++++---
 server/service/microservices.go                    |  2 +-
 server/service/util/rule_util.go                   |  3 +--
 12 files changed, 46 insertions(+), 60 deletions(-)

diff --git a/server/core/info.go b/server/core/info.go
index 314c572..74edc1b 100644
--- a/server/core/info.go
+++ b/server/core/info.go
@@ -61,7 +61,7 @@ func newInfo() *pb.ServerInformation {
 
                        AutoSyncInterval:  
beego.AppConfig.DefaultString("auto_sync_interval", "30s"),
                        CompactIndexDelta: 
beego.AppConfig.DefaultInt64("compact_index_delta", 100),
-                       CompactInterval:   
beego.AppConfig.DefaultString("compact_interval", "12h"),
+                       CompactInterval:   
beego.AppConfig.String("compact_interval"),
 
                        LoggerName:     
beego.AppConfig.String("component_name"),
                        LogRotateSize:  maxLogFileSize,
diff --git a/server/govern/service.go b/server/govern/service.go
index eea638f..e059aab 100644
--- a/server/govern/service.go
+++ b/server/govern/service.go
@@ -368,7 +368,7 @@ func statistics(ctx context.Context) (*pb.Statistics, 
error) {
        opts := serviceUtil.FromContext(ctx)
 
        // services
-       key := apt.GetServiceIndexRootKey(domainProject)
+       key := apt.GetServiceIndexRootKey(domainProject) + "/"
        svcOpts := append(opts,
                registry.WithStrKey(key),
                registry.WithPrefix(),
@@ -408,7 +408,7 @@ func statistics(ctx context.Context) (*pb.Statistics, 
error) {
        result.Apps.Count = int64(len(app))
 
        // instance
-       key = apt.GetInstanceRootKey(domainProject)
+       key = apt.GetInstanceRootKey(domainProject) + "/"
        instOpts := append(opts,
                registry.WithStrKey(key),
                registry.WithPrefix(),
diff --git a/server/handler/context/context.go 
b/server/handler/context/context.go
index 85e52b9..7fd42fa 100644
--- a/server/handler/context/context.go
+++ b/server/handler/context/context.go
@@ -40,8 +40,6 @@ func (c *ContextHandler) Handle(i *chain.Invocation) {
        case v3.IsMatch(r):
                err = v3.Do(r)
        case v4.IsMatch(r):
-               util.SetRequestContext(r, "target-domain", "default")
-               util.SetRequestContext(r, "target-project", "default")
                err = v4.Do(r)
        }
 
diff --git a/server/handler/context/v3.go b/server/handler/context/v3.go
index d782684..2be4e91 100644
--- a/server/handler/context/v3.go
+++ b/server/handler/context/v3.go
@@ -34,13 +34,12 @@ func (v *v3Context) IsMatch(r *http.Request) bool {
 func (v *v3Context) Do(r *http.Request) error {
        ctx := r.Context()
 
-       domain := r.Header.Get("X-Tenant-Name")
-       if len(domain) == 0 {
-               domain = r.Header.Get("X-Domain-Name")
-       }
-
-       // self domain
        if len(util.ParseDomain(ctx)) == 0 {
+               domain := r.Header.Get("X-Tenant-Name")
+               if len(domain) == 0 {
+                       domain = r.Header.Get("X-Domain-Name")
+               }
+
                if len(domain) == 0 {
                        err := errors.New("Header does not contain domain.")
                        util.Logger().Errorf(err, "Invalid Request URI %s", 
r.RequestURI)
@@ -52,12 +51,5 @@ func (v *v3Context) Do(r *http.Request) error {
        if len(util.ParseProject(ctx)) == 0 {
                util.SetRequestContext(r, "project", core.REGISTRY_PROJECT)
        }
-       // target domain
-       if len(util.ParseTargetDomain(ctx)) == 0 {
-               util.SetRequestContext(r, "target-domain", domain)
-       }
-       if len(util.ParseTargetProject(ctx)) == 0 {
-               util.SetRequestContext(r, "target-project", 
core.REGISTRY_PROJECT)
-       }
        return nil
 }
diff --git a/server/handler/context/v4.go b/server/handler/context/v4.go
index 0a22e30..5b13495 100644
--- a/server/handler/context/v4.go
+++ b/server/handler/context/v4.go
@@ -35,15 +35,18 @@ func (v *v4Context) IsMatch(r *http.Request) bool {
 func (v *v4Context) Do(r *http.Request) error {
        ctx := r.Context()
 
-       domain := r.Header.Get("X-Domain-Name")
-       path, err := url.PathUnescape(r.RequestURI)
-       if err != nil {
-               util.Logger().Errorf(err, "Invalid Request URI %s", 
r.RequestURI)
-               return err
+       if len(util.ParseProject(ctx)) == 0 {
+               path, err := url.PathUnescape(r.RequestURI)
+               if err != nil {
+                       util.Logger().Errorf(err, "Invalid Request URI %s", 
r.RequestURI)
+                       return err
+               }
+
+               util.SetRequestContext(r, "project", 
v.parseProjectFromPath(path))
        }
 
-       // self domain
        if len(util.ParseDomain(ctx)) == 0 {
+               domain := r.Header.Get("X-Domain-Name")
                if len(domain) == 0 {
                        err := errors.New("Header does not contain domain.")
                        util.Logger().Errorf(err, "Invalid Request URI %s", 
r.RequestURI)
@@ -51,16 +54,6 @@ func (v *v4Context) Do(r *http.Request) error {
                }
                util.SetRequestContext(r, "domain", domain)
        }
-       if len(util.ParseProject(ctx)) == 0 {
-               util.SetRequestContext(r, "project", 
v.parseProjectFromPath(path))
-       }
-       // target domain
-       if len(util.ParseTargetDomain(ctx)) == 0 {
-               util.SetRequestContext(r, "target-domain", domain)
-       }
-       if len(util.ParseTargetProject(ctx)) == 0 {
-               util.SetRequestContext(r, "target-project", 
v.parseProjectFromPath(path))
-       }
        return nil
 }
 
diff --git a/server/plugin/infra/registry/embededetcd/embededetcd.go 
b/server/plugin/infra/registry/embededetcd/embededetcd.go
index d5eb876..03b8585 100644
--- a/server/plugin/infra/registry/embededetcd/embededetcd.go
+++ b/server/plugin/infra/registry/embededetcd/embededetcd.go
@@ -224,10 +224,7 @@ func (s *EtcdEmbed) toCompares(cmps []registry.CompareOp) 
[]*etcdserverpb.Compar
 }
 
 func (s *EtcdEmbed) Compact(ctx context.Context, reserve int64) error {
-       otCtx, cancel := registry.WithTimeout(ctx)
-       defer cancel()
-
-       curRev := s.getLeaderCurrentRevision(otCtx)
+       curRev := s.getLeaderCurrentRevision(ctx)
        revToCompact := max(0, curRev-reserve)
        if revToCompact <= 0 {
                util.Logger().Infof("revision is %d, <=%d, no nead to compact", 
curRev, reserve)
@@ -235,7 +232,7 @@ func (s *EtcdEmbed) Compact(ctx context.Context, reserve 
int64) error {
        }
 
        util.Logger().Infof("Compacting... revision is %d(current: %d, reserve 
%d)", revToCompact, curRev, reserve)
-       _, err := s.Server.Server.Compact(otCtx, 
&etcdserverpb.CompactionRequest{
+       _, err := s.Server.Server.Compact(ctx, &etcdserverpb.CompactionRequest{
                Revision: revToCompact,
                Physical: true,
        })
diff --git a/server/plugin/infra/registry/etcd/etcd.go 
b/server/plugin/infra/registry/etcd/etcd.go
index f6796fc..c6f7b57 100644
--- a/server/plugin/infra/registry/etcd/etcd.go
+++ b/server/plugin/infra/registry/etcd/etcd.go
@@ -76,10 +76,7 @@ func (c *EtcdClient) Compact(ctx context.Context, reserve 
int64) error {
                return nil
        }
 
-       otCtx, cancel := registry.WithTimeout(ctx)
-       defer cancel()
-
-       _, err := c.Client.Compact(otCtx, revToCompact, 
clientv3.WithCompactPhysical())
+       _, err := c.Client.Compact(ctx, revToCompact, 
clientv3.WithCompactPhysical())
        if err != nil {
                util.Logger().Errorf(err, "Compact %s failed, revision is 
%d(current: %d, reserve %d)",
                        eps, revToCompact, curRev, reserve)
@@ -88,7 +85,7 @@ func (c *EtcdClient) Compact(ctx context.Context, reserve 
int64) error {
        util.Logger().Infof("Compacted %s, revision is %d(current: %d, reserve 
%d)", eps, revToCompact, curRev, reserve)
 
        for _, ep := range eps {
-               _, err := c.Client.Defragment(otCtx, ep)
+               _, err := c.Client.Defragment(ctx, ep)
                if err != nil {
                        util.Logger().Errorf(err, "Defrag %s failed", ep)
                        continue
@@ -103,12 +100,9 @@ func (c *EtcdClient) getLeaderCurrentRevision(ctx 
context.Context) int64 {
        eps := c.Client.Endpoints()
        curRev := int64(0)
        for _, ep := range eps {
-               otCtx, cancel := registry.WithTimeout(ctx)
-
-               resp, err := c.Client.Status(otCtx, ep)
+               resp, err := c.Client.Status(ctx, ep)
                if err != nil {
                        util.Logger().Error(fmt.Sprintf("Compact error ,can not 
get status from %s", ep), err)
-                       cancel()
                        continue
                }
                curRev = resp.Header.Revision
@@ -116,8 +110,6 @@ func (c *EtcdClient) getLeaderCurrentRevision(ctx 
context.Context) int64 {
                        util.Logger().Infof("Get leader endpoint: %s, revision 
is %d", ep, curRev)
                        break
                }
-
-               cancel()
        }
        return curRev
 }
@@ -608,7 +600,10 @@ func NewRegistry() mgr.PluginInstance {
 
        }
 
-       inv, _ := time.ParseDuration(core.ServerInfo.Config.AutoSyncInterval)
+       inv, err := time.ParseDuration(core.ServerInfo.Config.AutoSyncInterval)
+       if err != nil {
+               util.Logger().Errorf(err, "invalid auto sync interval '%s'.", 
core.ServerInfo.Config.AutoSyncInterval)
+       }
        client, err := newClient(endpoints, inv)
        if err != nil {
                util.Logger().Errorf(err, "get etcd client %v failed.", 
endpoints)
diff --git a/server/rest/controller/v4/instance_controller.go 
b/server/rest/controller/v4/instance_controller.go
index d62cf03..0f23320 100644
--- a/server/rest/controller/v4/instance_controller.go
+++ b/server/rest/controller/v4/instance_controller.go
@@ -130,6 +130,15 @@ func (this *MicroServiceInstanceService) FindInstances(w 
http.ResponseWriter, r
                VersionRule:       r.URL.Query().Get("version"),
                Tags:              ids,
        }
+
+       targetDomain := r.Header.Get("X-Domain-Name")
+       targetProject := r.URL.Query().Get(":project")
+       if len(targetProject) == 0 {
+               targetProject = core.REGISTRY_PROJECT
+       }
+       util.SetRequestContext(r, "target-domain", targetDomain)
+       util.SetRequestContext(r, "target-project", targetProject)
+
        resp, _ := core.InstanceAPI.Find(r.Context(), request)
        respInternal := resp.Response
        resp.Response = nil
diff --git a/server/server.go b/server/server.go
index b8ab6f5..7f814fc 100644
--- a/server/server.go
+++ b/server/server.go
@@ -111,7 +111,7 @@ func (s *ServiceCenterServer) initialize() {
 
 func (s *ServiceCenterServer) autoCompactBackend() {
        delta := core.ServerInfo.Config.CompactIndexDelta
-       if delta <= 0 {
+       if delta <= 0 || len(core.ServerInfo.Config.CompactInterval) == 0 {
                return
        }
        interval, err := 
time.ParseDuration(core.ServerInfo.Config.CompactInterval)
@@ -120,8 +120,8 @@ func (s *ServiceCenterServer) autoCompactBackend() {
                interval = 12 * time.Hour
        }
        util.Go(func(stopCh <-chan struct{}) {
-               util.Logger().Infof("start the automatic compact mechanism, 
compact once every %s",
-                       core.ServerInfo.Config.CompactInterval)
+               util.Logger().Infof("start the automatic compact mechanism, 
compact once every %s, reserve %d",
+                       core.ServerInfo.Config.CompactInterval, delta)
                for {
                        select {
                        case <-stopCh:
diff --git a/server/service/instances.go b/server/service/instances.go
index 8edde82..3a22549 100644
--- a/server/service/instances.go
+++ b/server/service/instances.go
@@ -547,9 +547,8 @@ func (s *InstanceService) Find(ctx context.Context, in 
*pb.FindInstancesRequest)
        }
 
        domainProject := util.ParseDomainProject(ctx)
-       targetDomainProject := util.ParseTargetDomainProject(ctx)
-
        findFlag := fmt.Sprintf("consumer %s --> provider %s/%s/%s", 
in.ConsumerServiceId, in.AppId, in.ServiceName, in.VersionRule)
+
        service, err := serviceUtil.GetService(ctx, domainProject, 
in.ConsumerServiceId)
        if err != nil {
                util.Logger().Errorf(err, "find instance failed, %s: get 
consumer failed.", findFlag)
@@ -564,6 +563,7 @@ func (s *InstanceService) Find(ctx context.Context, in 
*pb.FindInstancesRequest)
                }, nil
        }
 
+       targetDomainProject := util.ParseTargetDomainProject(ctx)
        provider := &pb.MicroServiceKey{
                Tenant:      targetDomainProject,
                Environment: service.Environment,
@@ -571,10 +571,13 @@ func (s *InstanceService) Find(ctx context.Context, in 
*pb.FindInstancesRequest)
                ServiceName: in.ServiceName,
                Alias:       in.ServiceName,
        }
-
        if apt.IsShared(provider) {
                // it means the shared micro-services must be the same env with 
SC.
                provider.Environment = apt.Service.Environment
+       } else {
+               // only allow shared micro-service instances found in different 
domains.
+               targetDomainProject = domainProject
+               provider.Tenant = domainProject
        }
 
        // 版本规则
diff --git a/server/service/microservices.go b/server/service/microservices.go
index 0f304a8..aadbcea 100644
--- a/server/service/microservices.go
+++ b/server/service/microservices.go
@@ -213,7 +213,7 @@ func (s *MicroServiceService) DeleteServicePri(ctx 
context.Context, ServiceId st
        if ServiceId == apt.Service.ServiceId {
                err := fmt.Errorf("Not allow to delete service center")
                util.Logger().Errorf(err, "%s microservice failed, serviceId is 
%s", title, ServiceId)
-               return pb.CreateResponse(scerr.ErrInvalidParams, err.Error()), 
err
+               return pb.CreateResponse(scerr.ErrInvalidParams, err.Error()), 
nil
        }
 
        service, err := serviceUtil.GetService(ctx, domainProject, ServiceId)
diff --git a/server/service/util/rule_util.go b/server/service/util/rule_util.go
index 50041b9..b8b0774 100644
--- a/server/service/util/rule_util.go
+++ b/server/service/util/rule_util.go
@@ -154,8 +154,7 @@ func AllowAcrossDimension(ctx context.Context, 
providerService *pb.MicroService,
                }
        }
 
-       targetDomainProject := util.ParseTargetDomainProject(ctx)
-       if !apt.IsShared(pb.MicroServiceToKey(targetDomainProject, 
providerService)) &&
+       if 
!apt.IsShared(pb.MicroServiceToKey(util.ParseTargetDomainProject(ctx), 
providerService)) &&
                providerService.Environment != consumerService.Environment {
                return fmt.Errorf("not allow across environment access")
        }

-- 
To stop receiving notification emails like this one, please contact
['"[email protected]" <[email protected]>'].

Reply via email to