tianxiaoliang commented on a change in pull request #1133:
URL: 
https://github.com/apache/servicecomb-service-center/pull/1133#discussion_r688270047



##########
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 {

Review comment:
       GetSunsetServices




-- 
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]


Reply via email to