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 fe8b622 GetService optimize (#824) fe8b622 is described below commit fe8b622a4740780b90edc05ba5797fbc153fad34 Author: yeyiwei <53281955+yeyi...@users.noreply.github.com> AuthorDate: Wed Jan 13 10:41:36 2021 +0800 GetService optimize (#824) --- datasource/{mongo/client => }/errortypes.go | 32 +-- datasource/etcd/dep.go | 38 +-- datasource/etcd/event/instance_event_handler.go | 11 +- datasource/etcd/event/rule_event_handler.go | 12 +- datasource/etcd/event/tag_event_handler.go | 18 +- datasource/etcd/ms.go | 299 +++++++++++------------ datasource/etcd/util.go | 3 +- datasource/etcd/util/dependency_query.go | 38 +-- datasource/etcd/util/dependency_test.go | 14 +- datasource/etcd/util/microservice_util.go | 17 +- datasource/etcd/util/rule_util.go | 19 +- datasource/etcd/util/rule_util_test.go | 37 ++- datasource/etcd/util/util_suite_test.go | 26 +- datasource/mongo/client/errortypes.go | 2 +- datasource/mongo/dep.go | 33 +-- datasource/mongo/dependency_query.go | 16 +- datasource/mongo/event/instance_event_handler.go | 11 +- datasource/mongo/ms.go | 186 +++++++------- server/broker/service.go | 103 ++++---- server/broker/util.go | 31 +-- 20 files changed, 484 insertions(+), 462 deletions(-) diff --git a/datasource/mongo/client/errortypes.go b/datasource/errortypes.go similarity index 64% copy from datasource/mongo/client/errortypes.go copy to datasource/errortypes.go index 9d7311a..ffc6866 100644 --- a/datasource/mongo/client/errortypes.go +++ b/datasource/errortypes.go @@ -13,36 +13,10 @@ // See the License for the specific language governing permissions and // limitations under the License. -package client +package datasource -import ( - "errors" - - "go.mongodb.org/mongo-driver/mongo" -) +import "errors" var ( - ErrNoDocuments = errors.New("no doc found") -) - -const ( - DuplicateKey = 11000 + ErrNoData = errors.New("no data found") ) - -func IsDuplicateKey(err error) bool { - if err != nil { - we, ok := err.(mongo.WriteException) - if ok { - for _, wr := range we.WriteErrors { - if wr.Code == DuplicateKey { - return true - } - } - } - } - return false -} - -func IsNoneDoc(err error) bool { - return err == ErrNoDocuments -} diff --git a/datasource/etcd/dep.go b/datasource/etcd/dep.go index db51e6e..cc0c887 100644 --- a/datasource/etcd/dep.go +++ b/datasource/etcd/dep.go @@ -20,8 +20,10 @@ package etcd import ( "context" "encoding/json" + "errors" "fmt" + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" "github.com/apache/servicecomb-service-center/datasource/etcd/path" serviceUtil "github.com/apache/servicecomb-service-center/datasource/etcd/util" @@ -36,22 +38,22 @@ func (ds *DataSource) SearchProviderDependency(ctx context.Context, request *pb. provider, err := serviceUtil.GetService(ctx, domainProject, providerServiceID) if err != nil { - log.Errorf(err, "GetProviderDependencies failed, provider is %s", providerServiceID) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("provider[%s] does not exist in db", providerServiceID)) + return &pb.GetProDependenciesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Provider does not exist"), + }, nil + } + log.Error(fmt.Sprintf("query provider service from db failed, provider is %s", providerServiceID), err) return nil, err } - if provider == nil { - log.Errorf(err, "GetProviderDependencies failed for provider[%s] does not exist", providerServiceID) - return &pb.GetProDependenciesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Provider does not exist"), - }, nil - } dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, provider) services, err := dr.GetDependencyConsumers(toDependencyFilterOptions(request)...) if err != nil { - log.Errorf(err, "GetProviderDependencies failed, provider is %s/%s/%s/%s", - provider.Environment, provider.AppId, provider.ServiceName, provider.Version) + log.Error(fmt.Sprintf("query provider failed, provider is %s/%s/%s/%s", + provider.Environment, provider.AppId, provider.ServiceName, provider.Version), err) return &pb.GetProDependenciesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -69,21 +71,21 @@ func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request *pb. consumer, err := serviceUtil.GetService(ctx, domainProject, consumerID) if err != nil { - log.Errorf(err, "GetConsumerDependencies failed, consumer is %s", consumerID) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer[%s] does not exist", consumerID)) + return &pb.GetConDependenciesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Consumer does not exist"), + }, nil + } + log.Error(fmt.Sprintf("query consumer failed, consumer is %s", consumerID), err) return nil, err } - if consumer == nil { - log.Errorf(err, "GetConsumerDependencies failed for consumer[%s] does not exist", consumerID) - return &pb.GetConDependenciesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Consumer does not exist"), - }, nil - } dr := serviceUtil.NewConsumerDependencyRelation(ctx, domainProject, consumer) services, err := dr.GetDependencyProviders(toDependencyFilterOptions(request)...) if err != nil { - log.Errorf(err, "GetConsumerDependencies failed, consumer is %s/%s/%s/%s", - consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version) + log.Error(fmt.Sprintf("query consumer failed, consumer is %s/%s/%s/%s", + consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version), err) return &pb.GetConDependenciesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err diff --git a/datasource/etcd/event/instance_event_handler.go b/datasource/etcd/event/instance_event_handler.go index ae5919a..54b78be 100644 --- a/datasource/etcd/event/instance_event_handler.go +++ b/datasource/etcd/event/instance_event_handler.go @@ -19,6 +19,7 @@ package event import ( "context" + "fmt" "strings" "github.com/apache/servicecomb-service-center/datasource/etcd/cache" @@ -92,9 +93,9 @@ func (h *InstanceEventHandler) OnEvent(evt sd.KvEvent) { ctx := util.WithGlobal(util.WithCacheOnly(context.Background())) ms, err := serviceUtil.GetService(ctx, domainProject, providerID) - if ms == nil { - log.Errorf(err, "caught [%s] instance[%s/%s] event, endpoints %v, get cached provider's file failed", - action, providerID, providerInstanceID, instance.Endpoints) + if err != nil { + log.Error(fmt.Sprintf("caught [%s] instance[%s/%s] event, endpoints %v, get cached provider's file failed", + action, providerID, providerInstanceID, instance.Endpoints), err) return } @@ -103,8 +104,8 @@ func (h *InstanceEventHandler) OnEvent(evt sd.KvEvent) { } if notify.Center().Closed() { - log.Warnf("caught [%s] instance[%s/%s] event, endpoints %v, but notify service is closed", - action, providerID, providerInstanceID, instance.Endpoints) + log.Warn(fmt.Sprintf("caught [%s] instance[%s/%s] event, endpoints %v, but notify service is closed", + action, providerID, providerInstanceID, instance.Endpoints)) return } diff --git a/datasource/etcd/event/rule_event_handler.go b/datasource/etcd/event/rule_event_handler.go index 88b5ff5..8b8a866 100644 --- a/datasource/etcd/event/rule_event_handler.go +++ b/datasource/etcd/event/rule_event_handler.go @@ -19,8 +19,10 @@ package event import ( "context" + "errors" "fmt" + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/kv" "github.com/apache/servicecomb-service-center/datasource/etcd/path" "github.com/apache/servicecomb-service-center/datasource/etcd/sd" @@ -60,13 +62,13 @@ func (apt *RulesChangedTask) publish(ctx context.Context, domainProject, provide provider, err := serviceUtil.GetService(ctx, domainProject, providerID) if err != nil { - log.Errorf(err, "get provider[%s] service file failed", providerID) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("provider[%s] does not exist", providerID)) + } else { + log.Error(fmt.Sprintf("get provider[%s] service file failed", providerID), err) + } return err } - if provider == nil { - log.Errorf(nil, "provider[%s] does not exist", providerID) - return fmt.Errorf("provider %s does not exist", providerID) - } consumerIds, err := serviceUtil.GetConsumerIds(ctx, domainProject, provider) if err != nil { diff --git a/datasource/etcd/event/tag_event_handler.go b/datasource/etcd/event/tag_event_handler.go index 585b173..f0c5822 100644 --- a/datasource/etcd/event/tag_event_handler.go +++ b/datasource/etcd/event/tag_event_handler.go @@ -19,8 +19,10 @@ package event import ( "context" + "errors" "fmt" + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/cache" "github.com/apache/servicecomb-service-center/datasource/etcd/kv" "github.com/apache/servicecomb-service-center/datasource/etcd/path" @@ -61,13 +63,13 @@ func (apt *TagsChangedTask) publish(ctx context.Context, domainProject, consumer consumer, err := serviceUtil.GetService(ctx, domainProject, consumerID) if err != nil { - log.Errorf(err, "get consumer[%s] for publish event failed", consumerID) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer[%s] does not exist in db", consumerID)) + } else { + log.Error(fmt.Sprintf("get consumer[%s] for publish event failed", consumerID), err) + } return err } - if consumer == nil { - log.Errorf(nil, "consumer[%s] does not exist", consumerID) - return fmt.Errorf("consumer[%s] does not exist", consumerID) - } serviceKey := pb.MicroServiceToKey(domainProject, consumer) cache.FindInstances.Remove(serviceKey) @@ -81,9 +83,9 @@ func (apt *TagsChangedTask) publish(ctx context.Context, domainProject, consumer for _, providerID := range providerIDs { provider, err := serviceUtil.GetService(ctx, domainProject, providerID) - if provider == nil { - log.Errorf(err, "get service[%s][%s/%s/%s/%s]'s provider[%s] file failed", - consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version, providerID) + if err != nil { + log.Error(fmt.Sprintf("get service[%s][%s/%s/%s/%s]'s provider[%s] file failed", + consumerID, consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version, providerID), err) continue } diff --git a/datasource/etcd/ms.go b/datasource/etcd/ms.go index 1527490..3e650c7 100644 --- a/datasource/etcd/ms.go +++ b/datasource/etcd/ms.go @@ -66,8 +66,8 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *pb.CreateSer reporter := checkQuota(ctx, domainProject) defer reporter.Close(ctx) if reporter != nil && reporter.Err != nil { - log.Errorf(reporter.Err, "create micro-service[%s] failed, operator: %s", - serviceFlag, remoteIP) + log.Error(fmt.Sprintf("create micro-service[%s] failed, operator: %s", + serviceFlag, remoteIP), reporter.Err) resp := &pb.CreateServiceResponse{ Response: pb.CreateResponseWithSCErr(reporter.Err), } @@ -90,8 +90,8 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *pb.CreateSer data, err := json.Marshal(service) if err != nil { - log.Errorf(err, "create micro-service[%s] failed, json marshal service failed, operator: %s", - serviceFlag, remoteIP) + log.Error(fmt.Sprintf("create micro-service[%s] failed, json marshal service failed, operator: %s", + serviceFlag, remoteIP), err) return &pb.CreateServiceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -123,8 +123,8 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *pb.CreateSer resp, err := client.Instance().TxnWithCmp(ctx, opts, uniqueCmpOpts, failOpts) if err != nil { - log.Errorf(err, "create micro-service[%s] failed, operator: %s", - serviceFlag, remoteIP) + log.Error(fmt.Sprintf("create micro-service[%s] failed, operator: %s", + serviceFlag, remoteIP), err) return &pb.CreateServiceResponse{ Response: pb.CreateResponse(pb.ErrUnavailableBackend, err.Error()), }, err @@ -133,8 +133,8 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *pb.CreateSer if len(requestServiceID) != 0 { if len(resp.Kvs) == 0 || requestServiceID != util.BytesToStringWithNoCopy(resp.Kvs[0].Value) { - log.Warnf("create micro-service[%s] failed, service already exists, operator: %s", - serviceFlag, remoteIP) + log.Warn(fmt.Sprintf("create micro-service[%s] failed, service already exists, operator: %s", + serviceFlag, remoteIP)) return &pb.CreateServiceResponse{ Response: pb.CreateResponse(pb.ErrServiceAlreadyExists, "ServiceID conflict or found the same service with different id."), @@ -144,16 +144,16 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *pb.CreateSer if len(resp.Kvs) == 0 { // internal error? - log.Errorf(nil, "create micro-service[%s] failed, unexpected txn response, operator: %s", - serviceFlag, remoteIP) + log.Error(fmt.Sprintf("create micro-service[%s] failed, unexpected txn response, operator: %s", + serviceFlag, remoteIP), nil) return &pb.CreateServiceResponse{ Response: pb.CreateResponse(pb.ErrInternal, "Unexpected txn response."), }, nil } serviceIDInner := util.BytesToStringWithNoCopy(resp.Kvs[0].Value) - log.Warnf("create micro-service[%s][%s] failed, service already exists, operator: %s", - serviceIDInner, serviceFlag, remoteIP) + log.Warn(fmt.Sprintf("create micro-service[%s][%s] failed, service already exists, operator: %s", + serviceIDInner, serviceFlag, remoteIP)) return &pb.CreateServiceResponse{ Response: pb.CreateResponse(pb.ResponseSuccess, "register service successfully"), ServiceId: serviceIDInner, @@ -161,11 +161,11 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *pb.CreateSer } if err := reporter.ReportUsedQuota(ctx); err != nil { - log.Errorf(err, "report the used quota failed") + log.Error("report the used quota failed", err) } - log.Infof("create micro-service[%s][%s] successfully, operator: %s", - service.ServiceId, serviceFlag, remoteIP) + log.Info(fmt.Sprintf("create micro-service[%s][%s] successfully, operator: %s", + service.ServiceId, serviceFlag, remoteIP)) return &pb.CreateServiceResponse{ Response: pb.CreateResponse(pb.ResponseSuccess, "Register service successfully."), ServiceId: service.ServiceId, @@ -177,7 +177,7 @@ func (ds *DataSource) GetServices(ctx context.Context, request *pb.GetServicesRe *pb.GetServicesResponse, error) { services, err := serviceUtil.GetAllServiceUtil(ctx) if err != nil { - log.Errorf(err, "get all services by domain failed") + log.Error("get all services by domain failed", err) return &pb.GetServicesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -195,17 +195,17 @@ func (ds *DataSource) GetService(ctx context.Context, request *pb.GetServiceRequ singleService, err := serviceUtil.GetService(ctx, domainProject, request.ServiceId) if err != nil { - log.Errorf(err, "get micro-service[%s] failed, get service file failed", request.ServiceId) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("get micro-service[%s] failed, service does not exist in db", request.ServiceId)) + return &pb.GetServiceResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), + }, nil + } + log.Error(fmt.Sprintf("get micro-service[%s] failed, get service file failed", request.ServiceId), err) return &pb.GetServiceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if singleService == nil { - log.Errorf(nil, "get micro-service[%s] failed, service does not exist", request.ServiceId) - return &pb.GetServiceResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), - }, nil - } return &pb.GetServiceResponse{ Response: pb.CreateResponse(pb.ResponseSuccess, "Get service successfully."), Service: singleService, @@ -217,12 +217,12 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *pb.GetServi domainProject := util.ParseDomainProject(ctx) service, err := serviceUtil.GetService(ctx, domainProject, request.ServiceId) - if service == nil { - return &pb.GetServiceDetailResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), - }, nil - } if err != nil { + if errors.Is(err, datasource.ErrNoData) { + return &pb.GetServiceDetailResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), + }, nil + } return &pb.GetServiceDetailResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -237,8 +237,8 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *pb.GetServi } versions, err := getServiceAllVersions(ctx, key) if err != nil { - log.Errorf(err, "get service[%s/%s/%s] all versions failed", - service.Environment, service.AppId, service.ServiceName) + log.Error(fmt.Sprintf("get service[%s/%s/%s] all versions failed", + service.Environment, service.AppId, service.ServiceName), err) return &pb.GetServiceDetailResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -303,7 +303,7 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *pb.GetServic //获取所有服务 services, err := serviceUtil.GetAllServiceUtil(ctx) if err != nil { - log.Errorf(err, "get all services by domain failed") + log.Error("get all services by domain failed", err) return &pb.GetServicesInfoResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -409,19 +409,19 @@ func (ds *DataSource) ExistService(ctx context.Context, request *pb.GetExistence Tenant: domainProject, }) if err != nil { - log.Errorf(err, "micro-service[%s] exist failed, find serviceIDs failed", serviceFlag) + log.Error(fmt.Sprintf("micro-service[%s] exist failed, find serviceIDs failed", serviceFlag), err) return &pb.GetExistenceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } if !exist { - log.Infof("micro-service[%s] exist failed, service does not exist", serviceFlag) + log.Info(fmt.Sprintf("micro-service[%s] exist failed, service does not exist", serviceFlag)) return &pb.GetExistenceResponse{ Response: pb.CreateResponse(pb.ErrServiceNotExists, serviceFlag+" does not exist."), }, nil } if len(ids) == 0 { - log.Infof("micro-service[%s] exist failed, version mismatch", serviceFlag) + log.Info(fmt.Sprintf("micro-service[%s] exist failed, version mismatch", serviceFlag)) return &pb.GetExistenceResponse{ Response: pb.CreateResponse(pb.ErrServiceVersionNotExists, serviceFlag+" version mismatch."), }, nil @@ -440,19 +440,19 @@ func (ds *DataSource) UpdateService(ctx context.Context, request *pb.UpdateServi key := path.GenerateServiceKey(domainProject, request.ServiceId) microservice, err := serviceUtil.GetService(ctx, domainProject, request.ServiceId) if err != nil { - log.Errorf(err, "update service[%s] properties failed, get service file failed, operator: %s", - request.ServiceId, remoteIP) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service does not exist, update service[%s] properties failed, operator: %s", + request.ServiceId, remoteIP)) + return &pb.UpdateServicePropsResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), + }, nil + } + log.Error(fmt.Sprintf("update service[%s] properties failed, get service file failed, operator: %s", + request.ServiceId, remoteIP), err) return &pb.UpdateServicePropsResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if microservice == nil { - log.Errorf(nil, "update service[%s] properties failed, service does not exist, operator: %s", - request.ServiceId, remoteIP) - return &pb.UpdateServicePropsResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), - }, nil - } copyServiceRef := *microservice copyServiceRef.Properties = request.Properties @@ -541,8 +541,8 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register } switch resp.Response.GetCode() { case pb.ResponseSuccess: - log.Infof("register instance successful, reuse instance[%s/%s], operator %s", - instance.ServiceId, instance.InstanceId, remoteIP) + log.Info(fmt.Sprintf("register instance successful, reuse instance[%s/%s], operator %s", + instance.ServiceId, instance.InstanceId, remoteIP)) return &pb.RegisterInstanceResponse{ Response: resp.Response, InstanceId: instance.InstanceId, @@ -550,8 +550,8 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register case pb.ErrInstanceNotExists: // register a new one default: - log.Errorf(err, "register instance failed, reuse instance[%s/%s], operator %s", - instance.ServiceId, instance.InstanceId, remoteIP) + log.Error(fmt.Sprintf("register instance failed, reuse instance[%s/%s], operator %s", + instance.ServiceId, instance.InstanceId, remoteIP), err) return &pb.RegisterInstanceResponse{ Response: resp.Response, }, err @@ -559,8 +559,8 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register } if err := preProcessRegisterInstance(ctx, instance); err != nil { - log.Errorf(err, "register service[%s]'s instance failed, endpoints %v, host '%s', operator %s", - instance.ServiceId, instance.Endpoints, instance.HostName, remoteIP) + log.Error(fmt.Sprintf("register service[%s]'s instance failed, endpoints %v, host '%s', operator %s", + instance.ServiceId, instance.Endpoints, instance.HostName, remoteIP), err) return &pb.RegisterInstanceResponse{ Response: pb.CreateResponseWithSCErr(err), }, nil @@ -584,8 +584,8 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register defer reporter.Close(ctx) if reporter.Err != nil { - log.Errorf(reporter.Err, "register instance failed, %s, operator %s", - instanceFlag, remoteIP) + log.Error(fmt.Sprintf("register instance failed, %s, operator %s", + instanceFlag, remoteIP), reporter.Err) response := &pb.RegisterInstanceResponse{ Response: pb.CreateResponseWithSCErr(reporter.Err), } @@ -599,9 +599,8 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register instanceID := instance.InstanceId data, err := json.Marshal(instance) if err != nil { - log.Errorf(err, - "register instance failed, %s, instanceID %s, operator %s", - instanceFlag, instanceID, remoteIP) + log.Error(fmt.Sprintf("register instance failed, %s, instanceID %s, operator %s", + instanceFlag, instanceID, remoteIP), err) return &pb.RegisterInstanceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err @@ -609,7 +608,7 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register leaseID, err := client.Instance().LeaseGrant(ctx, ttl) if err != nil { - log.Errorf(err, "grant lease failed, %s, operator: %s", instanceFlag, remoteIP) + log.Error(fmt.Sprintf("grant lease failed, %s, operator: %s", instanceFlag, remoteIP), err) return &pb.RegisterInstanceResponse{ Response: pb.CreateResponse(pb.ErrUnavailableBackend, err.Error()), }, err @@ -632,30 +631,27 @@ func (ds *DataSource) RegisterInstance(ctx context.Context, request *pb.Register client.CmpNotEqual, 0)}, nil) if err != nil { - log.Errorf(err, - "register instance failed, %s, instanceID %s, operator %s", - instanceFlag, instanceID, remoteIP) + log.Error(fmt.Sprintf("register instance failed, %s, instanceID %s, operator %s", + instanceFlag, instanceID, remoteIP), err) return &pb.RegisterInstanceResponse{ Response: pb.CreateResponse(pb.ErrUnavailableBackend, err.Error()), }, err } if !resp.Succeeded { - log.Errorf(nil, - "register instance failed, %s, instanceID %s, operator %s: service does not exist", - instanceFlag, instanceID, remoteIP) + log.Error(fmt.Sprintf("register instance failed, %s, instanceID %s, operator %s: service does not exist", + instanceFlag, instanceID, remoteIP), nil) return &pb.RegisterInstanceResponse{ Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), }, nil } if err := reporter.ReportUsedQuota(ctx); err != nil { - log.Errorf(err, - "register instance failed, %s, instanceID %s, operator %s", - instanceFlag, instanceID, remoteIP) + log.Error(fmt.Sprintf("register instance failed, %s, instanceID %s, operator %s", + instanceFlag, instanceID, remoteIP), err) } - log.Infof("register instance %s, instanceID %s, operator %s", - instanceFlag, instanceID, remoteIP) + log.Info(fmt.Sprintf("register instance %s, instanceID %s, operator %s", + instanceFlag, instanceID, remoteIP)) return &pb.RegisterInstanceResponse{ Response: pb.CreateResponse(pb.ResponseSuccess, "Register service instance successfully."), InstanceId: instanceID, @@ -671,38 +667,38 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *pb.GetOneInstanc if len(request.ConsumerServiceId) > 0 { service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId) if err != nil { - log.Errorf(err, "get consumer failed, consumer[%s] find provider instance[%s/%s]", - request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer does not exist in db, consumer[%s] find provider instance[%s/%s]", + request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)) + return &pb.GetOneInstanceResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, + fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), + }, nil + } + log.Error(fmt.Sprintf("get consumer failed, consumer[%s] find provider instance[%s/%s]", + request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err) return &pb.GetOneInstanceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if service == nil { - log.Errorf(nil, "consumer does not exist, consumer[%s] find provider instance[%s/%s]", - request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId) - return &pb.GetOneInstanceResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, - fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), - }, nil - } } provider, err := serviceUtil.GetService(ctx, domainProject, request.ProviderServiceId) if err != nil { - log.Errorf(err, "get provider failed, consumer[%s] find provider instance[%s/%s]", - request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("provider does not exist in db, consumer[%s] find provider instance[%s/%s]", + request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)) + return &pb.GetOneInstanceResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, + fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)), + }, nil + } + log.Error(fmt.Sprintf("get provider failed, consumer[%s] find provider instance[%s/%s]", + request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err) return &pb.GetOneInstanceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if provider == nil { - log.Errorf(nil, "provider does not exist, consumer[%s] find provider instance[%s/%s]", - request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId) - return &pb.GetOneInstanceResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, - fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)), - }, nil - } findFlag := func() string { return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instance[%s]", @@ -718,14 +714,14 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *pb.GetOneInstanc ServiceId: request.ProviderServiceId, InstanceId: request.ProviderInstanceId, }, request.Tags, rev) if err != nil { - log.Errorf(err, "FindInstances.GetWithProviderID failed, %s failed", findFlag()) + log.Error(fmt.Sprintf("find Instances by providerID failed, %s failed", findFlag()), err) return &pb.GetOneInstanceResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } if item == nil || len(item.Instances) == 0 { mes := fmt.Errorf("%s failed, provider instance does not exist", findFlag()) - log.Errorf(mes, "FindInstances.GetWithProviderID failed") + log.Error("find Instances by ProviderID failed", mes) return &pb.GetOneInstanceResponse{ Response: pb.CreateResponse(pb.ErrInstanceNotExists, mes.Error()), }, nil @@ -752,38 +748,38 @@ func (ds *DataSource) GetInstances(ctx context.Context, request *pb.GetInstances if len(request.ConsumerServiceId) > 0 { service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId) if err != nil { - log.Errorf(err, "get consumer failed, consumer[%s] find provider instances", - request.ConsumerServiceId, request.ProviderServiceId) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer does not exist in db, consumer[%s] find provider[%s] instances", + request.ConsumerServiceId, request.ProviderServiceId)) + return &pb.GetInstancesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, + fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), + }, nil + } + log.Error(fmt.Sprintf("get consumer failed, consumer[%s] find provider[%s] instances", + request.ConsumerServiceId, request.ProviderServiceId), err) return &pb.GetInstancesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if service == nil { - log.Errorf(nil, "consumer does not exist, consumer[%s] find provider instances", - request.ConsumerServiceId, request.ProviderServiceId) - return &pb.GetInstancesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, - fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), - }, nil - } } provider, err := serviceUtil.GetService(ctx, domainProject, request.ProviderServiceId) if err != nil { - log.Errorf(err, "get provider failed, consumer[%s] find provider instances", - request.ConsumerServiceId, request.ProviderServiceId) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("provider does not exist, consumer[%s] find provider[%s] instances", + request.ConsumerServiceId, request.ProviderServiceId)) + return &pb.GetInstancesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, + fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)), + }, nil + } + log.Error(fmt.Sprintf("get provider failed, consumer[%s] find provider[%s] instances", + request.ConsumerServiceId, request.ProviderServiceId), err) return &pb.GetInstancesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if provider == nil { - log.Errorf(nil, "provider does not exist, consumer[%s] find provider instances", - request.ConsumerServiceId, request.ProviderServiceId) - return &pb.GetInstancesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, - fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)), - }, nil - } findFlag := func() string { return fmt.Sprintf("Consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instances", @@ -914,20 +910,20 @@ func (ds *DataSource) findInstance(ctx context.Context, request *pb.FindInstance if len(request.ConsumerServiceId) > 0 { service, err = serviceUtil.GetService(ctx, domainProject, request.ConsumerServiceId) if err != nil { - log.Errorf(err, "get consumer failed, consumer[%s] find provider[%s/%s/%s/%s]", - request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer does not exist, consumer[%s] find provider[%s/%s/%s/%s]", + request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule)) + return &pb.FindInstancesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, + fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), + }, nil + } + log.Error(fmt.Sprintf("get consumer failed, consumer[%s] find provider[%s/%s/%s/%s]", + request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule), err) return &pb.FindInstancesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if service == nil { - log.Errorf(nil, "consumer does not exist, consumer[%s] find provider[%s/%s/%s/%s]", - request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule) - return &pb.FindInstancesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, - fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), - }, nil - } provider.Environment = service.Environment } @@ -1031,7 +1027,7 @@ func (ds *DataSource) reshapeProviderKey(ctx context.Context, provider *pb.Micro *pb.MicroServiceKey, error) { //维护version的规则,service name 可能是别名,所以重新获取 providerService, err := serviceUtil.GetService(ctx, provider.Tenant, providerID) - if providerService == nil { + if err != nil { return nil, err } @@ -1348,23 +1344,23 @@ func (ds *DataSource) ModifySchemas(ctx context.Context, request *pb.ModifySchem serviceInfo, err := serviceUtil.GetService(ctx, domainProject, serviceID) if err != nil { - log.Errorf(err, "modify service[%s] schemas failed, get service failed, operator: %s", - serviceID, remoteIP) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("modify service[%s] schemas failed, service does not exist in db, operator: %s", + serviceID, remoteIP)) + return &pb.ModifySchemasResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), + }, nil + } + log.Error(fmt.Sprintf("modify service[%s] schemas failed, get service failed, operator: %s", + serviceID, remoteIP), err) return &pb.ModifySchemasResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if serviceInfo == nil { - log.Errorf(nil, "modify service[%s] schemas failed, service does not exist, operator: %s", - serviceID, remoteIP) - return &pb.ModifySchemasResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), - }, nil - } respErr := ds.modifySchemas(ctx, domainProject, serviceInfo, request.Schemas) if respErr != nil { - log.Errorf(nil, "modify service[%s] schemas failed, operator: %s", serviceID, remoteIP) + log.Error(fmt.Sprintf("modify service[%s] schemas failed, operator: %s", serviceID, remoteIP), nil) resp := &pb.ModifySchemasResponse{ Response: pb.CreateResponseWithSCErr(respErr), } @@ -1498,17 +1494,17 @@ func (ds *DataSource) GetAllSchemas(ctx context.Context, request *pb.GetAllSchem service, err := serviceUtil.GetService(ctx, domainProject, request.ServiceId) if err != nil { - log.Errorf(err, "get service[%s] all schemas failed, get service failed", request.ServiceId) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("get service[%s] all schemas failed, service does not exist in db", request.ServiceId)) + return &pb.GetAllSchemaResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), + }, nil + } + log.Error(fmt.Sprintf("get service[%s] all schemas failed, get service failed", request.ServiceId), err) return &pb.GetAllSchemaResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), }, err } - if service == nil { - log.Errorf(nil, "get service[%s] all schemas failed, service does not exist", request.ServiceId) - return &pb.GetAllSchemaResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), - }, nil - } schemasList := service.Schemas if len(schemasList) == 0 { @@ -2301,15 +2297,15 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema microService, err := serviceUtil.GetService(ctx, domainProject, serviceID) if err != nil { - log.Errorf(err, "modify schema[%s/%s] failed, get `microService failed, operator: %s", - serviceID, schemaID, remoteIP) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("microService does not exist, modify schema[%s/%s] failed, operator: %s", + serviceID, schemaID, remoteIP)) + return pb.NewError(pb.ErrServiceNotExists, "Service does not exist") + } + log.Error(fmt.Sprintf("modify schema[%s/%s] failed, get `microService failed, operator: %s", + serviceID, schemaID, remoteIP), err) return pb.NewError(pb.ErrInternal, err.Error()) } - if microService == nil { - log.Errorf(nil, "modify schema[%s/%s] failed, microService does not exist, operator: %s", - serviceID, schemaID, remoteIP) - return pb.NewError(pb.ErrServiceNotExists, "Service does not exist") - } var pluginOps []client.PluginOp isExist := isExistSchemaID(microService, []*pb.Schema{schema}) @@ -2399,23 +2395,22 @@ func (ds *DataSource) DeleteServicePri(ctx context.Context, serviceID string, fo if serviceID == core.Service.ServiceId { err := errors.New("not allow to delete service center") - log.Errorf(err, "%s micro-service[%s] failed, operator: %s", title, serviceID, remoteIP) + log.Error(fmt.Sprintf("%s micro-service[%s] failed, operator: %s", title, serviceID, remoteIP), err) return pb.CreateResponse(pb.ErrInvalidParams, err.Error()), nil } microservice, err := serviceUtil.GetService(ctx, domainProject, serviceID) if err != nil { - log.Errorf(err, "%s micro-service[%s] failed, get service file failed, operator: %s", - title, serviceID, remoteIP) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service does not exist, %s micro-service[%s] failed, operator: %s", + title, serviceID, remoteIP)) + return pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), nil + } + log.Error(fmt.Sprintf("%s micro-service[%s] failed, get service file failed, operator: %s", + title, serviceID, remoteIP), err) return pb.CreateResponse(pb.ErrInternal, err.Error()), err } - if microservice == nil { - log.Errorf(err, "%s micro-service[%s] failed, service does not exist, operator: %s", - title, serviceID, remoteIP) - return pb.CreateResponse(pb.ErrServiceNotExists, "Service does not exist."), nil - } - // 强制删除,则与该服务相关的信息删除,非强制删除: 如果作为该被依赖(作为provider,提供服务,且不是只存在自依赖)或者存在实例,则不能删除 if !force { dr := serviceUtil.NewProviderDependencyRelation(ctx, domainProject, microservice) diff --git a/datasource/etcd/util.go b/datasource/etcd/util.go index 4b21e9d..cfb549d 100644 --- a/datasource/etcd/util.go +++ b/datasource/etcd/util.go @@ -24,7 +24,6 @@ import ( "time" "github.com/apache/servicecomb-service-center/datasource" - "github.com/apache/servicecomb-service-center/datasource/etcd/client" "github.com/apache/servicecomb-service-center/datasource/etcd/kv" "github.com/apache/servicecomb-service-center/datasource/etcd/path" @@ -192,7 +191,7 @@ func preProcessRegisterInstance(ctx context.Context, instance *pb.MicroServiceIn domainProject := util.ParseDomainProject(ctx) microservice, err := serviceUtil.GetService(ctx, domainProject, instance.ServiceId) - if microservice == nil || err != nil { + if err != nil { return pb.NewError(pb.ErrServiceNotExists, "Invalid 'serviceID' in request body.") } instance.Version = microservice.Version diff --git a/datasource/etcd/util/dependency_query.go b/datasource/etcd/util/dependency_query.go index 4092f97..5e30ede 100644 --- a/datasource/etcd/util/dependency_query.go +++ b/datasource/etcd/util/dependency_query.go @@ -19,13 +19,14 @@ package util import ( "context" + "errors" "fmt" "strings" - "github.com/apache/servicecomb-service-center/datasource/etcd/path" - + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" "github.com/apache/servicecomb-service-center/datasource/etcd/kv" + "github.com/apache/servicecomb-service-center/datasource/etcd/path" "github.com/apache/servicecomb-service-center/pkg/log" "github.com/apache/servicecomb-service-center/pkg/util" pb "github.com/go-chassis/cari/discovery" @@ -90,13 +91,13 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF for _, providerID := range providerIDs { provider, err := GetService(dr.ctx, key.Tenant, providerID) if err != nil { - log.Warnf("get provider[%s/%s/%s/%s] failed", - key.Environment, key.AppId, key.ServiceName, key.Version) - continue - } - if provider == nil { - log.Warnf("provider[%s/%s/%s/%s] does not exist", - key.Environment, key.AppId, key.ServiceName, key.Version) + if errors.Is(err, datasource.ErrNoData) { + log.Warn(fmt.Sprintf("provider[%s/%s/%s/%s] does not exist", + key.Environment, key.AppId, key.ServiceName, key.Version)) + } else { + log.Warn(fmt.Sprintf("get provider[%s/%s/%s/%s] failed", + key.Environment, key.AppId, key.ServiceName, key.Version)) + } continue } if op.NonSelf && providerID == dr.consumer.ServiceId { @@ -202,12 +203,13 @@ func (dr *DependencyRelation) GetDependencyConsumers(opts ...DependencyRelationF service, err := dr.GetServiceByMicroServiceKey(consumer) if err != nil { - return nil, err - } - if service == nil { - log.Warnf("consumer[%s/%s/%s/%s] does not exist", - consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version) - continue + if errors.Is(err, datasource.ErrNoData) { + log.Warn(fmt.Sprintf("consumer[%s/%s/%s/%s] does not exist", + consumer.Environment, consumer.AppId, consumer.ServiceName, consumer.Version)) + continue + } else { + return nil, err + } } if op.NonSelf && service.ServiceId == dr.provider.ServiceId { @@ -225,9 +227,9 @@ func (dr *DependencyRelation) GetServiceByMicroServiceKey(service *pb.MicroServi return nil, err } if len(serviceID) == 0 { - log.Warnf("service[%s/%s/%s/%s] not exist", - service.Environment, service.AppId, service.ServiceName, service.Version) - return nil, nil + log.Warn(fmt.Sprintf("service[%s/%s/%s/%s] not exist", + service.Environment, service.AppId, service.ServiceName, service.Version)) + return nil, datasource.ErrNoData } return GetService(dr.ctx, service.Tenant, serviceID) } diff --git a/datasource/etcd/util/dependency_test.go b/datasource/etcd/util/dependency_test.go index f152b40..1e22306 100644 --- a/datasource/etcd/util/dependency_test.go +++ b/datasource/etcd/util/dependency_test.go @@ -19,8 +19,11 @@ package util_test import ( "context" + "errors" + "github.com/stretchr/testify/assert" "testing" + "github.com/apache/servicecomb-service-center/datasource" . "github.com/apache/servicecomb-service-center/datasource/etcd/util" "github.com/go-chassis/cari/discovery" ) @@ -227,10 +230,13 @@ func TestDependency(t *testing.T) { t.Fatalf(`DependencyRelation_GetDependencyConsumers failed`) } - _, err = dr.GetServiceByMicroServiceKey(&discovery.MicroServiceKey{}) - if err != nil { - t.Fatalf(`DependencyRelation_getServiceByMicroServiceKey failed`) - } + t.Run("GetServiceByMicroServiceKey when service not exist", func(t *testing.T) { + _, err = dr.GetServiceByMicroServiceKey(&discovery.MicroServiceKey{}) + if err != nil && !errors.Is(err, datasource.ErrNoData) { + t.Fatalf(`DependencyRelation_getServiceByMicroServiceKey failed`) + } + assert.Equal(t, datasource.ErrNoData, err, "service not exist") + }) _, err = dr.GetConsumerOfSameServiceNameAndAppID(&discovery.MicroServiceKey{}) if err != nil { diff --git a/datasource/etcd/util/microservice_util.go b/datasource/etcd/util/microservice_util.go index 5e71c6b..2d76525 100644 --- a/datasource/etcd/util/microservice_util.go +++ b/datasource/etcd/util/microservice_util.go @@ -20,12 +20,13 @@ package util import ( "context" "encoding/json" + "fmt" "strings" - "github.com/apache/servicecomb-service-center/datasource/etcd/path" - + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" "github.com/apache/servicecomb-service-center/datasource/etcd/kv" + "github.com/apache/servicecomb-service-center/datasource/etcd/path" "github.com/apache/servicecomb-service-center/datasource/etcd/sd" "github.com/apache/servicecomb-service-center/pkg/log" "github.com/apache/servicecomb-service-center/pkg/util" @@ -45,7 +46,7 @@ func GetServiceWithRev(ctx context.Context, domain string, id string, rev int64) return nil, err } if len(serviceResp.Kvs) == 0 { - return nil, nil + return nil, datasource.ErrNoData } return serviceResp.Kvs[0].Value.(*pb.MicroService), nil } @@ -58,7 +59,7 @@ func GetService(ctx context.Context, domainProject string, serviceID string) (*p return nil, err } if len(serviceResp.Kvs) == 0 { - return nil, nil + return nil, datasource.ErrNoData } return serviceResp.Kvs[0].Value.(*pb.MicroService), nil } @@ -108,7 +109,7 @@ func GetAllServicesAcrossDomainProject(ctx context.Context) (map[string][]*pb.Mi domainProject := parts[4] + path.SPLIT + parts[5] microService, ok := value.Value.(*pb.MicroService) if !ok { - log.Errorf(nil, "backend key[%s]'s value is not type *pb.MicroService", prefix) + log.Error(fmt.Sprintf("backend key[%s]'s value is not type *pb.MicroService", prefix), nil) continue } services[domainProject] = append(services[domainProject], microService) @@ -135,8 +136,8 @@ func GetServiceID(ctx context.Context, key *pb.MicroServiceKey) (serviceID strin } if len(serviceID) == 0 { // 别名查询 - log.Debugf("could not search microservice[%s/%s/%s/%s] id by 'serviceName', now try 'alias'", - key.Environment, key.AppId, key.ServiceName, key.Version) + log.Debug(fmt.Sprintf("could not search microservice[%s/%s/%s/%s] id by 'serviceName', now try 'alias'", + key.Environment, key.AppId, key.ServiceName, key.Version)) return searchServiceIDFromAlias(ctx, key) } return @@ -256,7 +257,7 @@ func UpdateService(domainProject string, serviceID string, service *pb.MicroServ key := path.GenerateServiceKey(domainProject, serviceID) data, err := json.Marshal(service) if err != nil { - log.Errorf(err, "marshal service file failed") + log.Error("marshal service file failed", err) return } opt = client.OpPut(client.WithStrKey(key), client.WithValue(data)) diff --git a/datasource/etcd/util/rule_util.go b/datasource/etcd/util/rule_util.go index 8666f4c..f8fb9e2 100644 --- a/datasource/etcd/util/rule_util.go +++ b/datasource/etcd/util/rule_util.go @@ -19,15 +19,16 @@ package util import ( "context" + "errors" "fmt" "reflect" "regexp" "strings" - "github.com/apache/servicecomb-service-center/datasource/etcd/path" - + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" "github.com/apache/servicecomb-service-center/datasource/etcd/kv" + "github.com/apache/servicecomb-service-center/datasource/etcd/path" "github.com/apache/servicecomb-service-center/pkg/log" "github.com/apache/servicecomb-service-center/pkg/util" apt "github.com/apache/servicecomb-service-center/server/core" @@ -42,7 +43,7 @@ type RuleFilter struct { func (rf *RuleFilter) Filter(ctx context.Context, consumerID string) (bool, error) { copyCtx := util.WithCacheOnly(util.CloneContext(ctx)) consumer, err := GetService(copyCtx, rf.DomainProject, consumerID) - if consumer == nil { + if err != nil { return false, err } @@ -259,20 +260,20 @@ func Accessible(ctx context.Context, consumerID string, providerID string) *disc consumerService, err := GetService(ctx, domainProject, consumerID) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + return discovery.NewError(discovery.ErrServiceNotExists, "consumer serviceID is invalid") + } return discovery.NewErrorf(discovery.ErrInternal, "An error occurred in query consumer(%s)", err.Error()) } - if consumerService == nil { - return discovery.NewError(discovery.ErrServiceNotExists, "consumer serviceID is invalid") - } // 跨应用权限 providerService, err := GetService(ctx, targetDomainProject, providerID) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + return discovery.NewError(discovery.ErrServiceNotExists, "provider serviceID is invalid") + } return discovery.NewErrorf(discovery.ErrInternal, "An error occurred in query provider(%s)", err.Error()) } - if providerService == nil { - return discovery.NewError(discovery.ErrServiceNotExists, "provider serviceID is invalid") - } err = AllowAcrossDimension(ctx, providerService, consumerService) if err != nil { diff --git a/datasource/etcd/util/rule_util_test.go b/datasource/etcd/util/rule_util_test.go index ba72871..0312eff 100644 --- a/datasource/etcd/util/rule_util_test.go +++ b/datasource/etcd/util/rule_util_test.go @@ -19,9 +19,12 @@ package util_test import ( "context" + "errors" + "github.com/stretchr/testify/assert" "net/http" "testing" + "github.com/apache/servicecomb-service-center/datasource" . "github.com/apache/servicecomb-service-center/datasource/etcd/util" "github.com/apache/servicecomb-service-center/pkg/util" "github.com/go-chassis/cari/discovery" @@ -32,21 +35,31 @@ func TestRuleFilter_Filter(t *testing.T) { DomainProject: "", ProviderRules: []*discovery.ServiceRule{}, } - _, err := rf.Filter(context.Background(), "") - if err != nil { - t.Fatalf("RuleFilter Filter failed") - } - _, _, err = rf.FilterAll(context.Background(), []string{""}) - if err != nil { - t.Fatalf("RuleFilter FilterAll failed") - } + var err error + t.Run("when there is no such a customer in db", func(t *testing.T) { + _, err = rf.Filter(context.Background(), "") + if err != nil && !errors.Is(err, datasource.ErrNoData) { + t.Fatalf("RuleFilter Filter failed") + } + assert.Equal(t, datasource.ErrNoData, err, "no data found") + }) + t.Run("FilterAll when customer not exist", func(t *testing.T) { + _, _, err = rf.FilterAll(context.Background(), []string{""}) + if err != nil && !errors.Is(err, datasource.ErrNoData) { + t.Fatalf("RuleFilter FilterAll failed") + } + assert.Equal(t, nil, err, "no customer found err is nil") + }) rf.ProviderRules = []*discovery.ServiceRule{ {}, } - _, _, err = rf.FilterAll(context.Background(), []string{""}) - if err != nil { - t.Fatalf("RuleFilter FilterAll failed") - } + t.Run("FilterAll when ProviderRules not nil and service not exist", func(t *testing.T) { + _, _, err = rf.FilterAll(context.Background(), []string{""}) + if err != nil && !errors.Is(err, datasource.ErrNoData) { + t.Fatalf("RuleFilter FilterAll failed") + } + assert.Equal(t, datasource.ErrNoData, err, "no customer found when FilterAll") + }) } func TestGetRulesUtil(t *testing.T) { diff --git a/datasource/etcd/util/util_suite_test.go b/datasource/etcd/util/util_suite_test.go index 4cb7774..ac69588 100644 --- a/datasource/etcd/util/util_suite_test.go +++ b/datasource/etcd/util/util_suite_test.go @@ -20,8 +20,11 @@ package util_test // initialize import ( "context" + "errors" + "github.com/stretchr/testify/assert" "testing" + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" _ "github.com/apache/servicecomb-service-center/test" @@ -66,10 +69,14 @@ func TestFindServiceIds(t *testing.T) { } func TestGetService(t *testing.T) { - _, err := serviceUtil.GetService(context.Background(), "", "") - if err != nil { - t.Fatalf("TestGetService failed") - } + var err error + t.Run("when there is no such a service in db", func(t *testing.T) { + _, err = serviceUtil.GetService(context.Background(), "", "") + if err != nil && !errors.Is(err, datasource.ErrNoData) { + t.Fatalf("TestGetService failed") + } + assert.Equal(t, datasource.ErrNoData, err) + }) _, err = serviceUtil.GetServicesByDomainProject(context.Background(), "") if err != nil { @@ -81,10 +88,13 @@ func TestGetService(t *testing.T) { t.Fatalf("TestGetService failed") } - _, err = serviceUtil.GetServiceWithRev(context.Background(), "", "", 0) - if err != nil { - t.Fatalf("TestGetService failed") - } + t.Run("when there is no such a service in db", func(t *testing.T) { + _, err = serviceUtil.GetServiceWithRev(context.Background(), "", "", 0) + if err != nil && !errors.Is(err, datasource.ErrNoData) { + t.Fatalf("TestGetService failed") + } + assert.Equal(t, datasource.ErrNoData, err) + }) //_, err = serviceUtil.GetServiceWithRev(context.Background(), "", "", 1) //if err != nil { diff --git a/datasource/mongo/client/errortypes.go b/datasource/mongo/client/errortypes.go index 9d7311a..3c86420 100644 --- a/datasource/mongo/client/errortypes.go +++ b/datasource/mongo/client/errortypes.go @@ -43,6 +43,6 @@ func IsDuplicateKey(err error) bool { return false } -func IsNoneDoc(err error) bool { +func IsNoneDocErr(err error) bool { return err == ErrNoDocuments } diff --git a/datasource/mongo/dep.go b/datasource/mongo/dep.go index 0566c5b..fe0467d 100644 --- a/datasource/mongo/dep.go +++ b/datasource/mongo/dep.go @@ -19,6 +19,7 @@ package mongo import ( "context" + "errors" "fmt" pb "github.com/go-chassis/cari/discovery" @@ -36,15 +37,15 @@ func (ds *DataSource) SearchProviderDependency(ctx context.Context, request *pb. filter := GeneratorServiceFilter(ctx, providerServiceID) provider, err := GetService(ctx, filter) if err != nil { - log.Error("GetProviderDependencies failed, provider is "+providerServiceID, err) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("query provider service failed, there is no provider %s in db", providerServiceID)) + return &pb.GetProDependenciesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Provider does not exist"), + }, nil + } + log.Error(fmt.Sprintf("query provider from db error, provider is %s", providerServiceID), err) return nil, err } - if provider == nil { - log.Error(fmt.Sprintf("GetProviderDependencies failed for provider %s", providerServiceID), err) - return &pb.GetProDependenciesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Provider does not exist"), - }, nil - } dr := NewProviderDependencyRelation(ctx, domainProject, provider.ServiceInfo) services, err := dr.GetDependencyConsumers(ToDependencyFilterOptions(request)...) @@ -69,20 +70,20 @@ func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request *pb. filter := GeneratorServiceFilter(ctx, consumerID) consumer, err := GetService(ctx, filter) if err != nil { - log.Error(fmt.Sprintf("GetConsumerDependencies failed, consumer is %s", consumerID), err) + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("query consumer service failed, there is no consumer %s in db", consumerID)) + return &pb.GetConDependenciesResponse{ + Response: pb.CreateResponse(pb.ErrServiceNotExists, "Consumer does not exist"), + }, nil + } + log.Error(fmt.Sprintf("query consumer from db error, consumer is %s", consumerID), err) return nil, err } - if consumer == nil { - log.Error(fmt.Sprintf("GetConsumerDependencies failed for consumer %s does not exist", consumerID), err) - return &pb.GetConDependenciesResponse{ - Response: pb.CreateResponse(pb.ErrServiceNotExists, "Consumer does not exist"), - }, nil - } dr := NewConsumerDependencyRelation(ctx, domainProject, consumer.ServiceInfo) services, err := dr.GetDependencyProviders(ToDependencyFilterOptions(request)...) if err != nil { - log.Error(fmt.Sprintf("GetConsumerDependencies failed, consumer is %s/%s/%s/%s", + log.Error(fmt.Sprintf("query consumer failed, consumer is %s/%s/%s/%s", consumer.ServiceInfo.Environment, consumer.ServiceInfo.AppId, consumer.ServiceInfo.ServiceName, consumer.ServiceInfo.Version), err) return &pb.GetConDependenciesResponse{ Response: pb.CreateResponse(pb.ErrInternal, err.Error()), @@ -90,7 +91,7 @@ func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request *pb. } return &pb.GetConDependenciesResponse{ - Response: pb.CreateResponse(pb.ResponseSuccess, "Get all providers successfully."), + Response: pb.CreateResponse(pb.ResponseSuccess, "get all providers successfully."), Providers: services, }, nil } diff --git a/datasource/mongo/dependency_query.go b/datasource/mongo/dependency_query.go index 8025aba..db91d47 100644 --- a/datasource/mongo/dependency_query.go +++ b/datasource/mongo/dependency_query.go @@ -19,9 +19,11 @@ package mongo import ( "context" + "errors" "fmt" "strings" + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/mongo/client" "github.com/apache/servicecomb-service-center/pkg/log" pb "github.com/go-chassis/cari/discovery" @@ -86,13 +88,13 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF filter := GeneratorServiceFilter(dr.ctx, providerID) provider, err := GetService(dr.ctx, filter) if err != nil { - log.Warn(fmt.Sprintf("get provider[%s/%s/%s/%s] failed", - key.Environment, key.AppId, key.ServiceName, key.Version)) - continue - } - if provider == nil { - log.Warn(fmt.Sprintf("provider[%s/%s/%s/%s] does not exist", - key.Environment, key.AppId, key.ServiceName, key.Version)) + if errors.Is(err, datasource.ErrNoData) { + log.Warn(fmt.Sprintf("provider[%s/%s/%s/%s] does not exist", + key.Environment, key.AppId, key.ServiceName, key.Version)) + } else { + log.Warn(fmt.Sprintf("get provider[%s/%s/%s/%s] failed", + key.Environment, key.AppId, key.ServiceName, key.Version)) + } continue } if op.NonSelf && providerID == dr.consumer.ServiceId { diff --git a/datasource/mongo/event/instance_event_handler.go b/datasource/mongo/event/instance_event_handler.go index e9ecf12..c870b8a 100644 --- a/datasource/mongo/event/instance_event_handler.go +++ b/datasource/mongo/event/instance_event_handler.go @@ -19,6 +19,7 @@ package event import ( "context" + "errors" "fmt" "github.com/apache/servicecomb-service-center/datasource" @@ -56,11 +57,11 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) { log.Info("get cached service failed, then get from database") service, err := mongo.GetService(context.Background(), bson.M{"serviceinfo.serviceid": providerID}) if err != nil { - log.Error("query database error", err) - return - } - if service == nil { - log.Warn(fmt.Sprintf("there is no service with id [%s] in the database", providerID)) + if errors.Is(err, datasource.ErrNoData) { + log.Warn(fmt.Sprintf("there is no service with id [%s] in the database", providerID)) + } else { + log.Error("query database error", err) + } return } microService = service.ServiceInfo // service in the cache may not ready, query from db once diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go index 6911e66..d60a9d8 100644 --- a/datasource/mongo/ms.go +++ b/datasource/mongo/ms.go @@ -173,19 +173,20 @@ func (ds *DataSource) GetService(ctx context.Context, request *discovery.GetServ *discovery.GetServiceResponse, error) { svc, err := GetServiceByID(ctx, request.ServiceId) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId)) + return &discovery.GetServiceResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist."), + }, nil + } log.Error(fmt.Sprintf("failed to get single service %s from mongo", request.ServiceId), err) return &discovery.GetServiceResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, "get service data from mongodb failed."), }, err } - if svc != nil { - return &discovery.GetServiceResponse{ - Response: discovery.CreateResponse(discovery.ResponseSuccess, "Get service successfully."), - Service: svc.ServiceInfo, - }, nil - } return &discovery.GetServiceResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist."), + Response: discovery.CreateResponse(discovery.ResponseSuccess, "Get service successfully."), + Service: svc.ServiceInfo, }, nil } @@ -266,17 +267,17 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force log.Error(fmt.Sprintf("%s micro-service %s failed, operator: %s", title, serviceID, remoteIP), ErrNotAllowDeleteSC) return discovery.CreateResponse(discovery.ErrInvalidParams, ErrNotAllowDeleteSC.Error()), nil } - microservice, err := GetService(ctx, GeneratorServiceFilter(ctx, serviceID)) + _, err := GetService(ctx, GeneratorServiceFilter(ctx, serviceID)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("%s micro-service %s failed, service does not exist, operator: %s", + title, serviceID, remoteIP)) + return discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist."), nil + } log.Error(fmt.Sprintf("%s micro-service %s failed, get service file failed, operator: %s", title, serviceID, remoteIP), err) return discovery.CreateResponse(discovery.ErrInternal, err.Error()), err } - if microservice == nil { - log.Error(fmt.Sprintf("%s micro-service %s failed, service does not exist, operator: %s", - title, serviceID, remoteIP), err) - return discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist."), nil - } // 强制删除,则与该服务相关的信息删除,非强制删除: 如果作为该被依赖(作为provider,提供服务,且不是只存在自依赖)或者存在实例,则不能删除 if !force { //todo wait for dep interface @@ -347,15 +348,15 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *discovery.G *discovery.GetServiceDetailResponse, error) { mgSvc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + return &discovery.GetServiceDetailResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist."), + }, nil + } return &discovery.GetServiceDetailResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if mgSvc == nil { - return &discovery.GetServiceDetailResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist."), - }, nil - } svc := mgSvc.ServiceInfo key := &discovery.MicroServiceKey{ Environment: svc.Environment, @@ -460,14 +461,15 @@ func (ds *DataSource) AddTags(ctx context.Context, request *discovery.AddService remoteIP := util.GetIPFromContext(ctx) service, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId)) + return &discovery.AddServiceTagsResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil + } log.Error(fmt.Sprintf("failed to add tags for service %s for get service failed", request.ServiceId), err) return &discovery.AddServiceTagsResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, "Failed to check service exist"), }, nil } - if service == nil { - return &discovery.AddServiceTagsResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil - } tags := request.Tags res := quota.NewApplyQuotaResource(quota.TagQuotaType, util.ParseDomainProject(ctx), request.ServiceId, int64(len(tags))) rst := quota.Apply(ctx, res) @@ -504,16 +506,17 @@ func (ds *DataSource) AddTags(ctx context.Context, request *discovery.AddService func (ds *DataSource) GetTags(ctx context.Context, request *discovery.GetServiceTagsRequest) (*discovery.GetServiceTagsResponse, error) { svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId)) + return &discovery.GetServiceTagsResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist"), + }, nil + } log.Error(fmt.Sprintf("failed to get service %s tags", request.ServiceId), err) return &discovery.GetServiceTagsResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, nil } - if svc == nil { - return &discovery.GetServiceTagsResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist"), - }, nil - } return &discovery.GetServiceTagsResponse{ Response: discovery.CreateResponse(discovery.ResponseSuccess, "Get service tags successfully."), Tags: svc.Tags, @@ -523,16 +526,17 @@ func (ds *DataSource) GetTags(ctx context.Context, request *discovery.GetService func (ds *DataSource) UpdateTag(ctx context.Context, request *discovery.UpdateServiceTagRequest) (*discovery.UpdateServiceTagResponse, error) { svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId)) + return &discovery.UpdateServiceTagResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist"), + }, nil + } log.Error(fmt.Sprintf("failed to get %s tags", request.ServiceId), err) return &discovery.UpdateServiceTagResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, nil } - if svc == nil { - return &discovery.UpdateServiceTagResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist"), - }, nil - } dataTags := svc.Tags if len(dataTags) > 0 { if _, ok := dataTags[request.Key]; !ok { @@ -562,16 +566,17 @@ func (ds *DataSource) UpdateTag(ctx context.Context, request *discovery.UpdateSe func (ds *DataSource) DeleteTags(ctx context.Context, request *discovery.DeleteServiceTagsRequest) (*discovery.DeleteServiceTagsResponse, error) { svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId)) + return &discovery.DeleteServiceTagsResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist"), + }, nil + } log.Error(fmt.Sprintf("failed to get service %s tags", request.ServiceId), err) return &discovery.DeleteServiceTagsResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, nil } - if svc == nil { - return &discovery.DeleteServiceTagsResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service does not exist"), - }, nil - } dataTags := svc.Tags newTags := make(map[string]string, len(dataTags)) for k, v := range dataTags { @@ -632,16 +637,17 @@ func (ds *DataSource) GetSchema(ctx context.Context, request *discovery.GetSchem func (ds *DataSource) GetAllSchemas(ctx context.Context, request *discovery.GetAllSchemaRequest) (*discovery.GetAllSchemaResponse, error) { svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId)) + return &discovery.GetAllSchemaResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "GetAllSchemas failed for service not exist"), + }, nil + } log.Error(fmt.Sprintf("get service[%s] all schemas failed, get service failed", request.ServiceId), err) return &discovery.GetAllSchemaResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if svc == nil { - return &discovery.GetAllSchemaResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "GetAllSchemas failed for service not exist"), - }, nil - } schemasList := svc.ServiceInfo.Schemas if len(schemasList) == 0 { return &discovery.GetAllSchemaResponse{ @@ -764,11 +770,11 @@ func (ds *DataSource) ModifySchema(ctx context.Context, request *discovery.Modif func (ds *DataSource) ModifySchemas(ctx context.Context, request *discovery.ModifySchemasRequest) (*discovery.ModifySchemasResponse, error) { svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + return &discovery.ModifySchemasResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil + } return &discovery.ModifySchemasResponse{Response: discovery.CreateResponse(discovery.ErrInternal, err.Error())}, err } - if svc == nil { - return &discovery.ModifySchemasResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil - } respErr := ds.modifySchemas(ctx, svc.ServiceInfo, request.Schemas) if respErr != nil { resp := &discovery.ModifySchemasResponse{ @@ -905,11 +911,11 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema remoteIP := util.GetIPFromContext(ctx) svc, err := GetService(ctx, GeneratorServiceFilter(ctx, serviceID)) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + return discovery.NewError(discovery.ErrServiceNotExists, "Service does not exist.") + } return discovery.NewError(discovery.ErrInternal, err.Error()) } - if svc == nil { - return discovery.NewError(discovery.ErrServiceNotExists, "Service does not exist.") - } microservice := svc.ServiceInfo var isExist bool for _, sid := range microservice.Schemas { @@ -1188,7 +1194,7 @@ func GetService(ctx context.Context, filter bson.M) (*Service, error) { var svc *Service if findRes.Err() != nil { //not get any service,not db err - return nil, nil + return nil, datasource.ErrNoData } err = findRes.Decode(&svc) if err != nil { @@ -1529,39 +1535,39 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *discovery.GetOne filter := GeneratorServiceFilter(ctx, request.ConsumerServiceId) service, err = GetService(ctx, filter) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider instance %s %s", + request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)) + return &discovery.GetOneInstanceResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, + fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), + }, nil + } log.Error(fmt.Sprintf(" get consumer failed, consumer %s find provider instance %s", request.ConsumerServiceId, request.ProviderInstanceId), err) return &discovery.GetOneInstanceResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if service == nil { - log.Error(fmt.Sprintf("consumer does not exist, consumer %s find provider instance %s %s", - request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err) - return &discovery.GetOneInstanceResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, - fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), - }, nil - } } filter := GeneratorServiceFilter(ctx, request.ProviderServiceId) provider, err := GetService(ctx, filter) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("provider does not exist, consumer %s find provider instance %s %s", + request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId)) + return &discovery.GetOneInstanceResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, + fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)), + }, nil + } log.Error(fmt.Sprintf("get provider failed, consumer %s find provider instance %s %s", request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err) return &discovery.GetOneInstanceResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if provider == nil { - log.Error(fmt.Sprintf("provider does not exist, consumer %s find provider instance %s %s", - request.ConsumerServiceId, request.ProviderServiceId, request.ProviderInstanceId), err) - return &discovery.GetOneInstanceResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, - fmt.Sprintf("Provider[%s] does not exist.", request.ProviderServiceId)), - }, nil - } findFlag := func() string { return fmt.Sprintf("consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instance[%s]", request.ConsumerServiceId, service.ServiceInfo.Environment, service.ServiceInfo.AppId, service.ServiceInfo.ServiceName, service.ServiceInfo.Version, @@ -1608,38 +1614,38 @@ func (ds *DataSource) GetInstances(ctx context.Context, request *discovery.GetIn if len(request.ConsumerServiceId) > 0 { service, err = GetServiceByID(ctx, request.ConsumerServiceId) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s instances", + request.ConsumerServiceId, request.ProviderServiceId)) + return &discovery.GetInstancesResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, + fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), + }, nil + } log.Error(fmt.Sprintf("get consumer failed, consumer %s find provider %s instances", request.ConsumerServiceId, request.ProviderServiceId), err) return &discovery.GetInstancesResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if service == nil { - log.Error(fmt.Sprintf("consumer does not exist, consumer %s find provider %s instances", - request.ConsumerServiceId, request.ProviderServiceId), err) - return &discovery.GetInstancesResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, - fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), - }, nil - } } provider, err := GetServiceByID(ctx, request.ProviderServiceId) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("provider does not exist, consumer %s find provider %s instances", + request.ConsumerServiceId, request.ProviderServiceId)) + return &discovery.GetInstancesResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, + fmt.Sprintf("provider[%s] does not exist.", request.ProviderServiceId)), + }, nil + } log.Error(fmt.Sprintf("get provider failed, consumer %s find provider instances %s", request.ConsumerServiceId, request.ProviderServiceId), err) return &discovery.GetInstancesResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if provider == nil { - log.Error(fmt.Sprintf("provider does not exist, consumer %s find provider %s instances", - request.ConsumerServiceId, request.ProviderServiceId), err) - return &discovery.GetInstancesResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, - fmt.Sprintf("provider[%s] does not exist.", request.ProviderServiceId)), - }, nil - } findFlag := func() string { return fmt.Sprintf("consumer[%s][%s/%s/%s/%s] find provider[%s][%s/%s/%s/%s] instances", @@ -2052,20 +2058,20 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI filter := GeneratorServiceFilter(ctx, request.ConsumerServiceId) service, err = GetService(ctx, filter) if err != nil { + if errors.Is(err, datasource.ErrNoData) { + log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s/%s/%s/%s", + request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule)) + return &discovery.FindInstancesResponse{ + Response: discovery.CreateResponse(discovery.ErrServiceNotExists, + fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), + }, nil + } log.Error(fmt.Sprintf("get consumer failed, consumer %s find provider %s/%s/%s/%s", request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule), err) return &discovery.FindInstancesResponse{ Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()), }, err } - if service == nil { - log.Error(fmt.Sprintf("consumer does not exist, consumer %s find provider %s/%s/%s/%s", - request.ConsumerServiceId, request.Environment, request.AppId, request.ServiceName, request.VersionRule), err) - return &discovery.FindInstancesResponse{ - Response: discovery.CreateResponse(discovery.ErrServiceNotExists, - fmt.Sprintf("Consumer[%s] does not exist.", request.ConsumerServiceId)), - }, nil - } provider.Environment = service.ServiceInfo.Environment } @@ -2142,7 +2148,7 @@ func (ds *DataSource) reshapeProviderKey(ctx context.Context, provider *discover //维护version的规则,service name 可能是别名,所以重新获取 filter := GeneratorServiceFilter(ctx, providerID) providerService, err := GetService(ctx, filter) - if providerService == nil { + if err != nil { return nil, err } @@ -2369,7 +2375,7 @@ func preProcessRegisterInstance(ctx context.Context, instance *discovery.MicroSe filter := GeneratorServiceFilter(ctx, instance.ServiceId) microservice, err := GetService(ctx, filter) - if microservice == nil || err != nil { + if err != nil { return discovery.NewError(discovery.ErrServiceNotExists, "invalid 'serviceID' in request body.") } instance.Version = microservice.ServiceInfo.Version diff --git a/server/broker/service.go b/server/broker/service.go index d7055a8..58eec98 100644 --- a/server/broker/service.go +++ b/server/broker/service.go @@ -18,15 +18,17 @@ package broker import ( + "context" "crypto/sha1" "encoding/json" + "errors" + "fmt" "math" "strconv" "strings" "time" - "context" - + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" serviceUtil "github.com/apache/servicecomb-service-center/datasource/etcd/util" "github.com/apache/servicecomb-service-center/pkg/log" @@ -117,17 +119,17 @@ func (*Service) RetrieveProviderPacts(ctx context.Context, provider, err := serviceUtil.GetService(ctx, tenant, in.ProviderId) if err != nil { - PactLogger.Errorf(err, "all provider pact retrieve failed, providerId is %s: query provider failed.", in.ProviderId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("all provider pact retrieve failed, providerId is %s: provider not exist.", in.ProviderId)) + return &brokerpb.GetAllProviderPactsResponse{ + Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider does not exist."), + }, nil + } + PactLogger.Error(fmt.Sprintf("all provider pact retrieve failed, providerId is %s: query provider failed.", in.ProviderId), err) return &brokerpb.GetAllProviderPactsResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Query provider failed."), }, err } - if provider == nil { - PactLogger.Errorf(nil, "all provider pact retrieve failed, providerId is %s: provider not exist.", in.ProviderId) - return &brokerpb.GetAllProviderPactsResponse{ - Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider does not exist."), - }, nil - } // Get the provider participant //providerParticipantKey := apt.GenerateBrokerParticipantKey(tenant, provider.AppId, provider.ServiceName) providerParticipant, err := GetParticipant(ctx, tenant, provider.AppId, provider.ServiceName) @@ -270,17 +272,17 @@ func (*Service) GetAllProviderPacts(ctx context.Context, provider, err := serviceUtil.GetService(ctx, tenant, in.ProviderId) if err != nil { - PactLogger.Errorf(err, "all provider pact retrieve failed, providerId is %s: query provider failed.", in.ProviderId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("all provider pact retrieve failed, providerId is %s: provider not exist.", in.ProviderId)) + return &brokerpb.GetAllProviderPactsResponse{ + Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider does not exist."), + }, nil + } + PactLogger.Error(fmt.Sprintf("all provider pact retrieve failed, providerId is %s: query provider failed.", in.ProviderId), err) return &brokerpb.GetAllProviderPactsResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Query provider failed."), }, err } - if provider == nil { - PactLogger.Errorf(nil, "all provider pact retrieve failed, providerId is %s: provider not exist.", in.ProviderId) - return &brokerpb.GetAllProviderPactsResponse{ - Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider does not exist."), - }, nil - } // Get the provider participant //providerParticipantKey := apt.GenerateBrokerParticipantKey(tenant, provider.AppId, provider.ServiceName) providerParticipant, err := GetParticipant(ctx, tenant, provider.AppId, provider.ServiceName) @@ -420,17 +422,17 @@ func (*Service) RetrieveVerificationResults(ctx context.Context, in *brokerpb.Re tenant := GetDefaultTenantProject() consumer, err := serviceUtil.GetService(ctx, tenant, in.ConsumerId) if err != nil { - PactLogger.Errorf(err, "verification result retrieve request failed, consumerID is %s: query consumer failed.", in.ConsumerId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("verification result retrieve request failed, consumerID is %s: consumer not exist.", in.ConsumerId)) + return &brokerpb.RetrieveVerificationResponse{ + Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer does not exist."), + }, nil + } + PactLogger.Error(fmt.Sprintf("verification result retrieve request failed, consumerID is %s: query consumer failed.", in.ConsumerId), err) return &brokerpb.RetrieveVerificationResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Query consumer failed."), }, err } - if consumer == nil { - PactLogger.Errorf(nil, "verification result retrieve request failed, consumerID is %s: consumer not exist.", in.ConsumerId) - return &brokerpb.RetrieveVerificationResponse{ - Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer does not exist."), - }, nil - } PactLogger.Infof("Consumer service found: (%s, %s, %s, %s)", consumer.ServiceId, consumer.AppId, consumer.ServiceName, consumer.Version) // Get consumer participant consumerParticipant, err := GetParticipant(ctx, tenant, consumer.AppId, consumer.ServiceName) @@ -595,18 +597,18 @@ func (*Service) PublishVerificationResults(ctx context.Context, in *brokerpb.Pub tenant := GetDefaultTenantProject() consumer, err := serviceUtil.GetService(ctx, tenant, in.ConsumerId) if err != nil { - PactLogger.Errorf(err, "verification result publish request failed, consumerID is %s: query consumer failed.", in.ConsumerId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("verification result publish request failed, consumerID is %s: consumer not exist.", in.ConsumerId)) + return &brokerpb.PublishVerificationResponse{ + Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer does not exist."), + }, nil + } + PactLogger.Error(fmt.Sprintf("verification result publish request failed, consumerID is %s: query consumer failed.", in.ConsumerId), err) return &brokerpb.PublishVerificationResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Query consumer failed."), }, err } - if consumer == nil { - PactLogger.Errorf(nil, "verification result publish request failed, consumerID is %s: consumer not exist.", in.ConsumerId) - return &brokerpb.PublishVerificationResponse{ - Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer does not exist."), - }, nil - } - PactLogger.Infof("Consumer service found: (%s, %s, %s, %s)", consumer.ServiceId, consumer.AppId, consumer.ServiceName, consumer.Version) + PactLogger.Info(fmt.Sprintf("consumer service found: (%s, %s, %s, %s)", consumer.ServiceId, consumer.AppId, consumer.ServiceName, consumer.Version)) // Get consumer participant consumerParticipant, err := GetParticipant(ctx, tenant, consumer.AppId, consumer.ServiceName) if err != nil || consumerParticipant == nil { @@ -615,7 +617,7 @@ func (*Service) PublishVerificationResults(ctx context.Context, in *brokerpb.Pub Response: pb.CreateResponse(pb.ErrInvalidParams, "consumer participant cannot be searched."), }, err } - PactLogger.Infof("Consumer participant found: (%d, %s, %s)", consumerParticipant.Id, consumerParticipant.AppId, consumerParticipant.ServiceName) + PactLogger.Info(fmt.Sprintf("Consumer participant found: (%d, %s, %s)", consumerParticipant.Id, consumerParticipant.AppId, consumerParticipant.ServiceName)) // Get version version, err := GetVersion(ctx, tenant, consumer.Version, consumerParticipant.Id) if err != nil || version == nil { @@ -744,47 +746,46 @@ func (*Service) PublishPact(ctx context.Context, in *brokerpb.PublishPactRequest provider, err := serviceUtil.GetService(ctx, tenant, in.ProviderId) if err != nil { - PactLogger.Errorf(err, "pact publish failed, providerId is %s: query provider failed.", in.ProviderId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("pact publish failed, providerId is %s: provider not exist.", in.ProviderId)) + return &brokerpb.PublishPactResponse{ + Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider does not exist."), + }, nil + } + PactLogger.Error(fmt.Sprintf("pact publish failed, providerId is %s: query provider failed.", in.ProviderId), err) return &brokerpb.PublishPactResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Query provider failed."), }, err } - if provider == nil { - PactLogger.Errorf(nil, "pact publish failed, providerId is %s: provider not exist.", in.ProviderId) - return &brokerpb.PublishPactResponse{ - Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider does not exist."), - }, nil - } - PactLogger.Infof("Provider service found: (%s, %s, %s, %s)", provider.ServiceId, provider.AppId, provider.ServiceName, provider.Version) + PactLogger.Info(fmt.Sprintf("provider service found: (%s, %s, %s, %s)", provider.ServiceId, provider.AppId, provider.ServiceName, provider.Version)) consumer, err := serviceUtil.GetService(ctx, tenant, in.ConsumerId) if err != nil { - PactLogger.Errorf(err, "pact publish failed, consumerID is %s: query consumer failed.", in.ConsumerId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("pact publish failed, consumerID is %s: consumer not exist.", in.ConsumerId)) + return &brokerpb.PublishPactResponse{ + Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer does not exist."), + }, nil + } + PactLogger.Error(fmt.Sprintf("pact publish failed, consumerID is %s: query consumer failed.", in.ConsumerId), err) return &brokerpb.PublishPactResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Query consumer failed."), }, err } - if consumer == nil { - PactLogger.Errorf(nil, "pact publish failed, consumerID is %s: consumer not exist.", in.ConsumerId) - return &brokerpb.PublishPactResponse{ - Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer does not exist."), - }, nil - } // check that the consumer has that vesion in the url if strings.Compare(consumer.Version, in.Version) != 0 { - log.Errorf(nil, - "pact publish failed, version (%s) does not exist for consmer", in.Version) + log.Error(fmt.Sprintf("pact publish failed, version (%s) does not exist for consmer", in.Version), nil) return &brokerpb.PublishPactResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Consumer Version does not exist."), }, nil } - PactLogger.Infof("Consumer service found: (%s, %s, %s, %s)", consumer.ServiceId, consumer.AppId, consumer.ServiceName, consumer.Version) + PactLogger.Info(fmt.Sprintf("consumer service found: (%s, %s, %s, %s)", consumer.ServiceId, consumer.AppId, consumer.ServiceName, consumer.Version)) // Get or create provider participant providerParticipantKey := GenerateBrokerParticipantKey(tenant, provider.AppId, provider.ServiceName) providerParticipant, err := GetParticipant(ctx, tenant, provider.AppId, provider.ServiceName) if err != nil { - PactLogger.Errorf(nil, "pact publish failed, provider participant cannot be searched.", in.ProviderId) + PactLogger.Error(fmt.Sprintf("pact publish failed, provider[%s] participant cannot be searched.", in.ProviderId), nil) return &brokerpb.PublishPactResponse{ Response: pb.CreateResponse(pb.ErrInvalidParams, "Provider participant cannot be searched."), }, err diff --git a/server/broker/util.go b/server/broker/util.go index f97a94b..66bec20 100644 --- a/server/broker/util.go +++ b/server/broker/util.go @@ -20,11 +20,14 @@ package broker import ( "context" "encoding/json" + "errors" + "fmt" "math" "net/url" "strconv" "strings" + "github.com/apache/servicecomb-service-center/datasource" "github.com/apache/servicecomb-service-center/datasource/etcd/client" serviceUtil "github.com/apache/servicecomb-service-center/datasource/etcd/util" "github.com/apache/servicecomb-service-center/pkg/log" @@ -438,31 +441,31 @@ func RetrieveProviderConsumerPact(ctx context.Context, // Get provider microservice provider, err := serviceUtil.GetService(ctx, tenant, in.ProviderId) if err != nil { - PactLogger.Errorf(err, "pact retrieve failed, providerId is %s: query provider failed.", in.ProviderId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("pact retrieve failed, providerId is %s: provider not exist.", in.ProviderId)) + return &brokerpb.GetProviderConsumerVersionPactResponse{ + Response: pb.CreateResponse(pb.ErrInternal, "Provider does not exist."), + }, -1, nil + } + PactLogger.Error(fmt.Sprintf("pact retrieve failed, providerId is %s: query provider failed.", in.ProviderId), err) return &brokerpb.GetProviderConsumerVersionPactResponse{ Response: pb.CreateResponse(pb.ErrInternal, "Query provider failed."), }, -1, err } - if provider == nil { - PactLogger.Errorf(nil, "pact retrieve failed, providerId is %s: provider not exist.", in.ProviderId) - return &brokerpb.GetProviderConsumerVersionPactResponse{ - Response: pb.CreateResponse(pb.ErrInternal, "Provider does not exist."), - }, -1, nil - } // Get consumer microservice consumer, err := serviceUtil.GetService(ctx, tenant, in.ConsumerId) if err != nil { - PactLogger.Errorf(err, "pact retrieve failed, consumerId is %s: query consumer failed.", in.ConsumerId) + if errors.Is(err, datasource.ErrNoData) { + PactLogger.Debug(fmt.Sprintf("pact retrieve failed, consumerId is %s: consumer not exist.", in.ConsumerId)) + return &brokerpb.GetProviderConsumerVersionPactResponse{ + Response: pb.CreateResponse(pb.ErrInternal, "Consumer does not exist."), + }, -1, nil + } + PactLogger.Error(fmt.Sprintf("pact retrieve failed, consumerId is %s: query consumer failed.", in.ConsumerId), err) return &brokerpb.GetProviderConsumerVersionPactResponse{ Response: pb.CreateResponse(pb.ErrInternal, "Query consumer failed."), }, -1, err } - if consumer == nil { - PactLogger.Errorf(nil, "pact retrieve failed, consumerId is %s: consumer not exist.", in.ConsumerId) - return &brokerpb.GetProviderConsumerVersionPactResponse{ - Response: pb.CreateResponse(pb.ErrInternal, "Consumer does not exist."), - }, -1, nil - } // Get provider participant //providerParticipantKey := apt.GenerateBrokerParticipantKey(tenant, provider.AppId, provider.ServiceName) providerParticipant, err := GetParticipant(ctx, tenant, provider.AppId, provider.ServiceName)