func Search()

in server/datasource/etcd/kv/kv_cache.go [298:337]


func Search(ctx context.Context, req *CacheSearchReq) (*model.KVResponse, bool, error) {
	result := &model.KVResponse{
		Data: []*model.KVDoc{},
	}
	if !req.Opts.ExactLabels || !kvCache.isInLabelsSet(req.Opts.Labels) {
		return result, false, nil
	}

	openlog.Debug(fmt.Sprintf("using cache to search kv, domain %v, project %v, opts %+v", req.Domain, req.Project, *req.Opts))
	cacheKey := kvCache.GetCacheKey(req.Domain, req.Project, req.Opts.Labels)

	kvIds, ok := kvCache.LoadKvIDSet(cacheKey)
	if !ok {
		kvCache.StoreKvIDSet(cacheKey, IDSet{})
		return result, true, nil
	}

	var docs []*model.KVDoc

	var kvIdsLeft []string
	for kvID := range kvIds {
		if doc, ok := kvCache.LoadKvDoc(kvID); ok {
			docs = append(docs, doc)
			continue
		}
		kvIdsLeft = append(kvIdsLeft, kvID)
	}

	tpData := kvCache.getKvFromEtcd(ctx, req, kvIdsLeft)
	docs = append(docs, tpData...)

	for _, doc := range docs {
		if isMatch(req, doc) {
			datasource.ClearPart(doc)
			result.Data = append(result.Data, doc)
		}
	}
	result.Total = len(result.Data)
	return result, true, nil
}