func()

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
}