You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by GitBox <gi...@apache.org> on 2021/02/09 07:02:26 UTC

[GitHub] [servicecomb-service-center] DFSOrange opened a new pull request #855: add ensure index and validate

DFSOrange opened a new pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855


   
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] tianxiaoliang commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
tianxiaoliang commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572656847



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))
+	instanceIDIndex.Options = options.Index().SetUnique(true)
+
+	instanceIndex := BuildIndexDoc(ColumnRefreshTime)
+	instanceIndex.Options = options.Index().SetExpireAfterSeconds(60)
+
+	instanceServiceIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstanceID, ColumnServiceID}))
+
+	var instanceIndexs []mongo.IndexModel
+	instanceIndexs = append(instanceIndexs, instanceIndex, instanceIDIndex, instanceServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionInstance, instanceIndexs)
 	if err != nil {
+		log.Fatal("failed to create instance collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionSchema, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureSchema() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionSchema, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	schemaServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var schemaIndexs []mongo.IndexModel
+	schemaIndexs = append(schemaIndexs, schemaServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionSchema, schemaIndexs)
 	if err != nil {
+		log.Fatal("failed to create schema collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionRule, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureRule() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionRule, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	ruleServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var ruleIndexs []mongo.IndexModel
+	ruleIndexs = append(ruleIndexs, ruleServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionRule, ruleIndexs)
 	if err != nil {
+		log.Fatal("failed to create rule collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionDep, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceKey, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureDep() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionDep, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	depServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceKey)
+
+	var depIndexs []mongo.IndexModel
+	depIndexs = append(depIndexs, depServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionDep, depIndexs)
 	if err != nil {
+		log.Fatal("failed to create dep collection indexs", err)
 		return
 	}
-	return
+}
+
+func wrapCreateCollectionError(err error) {
+	if err != nil {
+		cmdErr, ok := err.(mongo.CommandError)

Review comment:
       这个fatal的条件是非cmd error,或者ns不存在。那么问题是如果是其他error为何可以继续执行下去?




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] tianxiaoliang commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
tianxiaoliang commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r573373191



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))
+	instanceIDIndex.Options = options.Index().SetUnique(true)
+
+	instanceIndex := BuildIndexDoc(ColumnRefreshTime)
+	instanceIndex.Options = options.Index().SetExpireAfterSeconds(60)
+
+	instanceServiceIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstanceID, ColumnServiceID}))
+
+	var instanceIndexs []mongo.IndexModel
+	instanceIndexs = append(instanceIndexs, instanceIndex, instanceIDIndex, instanceServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionInstance, instanceIndexs)
 	if err != nil {
+		log.Fatal("failed to create instance collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionSchema, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureSchema() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionSchema, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	schemaServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var schemaIndexs []mongo.IndexModel
+	schemaIndexs = append(schemaIndexs, schemaServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionSchema, schemaIndexs)
 	if err != nil {
+		log.Fatal("failed to create schema collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionRule, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureRule() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionRule, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	ruleServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var ruleIndexs []mongo.IndexModel
+	ruleIndexs = append(ruleIndexs, ruleServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionRule, ruleIndexs)
 	if err != nil {
+		log.Fatal("failed to create rule collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionDep, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceKey, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureDep() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionDep, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	depServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceKey)
+
+	var depIndexs []mongo.IndexModel
+	depIndexs = append(depIndexs, depServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionDep, depIndexs)
 	if err != nil {
+		log.Fatal("failed to create dep collection indexs", err)
 		return
 	}
-	return
+}
+
+func wrapCreateCollectionError(err error) {
+	if err != nil {
+		cmdErr, ok := err.(mongo.CommandError)

Review comment:
       如果collection存在则直接return,否则log.fatal xxx,当前的实现有点绕了




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572664336



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))
+	instanceIDIndex.Options = options.Index().SetUnique(true)
+
+	instanceIndex := BuildIndexDoc(ColumnRefreshTime)
+	instanceIndex.Options = options.Index().SetExpireAfterSeconds(60)
+
+	instanceServiceIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstanceID, ColumnServiceID}))
+
+	var instanceIndexs []mongo.IndexModel
+	instanceIndexs = append(instanceIndexs, instanceIndex, instanceIDIndex, instanceServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionInstance, instanceIndexs)
 	if err != nil {
+		log.Fatal("failed to create instance collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionSchema, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureSchema() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionSchema, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	schemaServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var schemaIndexs []mongo.IndexModel
+	schemaIndexs = append(schemaIndexs, schemaServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionSchema, schemaIndexs)
 	if err != nil {
+		log.Fatal("failed to create schema collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionRule, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureRule() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionRule, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	ruleServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var ruleIndexs []mongo.IndexModel
+	ruleIndexs = append(ruleIndexs, ruleServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionRule, ruleIndexs)
 	if err != nil {
+		log.Fatal("failed to create rule collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionDep, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceKey, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureDep() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionDep, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	depServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceKey)
+
+	var depIndexs []mongo.IndexModel
+	depIndexs = append(depIndexs, depServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionDep, depIndexs)
 	if err != nil {
+		log.Fatal("failed to create dep collection indexs", err)
 		return
 	}
-	return
+}
+
+func wrapCreateCollectionError(err error) {
+	if err != nil {
+		cmdErr, ok := err.(mongo.CommandError)

Review comment:
       > 这个fatal的条件是非cmd error,或者ns不存在。那么问题是如果是其他error为何可以继续执行下去?
   
   这块在mongo-driver中有注明,commanderror可以从任何对mongodb的操作中断言,所以command-error属于最底层的error,如果我们没有再封装的话,这里应该只有commanderror或者断言错误,reply无法贴图,贴在pr中,另外会加注释
   




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572672701



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))

Review comment:
       > > 是不是没这个索引?这个索引是用来干嘛的
   > 
   > 只是单纯建立索引,加快查询单个service详情的接口 (根据serviceid-->service信息)
   
   因为业务中有不少逻辑是依赖服务的,比如instance创建,先看所属服务是否存在等操作




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572833149



##########
File path: datasource/mongo/client/errortypes.go
##########
@@ -26,7 +26,8 @@ var (
 )
 
 const (
-	DuplicateKey = 11000
+	DuplicateKey    = 11000

Review comment:
       > 这些错误码,mongodb没搞?
   
   当前go-driver中没有定义,只有在test中定义了,这里直接用test不太好因此在sc中重新放了一份
   ![微信截图_20210209200848](https://user-images.githubusercontent.com/26628394/107361686-bbd7d680-6b12-11eb-91c0-adcaa701844d.png)
   




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572668939



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))

Review comment:
       > 不建议对instanceid做唯一性检查,你是否确定etcd做了这个限制?
   
   已删除




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] tianxiaoliang commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
tianxiaoliang commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r573373191



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))
+	instanceIDIndex.Options = options.Index().SetUnique(true)
+
+	instanceIndex := BuildIndexDoc(ColumnRefreshTime)
+	instanceIndex.Options = options.Index().SetExpireAfterSeconds(60)
+
+	instanceServiceIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstanceID, ColumnServiceID}))
+
+	var instanceIndexs []mongo.IndexModel
+	instanceIndexs = append(instanceIndexs, instanceIndex, instanceIDIndex, instanceServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionInstance, instanceIndexs)
 	if err != nil {
+		log.Fatal("failed to create instance collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionSchema, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureSchema() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionSchema, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	schemaServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var schemaIndexs []mongo.IndexModel
+	schemaIndexs = append(schemaIndexs, schemaServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionSchema, schemaIndexs)
 	if err != nil {
+		log.Fatal("failed to create schema collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionRule, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureRule() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionRule, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	ruleServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var ruleIndexs []mongo.IndexModel
+	ruleIndexs = append(ruleIndexs, ruleServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionRule, ruleIndexs)
 	if err != nil {
+		log.Fatal("failed to create rule collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionDep, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceKey, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureDep() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionDep, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	depServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceKey)
+
+	var depIndexs []mongo.IndexModel
+	depIndexs = append(depIndexs, depServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionDep, depIndexs)
 	if err != nil {
+		log.Fatal("failed to create dep collection indexs", err)
 		return
 	}
-	return
+}
+
+func wrapCreateCollectionError(err error) {
+	if err != nil {
+		cmdErr, ok := err.(mongo.CommandError)

Review comment:
       如果collection存在则直接return,否则log.fatal xxx




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572664336



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))
+	instanceIDIndex.Options = options.Index().SetUnique(true)
+
+	instanceIndex := BuildIndexDoc(ColumnRefreshTime)
+	instanceIndex.Options = options.Index().SetExpireAfterSeconds(60)
+
+	instanceServiceIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstanceID, ColumnServiceID}))
+
+	var instanceIndexs []mongo.IndexModel
+	instanceIndexs = append(instanceIndexs, instanceIndex, instanceIDIndex, instanceServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionInstance, instanceIndexs)
 	if err != nil {
+		log.Fatal("failed to create instance collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionSchema, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureSchema() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionSchema, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	schemaServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var schemaIndexs []mongo.IndexModel
+	schemaIndexs = append(schemaIndexs, schemaServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionSchema, schemaIndexs)
 	if err != nil {
+		log.Fatal("failed to create schema collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionRule, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureRule() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionRule, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	ruleServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var ruleIndexs []mongo.IndexModel
+	ruleIndexs = append(ruleIndexs, ruleServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionRule, ruleIndexs)
 	if err != nil {
+		log.Fatal("failed to create rule collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionDep, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceKey, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureDep() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionDep, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	depServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceKey)
+
+	var depIndexs []mongo.IndexModel
+	depIndexs = append(depIndexs, depServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionDep, depIndexs)
 	if err != nil {
+		log.Fatal("failed to create dep collection indexs", err)
 		return
 	}
-	return
+}
+
+func wrapCreateCollectionError(err error) {
+	if err != nil {
+		cmdErr, ok := err.(mongo.CommandError)

Review comment:
       > 这个fatal的条件是非cmd error,或者ns不存在。那么问题是如果是其他error为何可以继续执行下去?
   
   这块在mongo-driver中有注明,commanderror可以从任何对mongodb的操作中断言,所以command-error属于最底层的error,如果我们没有再封装的话,这里应该只有commanderror或者断言错误,代码中会另外加注释
   




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572664803



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))
+	instanceIDIndex.Options = options.Index().SetUnique(true)
+
+	instanceIndex := BuildIndexDoc(ColumnRefreshTime)
+	instanceIndex.Options = options.Index().SetExpireAfterSeconds(60)
+
+	instanceServiceIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstanceID, ColumnServiceID}))
+
+	var instanceIndexs []mongo.IndexModel
+	instanceIndexs = append(instanceIndexs, instanceIndex, instanceIDIndex, instanceServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionInstance, instanceIndexs)
 	if err != nil {
+		log.Fatal("failed to create instance collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionSchema, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureSchema() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionSchema, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	schemaServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var schemaIndexs []mongo.IndexModel
+	schemaIndexs = append(schemaIndexs, schemaServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionSchema, schemaIndexs)
 	if err != nil {
+		log.Fatal("failed to create schema collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionRule, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceID, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureRule() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionRule, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	ruleServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceID)
+
+	var ruleIndexs []mongo.IndexModel
+	ruleIndexs = append(ruleIndexs, ruleServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionRule, ruleIndexs)
 	if err != nil {
+		log.Fatal("failed to create rule collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionDep, []mongo.IndexModel{{
-		Keys: bsonx.Doc{
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-			{Key: ColumnServiceKey, Value: bsonx.Int32(1)}},
-	}})
+}
+
+func EnsureDep() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionDep, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	depServiceIndex := BuildIndexDoc(
+		ColumnDomain,
+		ColumnProject,
+		ColumnServiceKey)
+
+	var depIndexs []mongo.IndexModel
+	depIndexs = append(depIndexs, depServiceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionDep, depIndexs)
 	if err != nil {
+		log.Fatal("failed to create dep collection indexs", err)
 		return
 	}
-	return
+}
+
+func wrapCreateCollectionError(err error) {
+	if err != nil {
+		cmdErr, ok := err.(mongo.CommandError)

Review comment:
       ![微信截图_20210209155332](https://user-images.githubusercontent.com/26628394/107332969-c9c83000-6aef-11eb-9956-8eefe5b1cd53.png)
   




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] DFSOrange commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
DFSOrange commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572662399



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))

Review comment:
       > 是不是没这个索引?这个索引是用来干嘛的
   
   只是单纯建立索引,加快查询单个service详情的接口 (根据serviceid-->service信息)




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] tianxiaoliang commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
tianxiaoliang commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572661088



##########
File path: datasource/mongo/client/errortypes.go
##########
@@ -26,7 +26,8 @@ var (
 )
 
 const (
-	DuplicateKey = 11000
+	DuplicateKey    = 11000

Review comment:
       这些错误码,mongodb没搞?




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] tianxiaoliang commented on a change in pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
tianxiaoliang commented on a change in pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855#discussion_r572658412



##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))

Review comment:
       是不是没这个索引?这个索引是用来干嘛的

##########
File path: datasource/mongo/mongo.go
##########
@@ -100,64 +97,127 @@ func (ds *DataSource) initClient() error {
 	}
 }
 
-//{Key: StringBuilder([]string{ColumnService, ColumnAlias}), Value: bsonx.Int32(1)}
-func (ds *DataSource) createIndexes() (err error) {
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionService, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnServiceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnService, ColumnAppID}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnServiceName}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnEnv}), Value: bsonx.Int32(1)},
-			{Key: StringBuilder([]string{ColumnService, ColumnVersion}), Value: bsonx.Int32(1)},
-			{Key: ColumnDomain, Value: bsonx.Int32(1)},
-			{Key: ColumnProject, Value: bsonx.Int32(1)},
-		},
-		Options: options.Index().SetUnique(true),
-	}})
+func EnsureDB() {
+	EnsureService()
+	EnsureInstance()
+	EnsureRule()
+	EnsureSchema()
+	EnsureDep()
+}
+
+func EnsureService() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionService, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	serviceIDIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnServiceID}))
+	serviceIDIndex.Options = options.Index().SetUnique(true)
+
+	serviceIndex := BuildIndexDoc(
+		StringBuilder([]string{ColumnService, ColumnAppID}),
+		StringBuilder([]string{ColumnService, ColumnServiceName}),
+		StringBuilder([]string{ColumnService, ColumnEnv}),
+		StringBuilder([]string{ColumnService, ColumnVersion}),
+		ColumnDomain,
+		ColumnProject)
+	serviceIndex.Options = options.Index().SetUnique(true)
+
+	var serviceIndexs []mongo.IndexModel
+	serviceIndexs = append(serviceIndexs, serviceIDIndex, serviceIndex)
+
+	err = client.GetMongoClient().CreateIndexes(context.Background(), CollectionService, serviceIndexs)
 	if err != nil {
+		log.Fatal("failed to create service collection indexs", err)
 		return
 	}
