etcd: add kvdb.Prefetch

This commit extends the kvdb interface in a backwards compatible way
such that we'll be able to prefetch all keys in a bucket in one go reducing the
number of roundtrips.
This commit is contained in:
Andras Banki-Horvath committed 2021-09-14 13:12:22 +02:00
1 parent daec66a4e4
commit 256b62e0d5
3 files changed
+77

No files matched your search

+34
View File
@@ -371,3 +371,37 @@ func (b *readWriteBucket) Sequence() uint64 {
return num
}
func flattenMap(m map[string]struct{}) []string {
result := make([]string, len(m))
i := 0
for key := range m {
result[i] = key
i++
}
return result
}
// Prefetch will prefetch all keys in the passed paths as well as all bucket
// keys along the paths.
func (b *readWriteBucket) Prefetch(paths ...[]string) {
keys := make(map[string]struct{})
ranges := make(map[string]struct{})
for _, path := range paths {
parent := b.id
for _, bucket := range path {
bucketKey := makeBucketKey(parent, []byte(bucket))
keys[string(bucketKey[:])] = struct{}{}
id := makeBucketID(bucketKey)
parent = id[:]
}
ranges[string(parent)] = struct{}{}
}
b.tx.stm.Prefetch(flattenMap(keys), flattenMap(ranges))
}