Skip to content

Commit e176b49

Browse files
committed
more efficient version seeking using Desend method of btree
1 parent 91b3380 commit e176b49

File tree

2 files changed

+12
-19
lines changed

2 files changed

+12
-19
lines changed

btree.go

+9-12
Original file line numberDiff line numberDiff line change
@@ -72,23 +72,20 @@ func (bt *BTree[T]) Scan(iter func(item T) bool) {
7272
bt.Load().Scan(iter)
7373
}
7474

75-
func (bt *BTree[T]) Min() (T, bool) {
76-
return bt.Load().Min()
75+
func (bt *BTree[T]) Max() (T, bool) {
76+
return bt.Load().Max()
7777
}
7878

7979
func (bt *BTree[T]) Iter() btree.IterG[T] {
8080
return bt.Load().Iter()
8181
}
8282

83-
func (bt *BTree[T]) Seek(item T) (result T, ok bool) {
84-
iter := bt.Iter()
85-
if !iter.Seek(item) {
86-
iter.Release()
87-
return
88-
}
89-
90-
result = iter.Item()
91-
ok = true
92-
iter.Release()
83+
// ReverseSeek returns the first item that is less than or equal to the pivot
84+
func (bt *BTree[T]) ReverseSeek(pivot T) (result T, ok bool) {
85+
bt.Load().Descend(pivot, func(item T) bool {
86+
result = item
87+
ok = true
88+
return false
89+
})
9390
return
9491
}

mvdata.go

+3-7
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,6 @@ func (d *MVData) Read(key Key, txn TxnIndex) (Value, TxnVersion, bool) {
6262
return nil, InvalidTxnVersion, false
6363
}
6464

65-
// index order is reversed,
6665
// find the closing txn that's less than the given txn
6766
item, ok := seekClosestTxn(tree, txn)
6867
if !ok {
@@ -115,8 +114,7 @@ func (d *MVData) Snapshot() (snapshot []KVPair) {
115114

116115
func (d *MVData) SnapshotTo(cb func(pair KVPair) bool) {
117116
d.Scan(func(outer dataItem) bool {
118-
// index order is reversed, `Min` is the latest
119-
item, ok := outer.Tree.Min()
117+
item, ok := outer.Tree.Max()
120118
if !ok {
121119
return true
122120
}
@@ -153,16 +151,14 @@ type secondaryDataItem struct {
153151
}
154152

155153
func secondaryLesser(a, b secondaryDataItem) bool {
156-
// reverse the order
157-
return a.Index > b.Index
154+
return a.Index < b.Index
158155
}
159156

160157
func (item secondaryDataItem) Version() TxnVersion {
161158
return TxnVersion{Index: item.Index, Incarnation: item.Incarnation}
162159
}
163160

164161
// seekClosestTxn returns the closest txn that's less than the given txn.
165-
// NOTE: the tx index order is reversed.
166162
func seekClosestTxn(tree *BTree[secondaryDataItem], txn TxnIndex) (secondaryDataItem, bool) {
167-
return tree.Seek(secondaryDataItem{Index: txn - 1})
163+
return tree.ReverseSeek(secondaryDataItem{Index: txn - 1})
168164
}

0 commit comments

Comments
 (0)