diff --git a/storage/layer.go b/storage/layer.go index 24736c70..b7d84a98 100644 --- a/storage/layer.go +++ b/storage/layer.go @@ -94,3 +94,14 @@ type ErrLayerInvalidSize struct { func (err ErrLayerInvalidSize) Error() string { return fmt.Sprintf("invalid layer size: %d", err.Size) } + +// ErrLayerUploadUnavailable signals missing upload data, either when no data +// has been received or when the backend reports the data as missing. This is +// different from ErrLayerUploadUnknown. +type ErrLayerUploadUnavailable struct { + Err error +} + +func (err ErrLayerUploadUnavailable) Error() string { + return fmt.Sprintf("layer upload unavialable: %v", err) +} diff --git a/storage/layerupload.go b/storage/layerupload.go index 690e99ec..dbd9140e 100644 --- a/storage/layerupload.go +++ b/storage/layerupload.go @@ -102,7 +102,22 @@ func (luc *layerUploadController) validateLayer(dgst digest.Digest) (digest.Dige // Read the file from the backend driver and validate it. fr, err := newFileReader(luc.fileWriter.driver, luc.path) if err != nil { - return "", err + switch err := err.(type) { + case storagedriver.PathNotFoundError: + // NOTE(stevvooe): Path not found can mean several things by we + // should report the upload is not available. This can happen if + // the following happens: + // + // 1. If not data was received for the upload instance. + // 2. Backend storage driver has not convereged after receiving latest data. + // + // This *does not* mean that the upload does not exist, since we + // can't even get a LayerUpload object without having the + // directory exist. + return "", ErrLayerUploadUnavailable{Err: err} + default: + return "", err + } } tr := io.TeeReader(fr, digestVerifier)