func()

in tracker/metainfoclient/client.go [54:94]


func (c *client) Download(namespace string, d core.Digest) (*core.MetaInfo, error) {
	var resp *http.Response
	var err error
	for _, addr := range c.ring.Locations(d) {
		resp, err = httputil.PollAccepted(
			fmt.Sprintf(
				"http://%s/namespace/%s/blobs/%s/metainfo",
				addr, url.PathEscape(namespace), d),
			&backoff.ExponentialBackOff{
				InitialInterval:     time.Second,
				RandomizationFactor: 0.05,
				Multiplier:          1.3,
				MaxInterval:         5 * time.Second,
				MaxElapsedTime:      15 * time.Minute,
				Clock:               backoff.SystemClock,
			},
			httputil.SendTimeout(10*time.Second),
			httputil.SendTLS(c.tls))
		if err != nil {
			if httputil.IsNetworkError(err) {
				c.ring.Failed(addr)
				continue
			}
			if httputil.IsNotFound(err) {
				return nil, ErrNotFound
			}
			return nil, err
		}
		defer resp.Body.Close()
		b, err := ioutil.ReadAll(resp.Body)
		if err != nil {
			return nil, fmt.Errorf("read body: %s", err)
		}
		mi, err := core.DeserializeMetaInfo(b)
		if err != nil {
			return nil, fmt.Errorf("deserialize metainfo: %s", err)
		}
		return mi, nil
	}
	return nil, err
}