Prechádzať zdrojové kódy

proxy: use atomic operations for requestCanceled flag

Wolfgang Ebner 10 rokov pred
rodič
commit
5e31854afd
1 zmenil súbory, kde vykonal 4 pridanie a 3 odobranie
  1. 4 3
      proxy/reverse.go

+ 4 - 3
proxy/reverse.go

@@ -24,6 +24,7 @@ import (
 	"net/http"
 	"net/url"
 	"strings"
+	"sync/atomic"
 
 	"github.com/coreos/etcd/etcdserver/etcdhttp/httptypes"
 )
@@ -90,7 +91,7 @@ func (p *reverseProxy) ServeHTTP(rw http.ResponseWriter, clientreq *http.Request
 		return
 	}
 
-	requestCanceled := false
+	var requestClosed int32
 	completeCh := make(chan bool, 1)
 	closeNotifier, ok := rw.(http.CloseNotifier)
 	if ok {
@@ -99,7 +100,7 @@ func (p *reverseProxy) ServeHTTP(rw http.ResponseWriter, clientreq *http.Request
 			case <-closeNotifier.CloseNotify():
 				tp, ok := p.transport.(*http.Transport)
 				if ok {
-					requestCanceled = true
+					atomic.StoreInt32(&requestClosed, 1)
 					log.Printf("proxy: request from %v canceled", clientreq.RemoteAddr)
 					tp.CancelRequest(proxyreq)
 				}
@@ -121,7 +122,7 @@ func (p *reverseProxy) ServeHTTP(rw http.ResponseWriter, clientreq *http.Request
 		redirectRequest(proxyreq, ep.URL)
 
 		res, err = p.transport.RoundTrip(proxyreq)
-		if requestCanceled {
+		if atomic.LoadInt32(&requestClosed) == 1 {
 			return
 		}
 		if err != nil {