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}, "/")