code: func (i *Index) tagValueSeriesIDIterator(name, key, value []byte) (tsdb.SeriesIDIterator, error) {
  	// Check series ID set cache...
  	if i.config.SeriesIDSetCacheSize > 0 { // Cache enabled.
  		if ss := i.tagValueCache.Get(name, key, value); ss != nil {
  			// Return a clone because the set is mutable.
  			return tsdb.NewSeriesIDSetIterator(ss.Clone()), nil
  		}
  	}
  
  	a := make([]tsdb.SeriesIDIterator, 0, len(i.partitions))
  	for _, p := range i.partitions {
  		itr, err := p.TagValueSeriesIDIterator(name, key, value)
  		if err != nil {
  			return nil, err
  		} else if itr != nil {
  			a = append(a, itr)
  		}
  	}
  
  	itr := tsdb.MergeSeriesIDIterators(a...)
  	if i.config.SeriesIDSetCacheSize == 0 { // Cache disabled.
  		return itr, nil
  	}
  
  	// Check if the iterator contains only series id sets. Cache them...
  	if ssitr, ok := itr.(tsdb.SeriesIDSetIterator); ok {
  		ss := ssitr.SeriesIDSet()
  		ss.SetCOW(true) // This is important to speed the clone up.
  		i.tagValueCache.Put(name, key, value, ss)
  	}
  	return itr, nil
  }
docs: // tagValueSeriesIDIterator returns a series iterator for a single tag value.