code: func (s *Server) getSeries(ctx *requestContext) (mdata.Result, error) {
  	res, err := s.getSeriesAggMetrics(ctx)
  	if err != nil {
  		return res, err
  	}
  	select {
  	case <-ctx.ctx.Done():
  		//request canceled
  		return res, nil
  	default:
  	}
  
  	log.Debugf("oldest from aggmetrics is %d", res.Oldest)
  	span := opentracing.SpanFromContext(ctx.ctx)
  	span.SetTag("oldest_in_ring", res.Oldest)
  
  	if res.Oldest <= ctx.From {
  		reqSpanMem.ValueUint32(ctx.To - ctx.From)
  		return res, nil
  	}
  
  	// if oldest < to -> search until oldest, we already have the rest from mem
  	// if to < oldest -> no need to search until oldest, only search until to
  	// adds iters from both the cache and the store (if applicable)
  	until := util.Min(res.Oldest, ctx.To)
  	fromCache, err := s.getSeriesCachedStore(ctx, until)
  	if err != nil {
  		return res, err
  	}
  	res.Iters = append(fromCache, res.Iters...)
  	return res, nil
  }
docs: // getSeries returns points from mem (and store if needed), within the range from (inclusive) - to (exclusive)
  // it can query for data within aggregated archives, by using fn min/max/sum/cnt and providing the matching agg span as interval
  // pass consolidation.None as consolidator to mean read from raw interval, otherwise we'll read from aggregated series.