code: func (sto *unionStorage) Fetch(ctx context.Context, b blob.Ref) (file io.ReadCloser, size uint32, err error) {
  	type result struct {
  		file io.ReadCloser
  		size uint32
  		err  error
  	}
  	results := make(chan result, len(sto.subsets))
  	var wg sync.WaitGroup
  	for _, bs := range sto.subsets {
  		bs := bs
  		wg.Add(1)
  		go func() {
  			defer wg.Done()
  			var res result
  			res.file, res.size, res.err = bs.Fetch(ctx, b)
  			results <- res
  		}()
  	}
  	go func() {
  		wg.Wait()
  		close(results)
  	}()
  	var firstErr error
  	var firstRes result
  	for r := range results {
  		if r.err != nil {
  			if firstErr == nil {
  				firstErr = r.err
  			}
  			continue
  		}
  		if firstRes.file != nil {
  			if r.file != nil {
  				r.file.Close() // don't need, we already have a successful Fetch
  			}
  			continue
  		}
  
  		firstRes = r
  	}
  	if firstRes.file != nil {
  		return firstRes.file, firstRes.size, nil
  	}
  	return nil, 0, firstErr
  }
docs: // Fetch the blob by trying all configured read Storage concurrently,
  // returning the first successful response, or the first error if there's no match.