mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #8475 from heyitsanthony/mvcc-100-range
mvcc: don't allocate keys when computing Revisions
This commit is contained in:
commit
b61c7489e0
@ -85,6 +85,21 @@ func (ti *treeIndex) keyIndex(keyi *keyIndex) *keyIndex {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ti *treeIndex) visit(key, end []byte, f func(ki *keyIndex)) {
|
||||||
|
keyi, endi := &keyIndex{key: key}, &keyIndex{key: end}
|
||||||
|
|
||||||
|
ti.RLock()
|
||||||
|
defer ti.RUnlock()
|
||||||
|
|
||||||
|
ti.tree.AscendGreaterOrEqual(keyi, func(item btree.Item) bool {
|
||||||
|
if len(endi.key) > 0 && !item.Less(endi) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
f(item.(*keyIndex))
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (ti *treeIndex) Revisions(key, end []byte, atRev int64) (revs []revision) {
|
func (ti *treeIndex) Revisions(key, end []byte, atRev int64) (revs []revision) {
|
||||||
if end == nil {
|
if end == nil {
|
||||||
rev, _, _, err := ti.Get(key, atRev)
|
rev, _, _, err := ti.Get(key, atRev)
|
||||||
@ -93,8 +108,12 @@ func (ti *treeIndex) Revisions(key, end []byte, atRev int64) (revs []revision) {
|
|||||||
}
|
}
|
||||||
return []revision{rev}
|
return []revision{rev}
|
||||||
}
|
}
|
||||||
_, rev := ti.Range(key, end, atRev)
|
ti.visit(key, end, func(ki *keyIndex) {
|
||||||
return rev
|
if rev, _, _, err := ki.get(atRev); err == nil {
|
||||||
|
revs = append(revs, rev)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
return revs
|
||||||
}
|
}
|
||||||
|
|
||||||
func (ti *treeIndex) Range(key, end []byte, atRev int64) (keys [][]byte, revs []revision) {
|
func (ti *treeIndex) Range(key, end []byte, atRev int64) (keys [][]byte, revs []revision) {
|
||||||
@ -105,27 +124,12 @@ func (ti *treeIndex) Range(key, end []byte, atRev int64) (keys [][]byte, revs []
|
|||||||
}
|
}
|
||||||
return [][]byte{key}, []revision{rev}
|
return [][]byte{key}, []revision{rev}
|
||||||
}
|
}
|
||||||
|
ti.visit(key, end, func(ki *keyIndex) {
|
||||||
keyi := &keyIndex{key: key}
|
if rev, _, _, err := ki.get(atRev); err == nil {
|
||||||
endi := &keyIndex{key: end}
|
|
||||||
|
|
||||||
ti.RLock()
|
|
||||||
defer ti.RUnlock()
|
|
||||||
|
|
||||||
ti.tree.AscendGreaterOrEqual(keyi, func(item btree.Item) bool {
|
|
||||||
if len(endi.key) > 0 && !item.Less(endi) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
curKeyi := item.(*keyIndex)
|
|
||||||
rev, _, _, err := curKeyi.get(atRev)
|
|
||||||
if err != nil {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
revs = append(revs, rev)
|
revs = append(revs, rev)
|
||||||
keys = append(keys, curKeyi.key)
|
keys = append(keys, ki.key)
|
||||||
return true
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
return keys, revs
|
return keys, revs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,22 +45,34 @@ func BenchmarkStorePut(b *testing.B) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func BenchmarkStoreRangeOneKey(b *testing.B) {
|
func BenchmarkStoreRangeKey1(b *testing.B) { benchmarkStoreRange(b, 1) }
|
||||||
|
func BenchmarkStoreRangeKey100(b *testing.B) { benchmarkStoreRange(b, 100) }
|
||||||
|
|
||||||
|
func benchmarkStoreRange(b *testing.B, n int) {
|
||||||
var i fakeConsistentIndex
|
var i fakeConsistentIndex
|
||||||
be, tmpPath := backend.NewDefaultTmpBackend()
|
be, tmpPath := backend.NewDefaultTmpBackend()
|
||||||
s := NewStore(be, &lease.FakeLessor{}, &i)
|
s := NewStore(be, &lease.FakeLessor{}, &i)
|
||||||
defer cleanup(s, be, tmpPath)
|
defer cleanup(s, be, tmpPath)
|
||||||
|
|
||||||
// 64 byte key/val
|
// 64 byte key/val
|
||||||
key, val := createBytesSlice(64, 1), createBytesSlice(64, 1)
|
keys, val := createBytesSlice(64, n), createBytesSlice(64, 1)
|
||||||
s.Put(key[0], val[0], lease.NoLease)
|
for i := range keys {
|
||||||
|
s.Put(keys[i], val[0], lease.NoLease)
|
||||||
|
}
|
||||||
// Force into boltdb tx instead of backend read tx.
|
// Force into boltdb tx instead of backend read tx.
|
||||||
s.Commit()
|
s.Commit()
|
||||||
|
|
||||||
|
var begin, end []byte
|
||||||
|
if n == 1 {
|
||||||
|
begin, end = keys[0], nil
|
||||||
|
} else {
|
||||||
|
begin, end = []byte{}, []byte{}
|
||||||
|
}
|
||||||
|
|
||||||
b.ReportAllocs()
|
b.ReportAllocs()
|
||||||
b.ResetTimer()
|
b.ResetTimer()
|
||||||
for i := 0; i < b.N; i++ {
|
for i := 0; i < b.N; i++ {
|
||||||
s.Range(key[0], nil, RangeOptions{})
|
s.Range(begin, end, RangeOptions{})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user