-	err = client.GetMongoClient().CreateIndexes(context.TODO(), CollectionInstance, []mongo.IndexModel{{
-		Keys:    bsonx.Doc{{Key: StringBuilder([]string{ColumnInstance, ColumnInstanceID}), Value: bsonx.Int32(1)}},
-		Options: options.Index().SetUnique(true),
-	}, {
-		Keys: bsonx.Doc{{Key: StringBuilder([]string{ColumnInstanceID, ColumnServiceID}), Value: bsonx.Int32(1)}},
-	}, {
-		Keys:    bsonx.Doc{{Key: ColumnRefreshTime, Value: bsonx.Int32(1)}},
-		Options: options.Index().SetExpireAfterSeconds(60),
-	}})
+}
+
+func EnsureInstance() {
+	err := client.GetMongoClient().GetDB().CreateCollection(context.Background(), CollectionInstance, options.CreateCollection().SetValidator(nil))
+	wrapCreateCollectionError(err)
+
+	instanceIDIndex := BuildIndexDoc(StringBuilder([]string{ColumnInstance, ColumnInstanceID}))

Review comment:
       不建议对instanceid做唯一性检查,你是否确定etcd做了这个限制?




----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org



[GitHub] [servicecomb-service-center] tianxiaoliang merged pull request #855: add ensure index and validate

Posted by GitBox <gi...@apache.org>.
tianxiaoliang merged pull request #855:
URL: https://github.com/apache/servicecomb-service-center/pull/855


   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
users@infra.apache.org