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  }