diff --git a/internal/metastore/kv/rootcoord/kv_catalog.go b/internal/metastore/kv/rootcoord/kv_catalog.go index c8f2fbac4aea4..6b50f5d38788c 100644 --- a/internal/metastore/kv/rootcoord/kv_catalog.go +++ b/internal/metastore/kv/rootcoord/kv_catalog.go @@ -440,6 +440,7 @@ func (kc *Catalog) appendPartitionAndFieldsInfo(ctx context.Context, collMeta *p return collection, nil } +// TODO: This function will be invoked many times if there are many databases, leading to significant overhead. func (kc *Catalog) batchAppendPartitionAndFieldsInfo(ctx context.Context, collMeta []*pb.CollectionInfo, ts typeutil.Timestamp, ) ([]*model.Collection, error) { diff --git a/internal/metastore/kv/rootcoord/suffix_snapshot.go b/internal/metastore/kv/rootcoord/suffix_snapshot.go index 9b211e0867cf2..75b9c002d8394 100644 --- a/internal/metastore/kv/rootcoord/suffix_snapshot.go +++ b/internal/metastore/kv/rootcoord/suffix_snapshot.go @@ -434,18 +434,20 @@ func (ss *SuffixSnapshot) generateSaveExecute(kvs map[string]string, ts typeutil func (ss *SuffixSnapshot) LoadWithPrefix(key string, ts typeutil.Timestamp) ([]string, []string, error) { // ts 0 case shall be treated as fetch latest/current value if ts == 0 || ts == typeutil.MaxTimestamp { - keys, values, err := ss.MetaKv.LoadWithPrefix(key) - fks := keys[:0] // make([]string, 0, len(keys)) - fvs := values[:0] // make([]string, 0, len(values)) + fks := make([]string, 0) + fvs := make([]string, 0) // hide rootPrefix from return value - for i, k := range keys { + applyFn := func(key []byte, value []byte) error { // filters tombstone - if ss.isTombstone(values[i]) { - continue + if ss.isTombstone(string(value)) { + return nil } - fks = append(fks, ss.hideRootPrefix(k)) - fvs = append(fvs, values[i]) + fks = append(fks, ss.hideRootPrefix(string(key))) + fvs = append(fvs, string(value)) + return nil } + + err := ss.MetaKv.WalkWithPrefix(key, PaginationSize, applyFn) return fks, fvs, err } ss.Lock()