Browse Source

mvcc: Revisions() method for index to avoid key allocation

Save another alloc on the one key path.
Anthony Romano 8 years ago
parent
commit
f58c0cfb66
3 changed files with 19 additions and 1 deletions
  1. 13 0
      mvcc/index.go
  2. 5 0
      mvcc/kvstore_test.go
  3. 1 1
      mvcc/kvstore_txn.go

+ 13 - 0
mvcc/index.go

@@ -24,6 +24,7 @@ import (
 type index interface {
 type index interface {
 	Get(key []byte, atRev int64) (rev, created revision, ver int64, err error)
 	Get(key []byte, atRev int64) (rev, created revision, ver int64, err error)
 	Range(key, end []byte, atRev int64) ([][]byte, []revision)
 	Range(key, end []byte, atRev int64) ([][]byte, []revision)
+	Revisions(key, end []byte, atRev int64) []revision
 	Put(key []byte, rev revision)
 	Put(key []byte, rev revision)
 	Tombstone(key []byte, rev revision) error
 	Tombstone(key []byte, rev revision) error
 	RangeSince(key, end []byte, rev int64) []revision
 	RangeSince(key, end []byte, rev int64) []revision
@@ -84,6 +85,18 @@ func (ti *treeIndex) keyIndex(keyi *keyIndex) *keyIndex {
 	return nil
 	return nil
 }
 }
 
 
+func (ti *treeIndex) Revisions(key, end []byte, atRev int64) (revs []revision) {
+	if end == nil {
+		rev, _, _, err := ti.Get(key, atRev)
+		if err != nil {
+			return nil
+		}
+		return []revision{rev}
+	}
+	_, rev := ti.Range(key, end, atRev)
+	return rev
+}
+
 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) {
 	if end == nil {
 	if end == nil {
 		rev, _, _, err := ti.Get(key, atRev)
 		rev, _, _, err := ti.Get(key, atRev)

+ 5 - 0
mvcc/kvstore_test.go

@@ -741,6 +741,11 @@ type fakeIndex struct {
 	indexCompactRespc     chan map[revision]struct{}
 	indexCompactRespc     chan map[revision]struct{}
 }
 }
 
 
+func (i *fakeIndex) Revisions(key, end []byte, atRev int64) []revision {
+	_, rev := i.Range(key, end, atRev)
+	return rev
+}
+
 func (i *fakeIndex) Get(key []byte, atRev int64) (rev, created revision, ver int64, err error) {
 func (i *fakeIndex) Get(key []byte, atRev int64) (rev, created revision, ver int64, err error) {
 	i.Recorder.Record(testutil.Action{Name: "get", Params: []interface{}{key, atRev}})
 	i.Recorder.Record(testutil.Action{Name: "get", Params: []interface{}{key, atRev}})
 	r := <-i.indexGetRespc
 	r := <-i.indexGetRespc

+ 1 - 1
mvcc/kvstore_txn.go

@@ -120,7 +120,7 @@ func (tr *storeTxnRead) rangeKeys(key, end []byte, curRev int64, ro RangeOptions
 		return &RangeResult{KVs: nil, Count: -1, Rev: 0}, ErrCompacted
 		return &RangeResult{KVs: nil, Count: -1, Rev: 0}, ErrCompacted
 	}
 	}
 
 
-	_, revpairs := tr.s.kvindex.Range(key, end, int64(rev))
+	revpairs := tr.s.kvindex.Revisions(key, end, int64(rev))
 	if len(revpairs) == 0 {
 	if len(revpairs) == 0 {
 		return &RangeResult{KVs: nil, Count: 0, Rev: curRev}, nil
 		return &RangeResult{KVs: nil, Count: 0, Rev: curRev}, nil
 	}
 	}