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
}