github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/kv/local/iterator.go (about) 1 package local 2 3 import ( 4 "time" 5 6 "github.com/dgraph-io/badger/v4" 7 "github.com/treeverse/lakefs/pkg/kv" 8 "github.com/treeverse/lakefs/pkg/logging" 9 ) 10 11 type EntriesIterator struct { 12 start []byte 13 partitionKey []byte 14 primed bool 15 entry *kv.Entry 16 err error 17 iter *badger.Iterator 18 txn *badger.Txn 19 logger logging.Logger 20 } 21 22 func (e *EntriesIterator) Next() bool { 23 if e.err != nil { 24 return false 25 } 26 27 start := time.Now() 28 switch { 29 case !e.primed && e.iter.Valid(): 30 e.primed = true 31 case !e.primed: 32 e.primed = true 33 e.iter.Seek(e.start) 34 default: 35 e.iter.Next() 36 } 37 38 if !e.iter.Valid() { 39 e.logger.Trace("no next values") 40 return false 41 } 42 item := e.iter.Item() 43 value, err := item.ValueCopy(nil) 44 if err != nil { 45 e.logger.WithError(err).Trace("error reading value") 46 e.err = err 47 return false 48 } 49 key := item.KeyCopy(nil) 50 e.entry = &kv.Entry{ 51 PartitionKey: e.partitionKey, 52 Key: key[len(partitionRange(e.partitionKey)):], 53 Value: value, 54 } 55 e.logger.WithField("next_key", string(key)).WithField("took", time.Since(start)).Trace("read next value") 56 return true 57 } 58 59 func (e *EntriesIterator) SeekGE(key []byte) { 60 e.entry = nil 61 e.start = composeKey(e.partitionKey, key) 62 e.primed = false 63 e.iter.Seek(e.start) 64 } 65 66 func (e *EntriesIterator) Entry() *kv.Entry { 67 return e.entry 68 } 69 70 func (e *EntriesIterator) Err() error { 71 return e.err 72 } 73 74 func (e *EntriesIterator) Close() { 75 e.iter.Close() 76 e.txn.Discard() 77 e.err = kv.ErrClosedEntries 78 }