in origin/blobclient/cluster_client.go [209:249]
func (c *clusterClient) Owners(d core.Digest) ([]core.PeerContext, error) {
clients, err := c.resolver.Resolve(d)
if err != nil {
return nil, fmt.Errorf("resolve clients: %s", err)
}
var mu sync.Mutex
var peers []core.PeerContext
var errs []error
var wg sync.WaitGroup
for _, client := range clients {
wg.Add(1)
go func(client Client) {
defer wg.Done()
pctx, err := client.GetPeerContext()
mu.Lock()
if err != nil {
errs = append(errs, err)
} else {
peers = append(peers, pctx)
}
mu.Unlock()
}(client)
}
wg.Wait()
err = errutil.Join(errs)
if len(peers) == 0 {
if err != nil {
return nil, err
}
return nil, errors.New("no origin peers found")
}
if err != nil {
log.With("blob", d.Hex()).Errorf("Error getting all origin peers: %s", err)
}
return peers, nil
}