Merge pull request #10519 from matejvasek/use-req-ctx
Use request context instead of background
This commit is contained in:
		
						commit
						ce2b331fef
					
				|  | @ -1,7 +1,6 @@ | |||
| package compat | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"io/ioutil" | ||||
|  | @ -12,7 +11,6 @@ import ( | |||
| 	"github.com/containers/podman/v3/libpod" | ||||
| 	"github.com/containers/podman/v3/pkg/api/handlers/utils" | ||||
| 	"github.com/containers/podman/v3/pkg/auth" | ||||
| 	"github.com/containers/podman/v3/pkg/channel" | ||||
| 	"github.com/containers/podman/v3/pkg/domain/entities" | ||||
| 	"github.com/containers/podman/v3/pkg/domain/infra/abi" | ||||
| 	"github.com/containers/storage" | ||||
|  | @ -101,46 +99,33 @@ func PushImage(w http.ResponseWriter, r *http.Request) { | |||
| 		destination = imageName | ||||
| 	} | ||||
| 
 | ||||
| 	errorWriter := channel.NewWriter(make(chan []byte)) | ||||
| 	defer errorWriter.Close() | ||||
| 
 | ||||
| 	statusWriter := channel.NewWriter(make(chan []byte)) | ||||
| 	defer statusWriter.Close() | ||||
| 
 | ||||
| 	runCtx, cancel := context.WithCancel(context.Background()) | ||||
| 	var failed bool | ||||
| 
 | ||||
| 	go func() { | ||||
| 		defer cancel() | ||||
| 
 | ||||
| 		statusWriter.Write([]byte(fmt.Sprintf("The push refers to repository [%s]", imageName))) | ||||
| 
 | ||||
| 		err := imageEngine.Push(runCtx, imageName, destination, options) | ||||
| 		if err != nil { | ||||
| 			if errors.Cause(err) != storage.ErrImageUnknown { | ||||
| 				errorWriter.Write([]byte("An image does not exist locally with the tag: " + imageName)) | ||||
| 			} else { | ||||
| 				errorWriter.Write([]byte(err.Error())) | ||||
| 			} | ||||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	flush := func() { | ||||
| 	flush := func() {} | ||||
| 	if flusher, ok := w.(http.Flusher); ok { | ||||
| 			flusher.Flush() | ||||
| 		} | ||||
| 		flush = flusher.Flush | ||||
| 	} | ||||
| 
 | ||||
| 	w.WriteHeader(http.StatusOK) | ||||
| 	w.Header().Add("Content-Type", "application/json") | ||||
| 	flush() | ||||
| 
 | ||||
| 	var report jsonmessage.JSONMessage | ||||
| 	enc := json.NewEncoder(w) | ||||
| 	enc.SetEscapeHTML(true) | ||||
| 
 | ||||
| 	report.Status = fmt.Sprintf("The push refers to repository [%s]", imageName) | ||||
| 	if err := enc.Encode(report); err != nil { | ||||
| 		logrus.Warnf("Failed to json encode error %q", err.Error()) | ||||
| 	} | ||||
| 	flush() | ||||
| 
 | ||||
| 	pushErrChan := make(chan error) | ||||
| 	go func() { | ||||
| 		pushErrChan <- imageEngine.Push(r.Context(), imageName, destination, options) | ||||
| 	}() | ||||
| 
 | ||||
| loop: // break out of for/select infinite loop
 | ||||
| 	for { | ||||
| 		var report jsonmessage.JSONMessage | ||||
| 		report = jsonmessage.JSONMessage{} | ||||
| 
 | ||||
| 		select { | ||||
| 		case e := <-options.Progress: | ||||
|  | @ -160,29 +145,40 @@ loop: // break out of for/select infinite loop | |||
| 			} | ||||
| 			report.ID = e.Artifact.Digest.Encoded()[0:12] | ||||
| 			if err := enc.Encode(report); err != nil { | ||||
| 				errorWriter.Write([]byte(err.Error())) | ||||
| 				logrus.Warnf("Failed to json encode error %q", err.Error()) | ||||
| 			} | ||||
| 			flush() | ||||
| 		case e := <-statusWriter.Chan(): | ||||
| 			report.Status = string(e) | ||||
| 			if err := enc.Encode(report); err != nil { | ||||
| 				errorWriter.Write([]byte(err.Error())) | ||||
| 		case err := <-pushErrChan: | ||||
| 			if err != nil { | ||||
| 				var msg string | ||||
| 				if errors.Cause(err) != storage.ErrImageUnknown { | ||||
| 					msg = "An image does not exist locally with the tag: " + imageName | ||||
| 				} else { | ||||
| 					msg = err.Error() | ||||
| 				} | ||||
| 			flush() | ||||
| 		case e := <-errorWriter.Chan(): | ||||
| 			failed = true | ||||
| 				report.Error = &jsonmessage.JSONError{ | ||||
| 				Message: string(e), | ||||
| 					Message: msg, | ||||
| 				} | ||||
| 			report.ErrorMessage = string(e) | ||||
| 				report.ErrorMessage = msg | ||||
| 				if err := enc.Encode(report); err != nil { | ||||
| 					logrus.Warnf("Failed to json encode error %q", err.Error()) | ||||
| 				} | ||||
| 				flush() | ||||
| 		case <-runCtx.Done(): | ||||
| 			if !failed { | ||||
| 				break loop | ||||
| 			} | ||||
| 
 | ||||
| 			digestBytes, err := ioutil.ReadAll(digestFile) | ||||
| 				if err == nil { | ||||
| 			if err != nil { | ||||
| 				report.Error = &jsonmessage.JSONError{ | ||||
| 					Message: err.Error(), | ||||
| 				} | ||||
| 				report.ErrorMessage = err.Error() | ||||
| 				if err := enc.Encode(report); err != nil { | ||||
| 					logrus.Warnf("Failed to json encode error %q", err.Error()) | ||||
| 				} | ||||
| 				flush() | ||||
| 				break loop | ||||
| 			} | ||||
| 			tag := query.Tag | ||||
| 			if tag == "" { | ||||
| 				tag = "latest" | ||||
|  | @ -191,12 +187,8 @@ loop: // break out of for/select infinite loop | |||
| 			if err := enc.Encode(report); err != nil { | ||||
| 				logrus.Warnf("Failed to json encode error %q", err.Error()) | ||||
| 			} | ||||
| 
 | ||||
| 			flush() | ||||
| 				} | ||||
| 			} | ||||
| 			break loop // break out of for/select infinite loop
 | ||||
| 		case <-r.Context().Done(): | ||||
| 			// Client has closed connection
 | ||||
| 			break loop // break out of for/select infinite loop
 | ||||
| 		} | ||||
| 	} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue