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/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new 56deb73  fix list-watch panic problem (#939)
56deb73 is described below

commit 56deb738c5b26466cc5a707fdc8e87cb0c5f7879
Author: panqian <[email protected]>
AuthorDate: Tue Apr 13 10:39:11 2021 +0800

    fix list-watch panic problem (#939)
---
 datasource/mongo/client/errortypes.go  | 17 +++++++++--------
 datasource/mongo/mongo.go              |  8 ++------
 datasource/mongo/ms.go                 | 12 +++++++++---
 datasource/mongo/sd/listwatch_inner.go |  8 ++++++++
 4 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/datasource/mongo/client/errortypes.go 
b/datasource/mongo/client/errortypes.go
index 759315f..dd3ee56 100644
--- a/datasource/mongo/client/errortypes.go
+++ b/datasource/mongo/client/errortypes.go
@@ -17,22 +17,23 @@ package client
 
 import (
        "go.mongodb.org/mongo-driver/mongo"
+       "strings"
 )
 
 const (
-       DuplicateKey      = 11000
+       DuplicateKey      = "E11000"
        CollectionsExists = 48
 )
 
 func IsDuplicateKey(err error) bool {
+       return strings.Contains(err.Error(), DuplicateKey)
+}
+
+func IsCollectionsExist(err error) bool {
        if err != nil {
-               we, ok := err.(mongo.WriteException)
-               if ok {
-                       for _, wr := range we.WriteErrors {
-                               if wr.Code == DuplicateKey {
-                                       return true
-                               }
-                       }
+               cmdErr, ok := err.(mongo.CommandError)
+               if ok && cmdErr.Code == CollectionsExists {
+                       return true
                }
        }
        return false
diff --git a/datasource/mongo/mongo.go b/datasource/mongo/mongo.go
index 8addf8f..94fec3c 100644
--- a/datasource/mongo/mongo.go
+++ b/datasource/mongo/mongo.go
@@ -210,9 +210,7 @@ func EnsureDep() {
 
 func wrapCreateCollectionError(err error) {
        if err != nil {
-               // commandError can be returned by any operation
-               cmdErr, ok := err.(mongo.CommandError)
-               if ok && cmdErr.Code == client.CollectionsExists {
+               if client.IsCollectionsExist(err) {
                        return
                }
                log.Fatal(fmt.Sprintf("failed to create collection with 
validation, err type: %s", util.Reflect(err).FullName), err)
@@ -221,9 +219,7 @@ func wrapCreateCollectionError(err error) {
 
 func wrapCreateIndexesError(err error) {
        if err != nil {
-               // commandError can be returned by any operation
-               cmdErr, ok := err.(mongo.CommandError)
-               if ok && cmdErr.Code == client.DuplicateKey {
+               if client.IsDuplicateKey(err) {
                        return
                }
                log.Fatal(fmt.Sprintf("failed to create indexes, err type: %s", 
util.Reflect(err).FullName), err)
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 185a3ec..f1f0c6e 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -535,15 +535,15 @@ func (ds *DataSource) GetServicesStatistics(ctx 
context.Context, request *discov
        ctx = util.WithCacheOnly(ctx)
        var st *discovery.Statistics
        var err error
-       st, err  = statistics(ctx, true)
+       st, err = statistics(ctx, true)
        if err != nil {
                return &discovery.GetServicesInfoStatisticsResponse{
                        Response: 
discovery.CreateResponse(discovery.ErrInternal, err.Error()),
                }, err
        }
        return &discovery.GetServicesInfoStatisticsResponse{
-               Response:          
discovery.CreateResponse(discovery.ResponseSuccess, "Get services statistics 
successfully."),
-               Statistics:        st,
+               Response:   discovery.CreateResponse(discovery.ResponseSuccess, 
"Get services statistics successfully."),
+               Statistics: st,
        }, nil
 }
 
@@ -1948,6 +1948,12 @@ func registryInstance(ctx context.Context, request 
*discovery.RegisterInstanceRe
 
        insertRes, err := client.GetMongoClient().Insert(ctx, 
model.CollectionInstance, data)
        if err != nil {
+               if client.IsDuplicateKey(err) {
+                       return &discovery.RegisterInstanceResponse{
+                               Response:   
discovery.CreateResponse(discovery.ResponseSuccess, "Register service instance 
successfully."),
+                               InstanceId: instanceID,
+                       }, nil
+               }
                log.Error(fmt.Sprintf("register instance failed %s instanceID 
%s operator %s", instanceFlag, instanceID, remoteIP), err)
                return &discovery.RegisterInstanceResponse{
                        Response: 
discovery.CreateResponse(discovery.ErrUnavailableBackend, err.Error()),
diff --git a/datasource/mongo/sd/listwatch_inner.go 
b/datasource/mongo/sd/listwatch_inner.go
index da673c4..9ae8f4f 100644
--- a/datasource/mongo/sd/listwatch_inner.go
+++ b/datasource/mongo/sd/listwatch_inner.go
@@ -132,6 +132,10 @@ func (lw *mongoListWatch) 
doParseDocumentToResource(fullDocument bson.Raw) (reso
                        log.Error("error to parse bson raw to documentInfo", 
err)
                        return
                }
+               if instance.Instance == nil {
+                       log.Error(fmt.Sprintf("unexpect instance value,the 
documentID is %s", resource.DocumentID), nil)
+                       return
+               }
                resource.Key = instance.Instance.InstanceId
                resource.Value = instance
                resource.Index = instance.Instance.ServiceId
@@ -142,6 +146,10 @@ func (lw *mongoListWatch) 
doParseDocumentToResource(fullDocument bson.Raw) (reso
                        log.Error("error to parse bson raw to documentInfo", 
err)
                        return
                }
+               if service.Service == nil {
+                       log.Error(fmt.Sprintf("unexpect service value,the 
documentID is %s", resource.DocumentID), nil)
+                       return
+               }
                resource.Key = service.Service.ServiceId
                resource.Value = service
                resource.Index = util.StringJoin([]string{service.Domain, 
service.Project, service.Service.ServiceName, service.Service.Version, 
service.Service.AppId, service.Service.Environment}, "/")

Reply via email to