From c78335a023f2298b658272486dfd830c24ce4ed1 Mon Sep 17 00:00:00 2001 From: Stephen J Day Date: Fri, 9 Jan 2015 16:09:45 -0800 Subject: [PATCH] Correctly handle missing layer upload Because we guarded the error check, nil Upload on the handler was getting through to unexpected branches. This directly handles the missing upload ensuring its set as expected. Signed-off-by: Stephen J Day --- registry/layerupload.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/registry/layerupload.go b/registry/layerupload.go index 158bf7b4f..d597afa69 100644 --- a/registry/layerupload.go +++ b/registry/layerupload.go @@ -53,11 +53,18 @@ func layerUploadDispatcher(ctx *Context, r *http.Request) http.Handler { layers := ctx.services.Layers() upload, err := layers.Resume(luh.Name, luh.UUID) - if err != nil && err != storage.ErrLayerUploadUnknown { + if err != nil { + ctx.log.Errorf("error resolving upload: %v", err) + if err == storage.ErrLayerUploadUnknown { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotFound) + luh.Errors.Push(v2.ErrorCodeBlobUploadUnknown, err) + }) + } + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - ctx.log.Errorf("error resolving upload: %v", err) - w.WriteHeader(http.StatusBadRequest) - luh.Errors.Push(v2.ErrorCodeBlobUploadUnknown, err) + w.WriteHeader(http.StatusInternalServerError) + luh.Errors.Push(v2.ErrorCodeUnknown, err) }) } luh.Upload = upload @@ -68,6 +75,7 @@ func layerUploadDispatcher(ctx *Context, r *http.Request) http.Handler { // problems. We basically cancel the upload and tell the client to // start over. if nn, err := upload.Seek(luh.State.Offset, os.SEEK_SET); err != nil { + defer upload.Close() ctx.log.Infof("error seeking layer upload: %v", err) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadRequest) @@ -75,6 +83,7 @@ func layerUploadDispatcher(ctx *Context, r *http.Request) http.Handler { upload.Cancel() }) } else if nn != luh.State.Offset { + defer upload.Close() ctx.log.Infof("seek to wrong offest: %d != %d", nn, luh.State.Offset) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadRequest) @@ -129,6 +138,7 @@ func (luh *layerUploadHandler) GetUploadStatus(w http.ResponseWriter, r *http.Re if luh.Upload == nil { w.WriteHeader(http.StatusNotFound) luh.Errors.Push(v2.ErrorCodeBlobUploadUnknown) + return } if err := luh.layerUploadResponse(w, r); err != nil {