func()

in banyand/tsdb/bucket/strategy.go [140:173]


func (s *Strategy) observe(c Channel) bool {
	var next Reporter
	moreBucket := true
	for {
		select {
		case status, more := <-c:
			if !more {
				return moreBucket
			}
			r := ratio(status.Volume) / ratio(status.Capacity)
			atomic.StoreUint64(&s.currentRatio, math.Float64bits(float64(r)))
			if r >= s.ratio && next == nil && moreBucket {
				n, err := s.ctrl.Next()
				if errors.Is(err, ErrNoMoreBucket) {
					moreBucket = false
				} else if err != nil {
					s.logger.Err(err).Msg("failed to create the next bucket")
				} else {
					s.logger.Info().Stringer("next", n).Msg("created the next bucket")
					next = n
				}
			}
			if r >= 1.0 {
				s.ctrl.OnMove(s.current.Load().(Reporter), next)
				if next != nil {
					s.current.Store(next)
				}
				return moreBucket
			}
		case <-s.closer.CloseNotify():
			return false
		}
	}
}