in core/log/metric/searcher.go [111:170]
func (s *DefaultMetricSearcher) findOffsetToStart(filename string, beginTimeMs uint64, lastPos uint64) (int64, error) {
s.cachedPos.idxFilename = ""
s.cachedPos.metricFilename = ""
idxFilename := formMetricIdxFileName(filename)
if _, err := os.Stat(idxFilename); err != nil {
return 0, err
}
beginSec := beginTimeMs / 1000
file, err := os.Open(idxFilename)
if err != nil {
return 0, errors.Wrap(err, "failed to open metric idx file: "+idxFilename)
}
defer file.Close()
// Set position to the offset recorded in the idx file
_, err = file.Seek(int64(lastPos), io.SeekStart)
if err != nil {
return 0, errors.Wrapf(err, "failed to fseek idx to offset %d", lastPos)
}
curPos, err := util.FilePosition(file)
if err != nil {
return 0, nil
}
s.cachedPos.curOffsetInIdx = uint64(curPos)
var sec uint64 = 0
var offset int64 = 0
for {
err = binary.Read(file, binary.BigEndian, &sec)
if err != nil {
if err == io.EOF {
// EOF but offset hasn't been found yet, which indicates the expected position is not in current file
return offsetNotFound, nil
}
return 0, err
}
if sec >= beginSec {
break
}
err = binary.Read(file, binary.BigEndian, &offset)
if err != nil {
return 0, err
}
curPos, err := util.FilePosition(file)
if err != nil {
return 0, nil
}
s.cachedPos.curOffsetInIdx = uint64(curPos)
}
err = binary.Read(file, binary.BigEndian, &offset)
if err != nil {
return 0, err
}
// Cache the idx filename and position
s.cachedPos.metricFilename = filename
s.cachedPos.idxFilename = idxFilename
s.cachedPos.curSecInIdx = sec
return offset, nil
}