github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/pkg/util/wal/reader.go (about)

     1  package wal
     2  
     3  import (
     4  	"errors"
     5  	"io"
     6  
     7  	"github.com/prometheus/prometheus/tsdb/wal"
     8  )
     9  
    10  // If startSegment is <0, it means all the segments.
    11  func NewWalReader(dir string, startSegment int) (*wal.Reader, io.Closer, error) {
    12  	var (
    13  		segmentReader io.ReadCloser
    14  		err           error
    15  	)
    16  	if startSegment < 0 {
    17  		segmentReader, err = wal.NewSegmentsReader(dir)
    18  		if err != nil {
    19  			return nil, nil, err
    20  		}
    21  	} else {
    22  		first, last, err := wal.Segments(dir)
    23  		if err != nil {
    24  			return nil, nil, err
    25  		}
    26  		if startSegment > last {
    27  			return nil, nil, errors.New("start segment is beyond the last WAL segment")
    28  		}
    29  		if first > startSegment {
    30  			startSegment = first
    31  		}
    32  		segmentReader, err = wal.NewSegmentsRangeReader(wal.SegmentRange{
    33  			Dir:   dir,
    34  			First: startSegment,
    35  			Last:  -1, // Till the end.
    36  		})
    37  		if err != nil {
    38  			return nil, nil, err
    39  		}
    40  	}
    41  	return wal.NewReader(segmentReader), segmentReader, nil
    42  }