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  }