[Client] Fix possible goroutine leak in push.

The same as 5a804ac05b
This commit is contained in:
Anton Tiurin 2014-11-21 11:20:16 +03:00
parent 1caf81bf5e
commit 2071422bea

View File

@ -36,6 +36,8 @@ func Push(c Client, objectStore ObjectStore, name, tag string) error {
errChans[i] = make(chan error)
}
cancelCh := make(chan struct{})
// Iterate over each layer in the manifest, simultaneously pushing no more
// than simultaneousLayerPushWindow layers at a time. If an error is
// received from a layer push, we abort the push.
@ -45,13 +47,17 @@ func Push(c Client, objectStore ObjectStore, name, tag string) error {
err := <-errChans[dependentLayer]
if err != nil {
log.WithField("error", err).Warn("Push aborted")
close(cancelCh)
return err
}
}
if i < len(manifest.FSLayers) {
go func(i int) {
errChans[i] <- pushLayer(c, objectStore, name, manifest.FSLayers[i])
select {
case errChans[i] <- pushLayer(c, objectStore, name, manifest.FSLayers[i]):
case <-cancelCh: // recv broadcast notification about cancelation
}
}(i)
}
}