in datasource/etcd/util/dependency_util.go [308:352]
func removeProviderRuleOfConsumer(ctx context.Context, domainProject string, cache map[string]bool) ([]etcdadpt.OpOptions, error) {
key := path.GenerateConsumerDependencyRuleKey(domainProject, nil) + path.SPLIT
resp, err := sd.DependencyRule().Search(ctx,
etcdadpt.WithStrKey(key), etcdadpt.WithPrefix())
if err != nil {
return nil, err
}
var ops []etcdadpt.OpOptions
for _, keyValue := range resp.Kvs {
var left []*pb.MicroServiceKey
all := keyValue.Value.(*pb.MicroServiceDependency).Dependency
for _, key := range all {
id := path.GenerateProviderDependencyRuleKey(key.Tenant, key)
exist, ok := cache[id]
if !ok {
_, exist, err = FindServiceIds(ctx, key, false)
if err != nil {
return nil, fmt.Errorf("%v, find service %s/%s/%s/%s",
err, key.Tenant, key.AppId, key.ServiceName, key.Version)
}
cache[id] = exist
}
if exist {
left = append(left, key)
}
}
if len(all) == len(left) {
continue
}
if len(left) == 0 {
ops = append(ops, etcdadpt.OpDel(etcdadpt.WithKey(keyValue.Key)))
} else {
val, err := json.Marshal(&pb.MicroServiceDependency{Dependency: left})
if err != nil {
return nil, fmt.Errorf("%v, marshal %v", err, left)
}
ops = append(ops, etcdadpt.OpPut(etcdadpt.WithKey(keyValue.Key), etcdadpt.WithValue(val)))
}
}
return ops, nil
}