|
@@ -151,7 +151,7 @@ func (ldm *LayerDownloadManager) Download(ctx context.Context, initialRootFS ima
|
|
var topDownloadUncasted transfer
|
|
var topDownloadUncasted transfer
|
|
if existingDownload, ok := downloadsByKey[key]; ok {
|
|
if existingDownload, ok := downloadsByKey[key]; ok {
|
|
xferFunc := ldm.makeDownloadFuncFromDownload(descriptor, existingDownload, topDownload)
|
|
xferFunc := ldm.makeDownloadFuncFromDownload(descriptor, existingDownload, topDownload)
|
|
- defer topDownload.transfer.Release(watcher)
|
|
|
|
|
|
+ defer topDownload.transfer.release(watcher)
|
|
topDownloadUncasted, watcher = ldm.tm.transfer(transferKey, xferFunc, progressOutput)
|
|
topDownloadUncasted, watcher = ldm.tm.transfer(transferKey, xferFunc, progressOutput)
|
|
topDownload = topDownloadUncasted.(*downloadTransfer)
|
|
topDownload = topDownloadUncasted.(*downloadTransfer)
|
|
continue
|
|
continue
|
|
@@ -163,7 +163,7 @@ func (ldm *LayerDownloadManager) Download(ctx context.Context, initialRootFS ima
|
|
var xferFunc DoFunc
|
|
var xferFunc DoFunc
|
|
if topDownload != nil {
|
|
if topDownload != nil {
|
|
xferFunc = ldm.makeDownloadFunc(descriptor, "", topDownload)
|
|
xferFunc = ldm.makeDownloadFunc(descriptor, "", topDownload)
|
|
- defer topDownload.transfer.Release(watcher)
|
|
|
|
|
|
+ defer topDownload.transfer.release(watcher)
|
|
} else {
|
|
} else {
|
|
xferFunc = ldm.makeDownloadFunc(descriptor, rootFS.ChainID(), nil)
|
|
xferFunc = ldm.makeDownloadFunc(descriptor, rootFS.ChainID(), nil)
|
|
}
|
|
}
|
|
@@ -192,15 +192,15 @@ func (ldm *LayerDownloadManager) Download(ctx context.Context, initialRootFS ima
|
|
|
|
|
|
select {
|
|
select {
|
|
case <-ctx.Done():
|
|
case <-ctx.Done():
|
|
- topDownload.transfer.Release(watcher)
|
|
|
|
|
|
+ topDownload.transfer.release(watcher)
|
|
return rootFS, func() {}, ctx.Err()
|
|
return rootFS, func() {}, ctx.Err()
|
|
- case <-topDownload.Done():
|
|
|
|
|
|
+ case <-topDownload.done():
|
|
break
|
|
break
|
|
}
|
|
}
|
|
|
|
|
|
l, err := topDownload.result()
|
|
l, err := topDownload.result()
|
|
if err != nil {
|
|
if err != nil {
|
|
- topDownload.transfer.Release(watcher)
|
|
|
|
|
|
+ topDownload.transfer.release(watcher)
|
|
return rootFS, func() {}, err
|
|
return rootFS, func() {}, err
|
|
}
|
|
}
|
|
|
|
|
|
@@ -208,13 +208,13 @@ func (ldm *LayerDownloadManager) Download(ctx context.Context, initialRootFS ima
|
|
// base layer on Windows.
|
|
// base layer on Windows.
|
|
for range layers {
|
|
for range layers {
|
|
if l == nil {
|
|
if l == nil {
|
|
- topDownload.transfer.Release(watcher)
|
|
|
|
|
|
+ topDownload.transfer.release(watcher)
|
|
return rootFS, func() {}, errors.New("internal error: too few parent layers")
|
|
return rootFS, func() {}, errors.New("internal error: too few parent layers")
|
|
}
|
|
}
|
|
rootFS.DiffIDs = append([]layer.DiffID{l.DiffID()}, rootFS.DiffIDs...)
|
|
rootFS.DiffIDs = append([]layer.DiffID{l.DiffID()}, rootFS.DiffIDs...)
|
|
l = l.Parent()
|
|
l = l.Parent()
|
|
}
|
|
}
|
|
- return rootFS, func() { topDownload.transfer.Release(watcher) }, err
|
|
|
|
|
|
+ return rootFS, func() { topDownload.transfer.release(watcher) }, err
|
|
}
|
|
}
|
|
|
|
|
|
// makeDownloadFunc returns a function that performs the layer download and
|
|
// makeDownloadFunc returns a function that performs the layer download and
|
|
@@ -247,7 +247,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
// Did the parent download already fail or get
|
|
// Did the parent download already fail or get
|
|
// cancelled?
|
|
// cancelled?
|
|
select {
|
|
select {
|
|
- case <-parentDownload.Done():
|
|
|
|
|
|
+ case <-parentDownload.done():
|
|
_, err := parentDownload.result()
|
|
_, err := parentDownload.result()
|
|
if err != nil {
|
|
if err != nil {
|
|
d.err = err
|
|
d.err = err
|
|
@@ -267,7 +267,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
defer descriptor.Close()
|
|
defer descriptor.Close()
|
|
|
|
|
|
for {
|
|
for {
|
|
- downloadReader, size, err = descriptor.Download(d.transfer.Context(), progressOutput)
|
|
|
|
|
|
+ downloadReader, size, err = descriptor.Download(d.transfer.context(), progressOutput)
|
|
if err == nil {
|
|
if err == nil {
|
|
break
|
|
break
|
|
}
|
|
}
|
|
@@ -275,7 +275,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
// If an error was returned because the context
|
|
// If an error was returned because the context
|
|
// was cancelled, we shouldn't retry.
|
|
// was cancelled, we shouldn't retry.
|
|
select {
|
|
select {
|
|
- case <-d.transfer.Context().Done():
|
|
|
|
|
|
+ case <-d.transfer.context().Done():
|
|
d.err = err
|
|
d.err = err
|
|
return
|
|
return
|
|
default:
|
|
default:
|
|
@@ -302,7 +302,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
ticker.Stop()
|
|
ticker.Stop()
|
|
break selectLoop
|
|
break selectLoop
|
|
}
|
|
}
|
|
- case <-d.transfer.Context().Done():
|
|
|
|
|
|
+ case <-d.transfer.context().Done():
|
|
ticker.Stop()
|
|
ticker.Stop()
|
|
d.err = errors.New("download cancelled during retry delay")
|
|
d.err = errors.New("download cancelled during retry delay")
|
|
return
|
|
return
|
|
@@ -315,11 +315,11 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
|
|
|
|
if parentDownload != nil {
|
|
if parentDownload != nil {
|
|
select {
|
|
select {
|
|
- case <-d.transfer.Context().Done():
|
|
|
|
|
|
+ case <-d.transfer.context().Done():
|
|
d.err = errors.New("layer registration cancelled")
|
|
d.err = errors.New("layer registration cancelled")
|
|
downloadReader.Close()
|
|
downloadReader.Close()
|
|
return
|
|
return
|
|
- case <-parentDownload.Done():
|
|
|
|
|
|
+ case <-parentDownload.done():
|
|
}
|
|
}
|
|
|
|
|
|
l, err := parentDownload.result()
|
|
l, err := parentDownload.result()
|
|
@@ -331,7 +331,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
parentLayer = l.ChainID()
|
|
parentLayer = l.ChainID()
|
|
}
|
|
}
|
|
|
|
|
|
- reader := progress.NewProgressReader(ioutils.NewCancelReadCloser(d.transfer.Context(), downloadReader), progressOutput, size, descriptor.ID(), "Extracting")
|
|
|
|
|
|
+ reader := progress.NewProgressReader(ioutils.NewCancelReadCloser(d.transfer.context(), downloadReader), progressOutput, size, descriptor.ID(), "Extracting")
|
|
defer reader.Close()
|
|
defer reader.Close()
|
|
|
|
|
|
inflatedLayerData, err := archive.DecompressStream(reader)
|
|
inflatedLayerData, err := archive.DecompressStream(reader)
|
|
@@ -351,7 +351,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
}
|
|
}
|
|
if err != nil {
|
|
if err != nil {
|
|
select {
|
|
select {
|
|
- case <-d.transfer.Context().Done():
|
|
|
|
|
|
+ case <-d.transfer.context().Done():
|
|
d.err = errors.New("layer registration cancelled")
|
|
d.err = errors.New("layer registration cancelled")
|
|
default:
|
|
default:
|
|
d.err = fmt.Errorf("failed to register layer: %v", err)
|
|
d.err = fmt.Errorf("failed to register layer: %v", err)
|
|
@@ -368,7 +368,7 @@ func (ldm *LayerDownloadManager) makeDownloadFunc(descriptor DownloadDescriptor,
|
|
// Doesn't actually need to be its own goroutine, but
|
|
// Doesn't actually need to be its own goroutine, but
|
|
// done like this so we can defer close(c).
|
|
// done like this so we can defer close(c).
|
|
go func() {
|
|
go func() {
|
|
- <-d.transfer.Released()
|
|
|
|
|
|
+ <-d.transfer.released()
|
|
if d.layer != nil {
|
|
if d.layer != nil {
|
|
layer.ReleaseAndLog(d.layerStore, d.layer)
|
|
layer.ReleaseAndLog(d.layerStore, d.layer)
|
|
}
|
|
}
|
|
@@ -403,10 +403,10 @@ func (ldm *LayerDownloadManager) makeDownloadFuncFromDownload(descriptor Downloa
|
|
close(inactive)
|
|
close(inactive)
|
|
|
|
|
|
select {
|
|
select {
|
|
- case <-d.transfer.Context().Done():
|
|
|
|
|
|
+ case <-d.transfer.context().Done():
|
|
d.err = errors.New("layer registration cancelled")
|
|
d.err = errors.New("layer registration cancelled")
|
|
return
|
|
return
|
|
- case <-parentDownload.Done():
|
|
|
|
|
|
+ case <-parentDownload.done():
|
|
}
|
|
}
|
|
|
|
|
|
l, err := parentDownload.result()
|
|
l, err := parentDownload.result()
|
|
@@ -420,10 +420,10 @@ func (ldm *LayerDownloadManager) makeDownloadFuncFromDownload(descriptor Downloa
|
|
// parentDownload finished, but wait for it explicitly
|
|
// parentDownload finished, but wait for it explicitly
|
|
// to be sure.
|
|
// to be sure.
|
|
select {
|
|
select {
|
|
- case <-d.transfer.Context().Done():
|
|
|
|
|
|
+ case <-d.transfer.context().Done():
|
|
d.err = errors.New("layer registration cancelled")
|
|
d.err = errors.New("layer registration cancelled")
|
|
return
|
|
return
|
|
- case <-sourceDownload.Done():
|
|
|
|
|
|
+ case <-sourceDownload.done():
|
|
}
|
|
}
|
|
|
|
|
|
l, err = sourceDownload.result()
|
|
l, err = sourceDownload.result()
|
|
@@ -461,7 +461,7 @@ func (ldm *LayerDownloadManager) makeDownloadFuncFromDownload(descriptor Downloa
|
|
// Doesn't actually need to be its own goroutine, but
|
|
// Doesn't actually need to be its own goroutine, but
|
|
// done like this so we can defer close(c).
|
|
// done like this so we can defer close(c).
|
|
go func() {
|
|
go func() {
|
|
- <-d.transfer.Released()
|
|
|
|
|
|
+ <-d.transfer.released()
|
|
if d.layer != nil {
|
|
if d.layer != nil {
|
|
layer.ReleaseAndLog(d.layerStore, d.layer)
|
|
layer.ReleaseAndLog(d.layerStore, d.layer)
|
|
}
|
|
}
|