github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/graveler/sstable/iterator.go (about) 1 package sstable 2 3 import ( 4 "github.com/cockroachdb/pebble/sstable" 5 "github.com/treeverse/lakefs/pkg/graveler/committed" 6 ) 7 8 // Iterator returns ordered iteration of the SSTable entries 9 type Iterator struct { 10 it sstable.Iterator 11 12 currKey *sstable.InternalKey 13 currValue []byte 14 15 postSeek bool 16 err error 17 derefer func() error 18 } 19 20 func NewIterator(it sstable.Iterator, derefer func() error) *Iterator { 21 iter := &Iterator{ 22 it: it, 23 derefer: derefer, 24 } 25 26 return iter 27 } 28 29 func (iter *Iterator) SeekGE(lookup committed.Key) { 30 key, value := iter.it.SeekGE(lookup, sstable.SeekGEFlags(0)) 31 val, err := retrieveValue(value) 32 iter.currKey = key 33 iter.currValue = val 34 iter.err = err 35 iter.postSeek = true 36 } 37 38 func (iter *Iterator) Next() bool { 39 if !iter.postSeek { 40 key, value := iter.it.Next() 41 iter.currKey = key 42 val, err := retrieveValue(value) 43 iter.err = err 44 iter.currValue = val 45 } 46 iter.postSeek = false 47 48 if iter.currKey == nil && iter.currValue == nil { 49 return false 50 } 51 52 return true 53 } 54 55 func (iter *Iterator) Value() *committed.Record { 56 if iter.currKey == nil || iter.err != nil || iter.postSeek { 57 return nil 58 } 59 60 return &committed.Record{ 61 Key: iter.currKey.UserKey, 62 Value: iter.currValue, 63 } 64 } 65 66 func (iter *Iterator) Err() error { 67 return iter.err 68 } 69 70 func (iter *Iterator) Close() { 71 if iter.it == nil { 72 return 73 } 74 err := iter.it.Close() 75 iter.updateOnNilErr(err) 76 77 err = iter.derefer() 78 iter.updateOnNilErr(err) 79 80 iter.it = nil 81 } 82 83 func (iter *Iterator) updateOnNilErr(err error) { 84 if iter.err == nil { 85 // avoid overriding earlier errors 86 iter.err = err 87 } 88 }