func()

in banyand/tsdb/block_ctrl.go [235:275]


func (bc *blockController) create(start time.Time) (*block, error) {
	start = bc.Standard(start)
	if start.Before(bc.segTimeRange.Start) {
		start = bc.segTimeRange.Start
	}
	if !start.Before(bc.segTimeRange.End) {
		return nil, bucket.ErrNoMoreBucket
	}
	bc.Lock()
	defer bc.Unlock()
	var next *block
	for _, s := range bc.lst {
		if s.Start.Equal(start) {
			return s, nil
		}
		if next == nil && s.Start.After(start) {
			next = s
		}
	}
	stdEnd := bc.blockSize.nextTime(start)
	var end time.Time
	if next != nil && next.Start.Before(stdEnd) {
		end = next.Start
	} else {
		end = stdEnd
	}
	if end.After(bc.segTimeRange.End) {
		end = bc.segTimeRange.End
	}
	if err := mkdirIfNotExist(blockTemplate, bc.location, bc.Format(start)); err != nil {
		return nil, err
	}
	b, err := bc.load(start, end, bc.location)
	if err != nil {
		return nil, err
	}
	if err = b.openSafely(); err != nil {
		return nil, err
	}
	return b, nil
}