tianxiaoliang commented on a change in pull request #779:
URL:
https://github.com/apache/servicecomb-service-center/pull/779#discussion_r542064957
##########
File path: datasource/mongo/ms.go
##########
@@ -883,51 +833,134 @@ func (ds *DataSource) modifySchemas(ctx context.Context,
service *discovery.Micr
for _, schema := range needAddSchemas {
log.Info(fmt.Sprintf("add new schema[%s/%s], operator:
%s", serviceID, schema.SchemaId, remoteIP))
- err := UpdateSchema(ctx, GeneratorSchemaFilter(ctx,
serviceID, schema.SchemaId), bson.M{"$set": bson.M{ColumnSchemaInfo:
schema.Schema, ColumnSchemaSummary: schema.Summary}},
options.FindOneAndUpdate().SetUpsert(true))
+ schemasOps = append(schemasOps,
mongo.NewInsertOneModel().SetDocument(&Schema{
+ Domain: domain,
+ Project: project,
+ ServiceID: serviceID,
+ SchemaID: schema.SchemaId,
+ SchemaInfo: schema.Schema,
+ SchemaSummary: schema.Summary,
+ }))
+ }
+ } else {
+ quotaSize := len(needAddSchemas) - len(needDeleteSchemas)
+ if quotaSize > 0 {
+ res :=
quota.NewApplyQuotaResource(quota.SchemaQuotaType,
util.ParseDomainProject(ctx), serviceID, int64(quotaSize))
+ rst := quota.Apply(ctx, res)
+ err := rst.Err
if err != nil {
- return
discovery.NewError(discovery.ErrInternal, err.Error())
+ log.Error(fmt.Sprintf("modify service[%s]
schemas failed, operator: %s", serviceID, remoteIP), err)
+ return err
}
}
- } else {
-
var schemaIDs []string
for _, schema := range needAddSchemas {
log.Info(fmt.Sprintf("add new schema[%s/%s], operator:
%s", serviceID, schema.SchemaId, remoteIP))
- err := UpdateSchema(ctx, GeneratorSchemaFilter(ctx,
serviceID, schema.SchemaId), bson.M{"$set": bson.M{ColumnSchemaInfo:
schema.Schema, ColumnSchemaSummary: schema.Summary}},
options.FindOneAndUpdate().SetUpsert(true))
- if err != nil {
- return
discovery.NewError(discovery.ErrInternal, err.Error())
- }
+ schemasOps = append(schemasOps,
mongo.NewInsertOneModel().SetDocument(&Schema{
+ Domain: domain,
+ Project: project,
+ ServiceID: serviceID,
+ SchemaID: schema.SchemaId,
+ SchemaInfo: schema.Schema,
+ SchemaSummary: schema.Summary,
+ }))
schemaIDs = append(schemaIDs, schema.SchemaId)
}
for _, schema := range needUpdateSchemas {
log.Info(fmt.Sprintf("update schema[%s/%s], operator:
%s", serviceID, schema.SchemaId, remoteIP))
- err := UpdateSchema(ctx, GeneratorSchemaFilter(ctx,
serviceID, schema.SchemaId), bson.M{"$set": bson.M{ColumnSchemaInfo:
schema.Schema, ColumnSchemaSummary: schema.Summary}},
options.FindOneAndUpdate().SetUpsert(true))
- if err != nil {
- return
discovery.NewError(discovery.ErrInternal, err.Error())
- }
+ schemasOps = append(schemasOps,
mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID,
schema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{ColumnSchemaInfo:
schema.Schema, ColumnSchemaSummary: schema.Summary}}))
schemaIDs = append(schemaIDs, schema.SchemaId)
}
for _, schema := range needDeleteSchemas {
log.Info(fmt.Sprintf("delete non-existent
schema[%s/%s], operator: %s", serviceID, schema.SchemaId, remoteIP))
- err = DeleteSchema(ctx, GeneratorSchemaFilter(ctx,
serviceID, schema.SchemaId))
- if err != nil {
- return
discovery.NewError(discovery.ErrInternal, err.Error())
- }
+ schemasOps = append(schemasOps,
mongo.NewDeleteOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID,
schema.SchemaId)))
}
- updateData := bson.M{StringBuilder([]string{ColumnServiceInfo,
ColumnSchemas}): schemaIDs}
- err := UpdateService(ctx, GeneratorServiceFilter(ctx,
serviceID), bson.M{"$set": updateData})
+ serviceOps = append(serviceOps,
mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set":
bson.M{StringBuilder([]string{ColumnServiceInfo, ColumnSchemas}):
schemaIDs}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
+ }
+ if len(schemasOps) > 0 {
+ _, err = client.GetMongoClient().BatchUpdate(ctx,
CollectionSchema, schemasOps)
+ if err != nil {
+ return discovery.NewError(discovery.ErrInternal,
err.Error())
+ }
+ }
+ if len(serviceOps) > 0 {
+ _, err = client.GetMongoClient().BatchUpdate(ctx,
CollectionService, serviceOps)
if err != nil {
- log.Error(fmt.Sprintf("modify service %s schemas
failed, update service.Schemas failed, operator: %s", serviceID, remoteIP), err)
return discovery.NewError(discovery.ErrInternal,
err.Error())
}
}
return nil
}
+func (ds *DataSource) modifySchema(ctx context.Context, serviceID string,
schema *discovery.Schema) *discovery.Error {
+ remoteIP := util.GetIPFromContext(ctx)
+ svc, err := GetService(ctx, GeneratorServiceFilter(ctx, serviceID))
+ if err != nil {
+ 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 {
Review comment:
从这里开始,思考下如何与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:
[email protected]