瀏覽代碼

Merge pull request #18418 from aaronlehmann/no-head-requests

Avoid a HEAD request for each layer in a v2 pull
David Calavera 9 年之前
父節點
當前提交
82c47088db
共有 1 個文件被更改,包括 15 次插入8 次删除
  1. 15 8
      distribution/pull_v2.go

+ 15 - 8
distribution/pull_v2.go

@@ -130,14 +130,6 @@ func (p *v2Puller) download(di *downloadInfo) {
 
 	blobs := p.repo.Blobs(context.Background())
 
-	desc, err := blobs.Stat(context.Background(), di.digest)
-	if err != nil {
-		logrus.Debugf("Error statting layer: %v", err)
-		di.err <- err
-		return
-	}
-	di.size = desc.Size
-
 	layerDownload, err := blobs.Open(context.Background(), di.digest)
 	if err != nil {
 		logrus.Debugf("Error fetching layer: %v", err)
@@ -146,6 +138,21 @@ func (p *v2Puller) download(di *downloadInfo) {
 	}
 	defer layerDownload.Close()
 
+	di.size, err = layerDownload.Seek(0, os.SEEK_END)
+	if err != nil {
+		// Seek failed, perhaps because there was no Content-Length
+		// header. This shouldn't fail the download, because we can
+		// still continue without a progress bar.
+		di.size = 0
+	} else {
+		// Restore the seek offset at the beginning of the stream.
+		_, err = layerDownload.Seek(0, os.SEEK_SET)
+		if err != nil {
+			di.err <- err
+			return
+		}
+	}
+
 	verifier, err := digest.NewDigestVerifier(di.digest)
 	if err != nil {
 		di.err <- err