in proxy/proxyserver/preheat.go [89:121]
func (ph *PreheatHandler) fetchManifest(repo, digest string) (distribution.Manifest, error) {
d, err := core.ParseSHA256Digest(digest)
if err != nil {
return nil, fmt.Errorf("Error parse digest: %s ", err)
}
buf := &bytes.Buffer{}
// there may be a gap between registry finish uploading manifest and send notification.
// see https://github.com/docker/distribution/issues/2625.
interval := 100 * time.Millisecond
for i := 0; i < 4; i++ {
if i != 0 {
time.Sleep(interval)
interval = interval * 2
}
if err := ph.clusterClient.DownloadBlob(repo, d, buf); err == nil {
break
} else if err == blobclient.ErrBlobNotFound {
continue
} else {
return nil, fmt.Errorf("download manifest: %s", err)
}
}
if buf.Len() == 0 {
return nil, fmt.Errorf("manifest not found")
}
manifest, _, err := dockerutil.ParseManifest(buf)
if err != nil {
return nil, fmt.Errorf("parse manifest: %s", err)
}
return manifest, nil
}