tianxiaoliang commented on a change in pull request #1133:
URL:
https://github.com/apache/servicecomb-service-center/pull/1133#discussion_r688272564
##########
File path: datasource/etcd/ops.go
##########
@@ -86,3 +102,105 @@ func (ds *MetadataManager) getGlobalInstanceCount(ctx
context.Context, domainPro
}
return global, nil
}
+
+func (ds *MetadataManager) RotateMicroservice(ctx context.Context,
reserveVersionCount int) error {
+ key := path.GetServiceIndexRootKey("")
+ indexesResp, err := sd.ServiceIndex().Search(ctx,
etcdadpt.WithStrKey(key), etcdadpt.WithPrefix())
+ if err != nil {
+ log.Error("query all microservices indexes failed", err)
+ return err
+ }
+ serviceIDKeys := GetOldServiceIDs(indexesResp, reserveVersionCount)
+ if len(serviceIDKeys) == 0 {
+ return nil
+ }
+ serviceIDKeys = FilterUnused(ctx, serviceIDKeys)
+ if len(serviceIDKeys) == 0 {
+ return nil
+ }
+
+ log.Warn(fmt.Sprintf("start rotate %d microservices",
len(serviceIDKeys)))
+ n := UnregisterManyService(ctx, serviceIDKeys)
+ if n > 0 {
+ log.Warn(fmt.Sprintf("%d microservices rotated", n))
+ }
+ return nil
+}
+
+func FilterUnused(ctx context.Context, serviceIDKeys []*RotateServiceIDKey)
[]*RotateServiceIDKey {
+ matched := make([]*RotateServiceIDKey, 0, len(serviceIDKeys))
+ for _, serviceIDKey := range serviceIDKeys {
+ serviceID := serviceIDKey.ServiceID
+ instanceKey :=
path.GenerateInstanceKey(serviceIDKey.DomainProject, serviceID, "")
+ resp, err := sd.Instance().Search(ctx,
etcdadpt.WithStrKey(instanceKey),
+ etcdadpt.WithPrefix(), etcdadpt.WithCountOnly())
+ if err != nil {
+ log.Error(fmt.Sprintf("count microservice %s instance
failed", serviceID), err)
+ continue
+ }
+ if resp.Count > 0 {
+ continue
+ }
+ matched = append(matched, serviceIDKey)
+ }
+ return matched
+}
+
+func UnregisterManyService(ctx context.Context, serviceIDKeys
[]*RotateServiceIDKey) (deleted int64) {
+ pool :=
goutil.New(gopool.Configure().WithContext(ctx).Workers(poolSizeOfRotation))
+ defer pool.Done()
+
+ for _, key := range serviceIDKeys {
+ domainProject := key.DomainProject
+ serviceID := key.ServiceID
+ pool.Do(func(ctx context.Context) {
+ resp, err :=
datasource.GetMetadataManager().UnregisterService(util.SetDomainProjectString(ctx,
domainProject),
+ &pb.DeleteServiceRequest{ServiceId: serviceID})
+ if err == nil && resp.Response.IsSucceed() {
+ atomic.AddInt64(&deleted, 1)
+ }
+ })
+ }
+ return
+}
+
+func GetOldServiceIDs(indexesResp *kvstore.Response, reserveVersionCount int)
[]*RotateServiceIDKey {
+ total := indexesResp.Count
+ if total == 0 {
+ return nil
+ }
+ var (
+ counter = make(map[string]int, total)
+ matched = make(map[string]*pb.MicroServiceKey)
+ serviceVersionMap = make(map[string][]*kvstore.KeyValue, total)
+ )
+ for _, kv := range indexesResp.Kvs {
+ serviceVersionKey := path.GetInfoFromSvcIndexKV(kv.Key)
+ serviceVersionKey.Version = ""
+ serviceKey := path.GenerateServiceIndexKey(serviceVersionKey)
+ count := counter[serviceKey]
+ count++
Review comment:
可不可以第一次遍历的时候就完成版本大小对比并加入到裁剪map中,matched大小应该始终和保留版半数一致
--
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.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]