mirror of
https://github.com/etcd-io/etcd.git
synced 2024-09-27 06:25:44 +00:00
Merge pull request #8213 from heyitsanthony/nil-endrev
mvcc: don't allocate end revision while computing range
This commit is contained in:
commit
97f37e42e6
@ -445,16 +445,3 @@ func appendMarkTombstone(b []byte) []byte {
|
|||||||
func isTombstone(b []byte) bool {
|
func isTombstone(b []byte) bool {
|
||||||
return len(b) == markedRevBytesLen && b[markBytePosition] == markTombstone
|
return len(b) == markedRevBytesLen && b[markBytePosition] == markTombstone
|
||||||
}
|
}
|
||||||
|
|
||||||
// revBytesRange returns the range of revision bytes at
|
|
||||||
// the given revision.
|
|
||||||
func revBytesRange(rev revision) (start, end []byte) {
|
|
||||||
start = newRevBytes()
|
|
||||||
revToBytes(rev, start)
|
|
||||||
|
|
||||||
end = newRevBytes()
|
|
||||||
endRev := revision{main: rev.main, sub: rev.sub + 1}
|
|
||||||
revToBytes(endRev, end)
|
|
||||||
|
|
||||||
return start, end
|
|
||||||
}
|
|
||||||
|
@ -217,9 +217,10 @@ func TestStoreRange(t *testing.T) {
|
|||||||
t.Errorf("#%d: rev = %d, want %d", i, ret.Rev, wrev)
|
t.Errorf("#%d: rev = %d, want %d", i, ret.Rev, wrev)
|
||||||
}
|
}
|
||||||
|
|
||||||
wstart, wend := revBytesRange(tt.idxr.revs[0])
|
wstart := newRevBytes()
|
||||||
|
revToBytes(tt.idxr.revs[0], wstart)
|
||||||
wact := []testutil.Action{
|
wact := []testutil.Action{
|
||||||
{"range", []interface{}{keyBucketName, wstart, wend, int64(0)}},
|
{"range", []interface{}{keyBucketName, wstart, []byte(nil), int64(0)}},
|
||||||
}
|
}
|
||||||
if g := b.tx.Action(); !reflect.DeepEqual(g, wact) {
|
if g := b.tx.Action(); !reflect.DeepEqual(g, wact) {
|
||||||
t.Errorf("#%d: tx action = %+v, want %+v", i, g, wact)
|
t.Errorf("#%d: tx action = %+v, want %+v", i, g, wact)
|
||||||
|
@ -128,22 +128,22 @@ func (tr *storeTxnRead) rangeKeys(key, end []byte, curRev int64, ro RangeOptions
|
|||||||
return &RangeResult{KVs: nil, Count: len(revpairs), Rev: curRev}, nil
|
return &RangeResult{KVs: nil, Count: len(revpairs), Rev: curRev}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var kvs []mvccpb.KeyValue
|
limit := int(ro.Limit)
|
||||||
for _, revpair := range revpairs {
|
if limit <= 0 || limit > len(revpairs) {
|
||||||
start, end := revBytesRange(revpair)
|
limit = len(revpairs)
|
||||||
_, vs := tr.tx.UnsafeRange(keyBucketName, start, end, 0)
|
}
|
||||||
|
|
||||||
|
kvs := make([]mvccpb.KeyValue, limit)
|
||||||
|
revBytes := newRevBytes()
|
||||||
|
for i, revpair := range revpairs[:len(kvs)] {
|
||||||
|
revToBytes(revpair, revBytes)
|
||||||
|
_, vs := tr.tx.UnsafeRange(keyBucketName, revBytes, nil, 0)
|
||||||
if len(vs) != 1 {
|
if len(vs) != 1 {
|
||||||
plog.Fatalf("range cannot find rev (%d,%d)", revpair.main, revpair.sub)
|
plog.Fatalf("range cannot find rev (%d,%d)", revpair.main, revpair.sub)
|
||||||
}
|
}
|
||||||
|
if err := kvs[i].Unmarshal(vs[0]); err != nil {
|
||||||
var kv mvccpb.KeyValue
|
|
||||||
if err := kv.Unmarshal(vs[0]); err != nil {
|
|
||||||
plog.Fatalf("cannot unmarshal event: %v", err)
|
plog.Fatalf("cannot unmarshal event: %v", err)
|
||||||
}
|
}
|
||||||
kvs = append(kvs, kv)
|
|
||||||
if ro.Limit > 0 && len(kvs) >= int(ro.Limit) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return &RangeResult{KVs: kvs, Count: len(revpairs), Rev: curRev}, nil
|
return &RangeResult{KVs: kvs, Count: len(revpairs), Rev: curRev}, nil
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user