mirror of
https://github.com/k3s-io/kubernetes.git
synced 2025-07-29 14:37:00 +00:00
Merge pull request #67288 from MHBauer/fast-close
Automatic merge from submit-queue. If you want to cherry-pick this change to another branch, please follow the instructions <a href="https://github.com/kubernetes/community/blob/master/contributors/devel/cherry-picks.md">here</a>. immediately close the other side of the connection when proxying **What this PR does / why we need it**: close the other side of the connection by exiting once one side closes. This code is used in both apiserver and kubelet. **Which issue(s) this PR fixes** *(optional, in `fixes #<issue number>(, fixes #<issue_number>, ...)` format, will close the issue(s) when PR gets merged)*: Fixes #57992 **Special notes for your reviewer**: unit tests passed locally. something similar is done in client-go/tools/portforward. doesn't seem to break the tests. **Release note**: ```release-note NONE ```
This commit is contained in:
commit
4411a6fcf5
@ -27,7 +27,6 @@ import (
|
|||||||
"net/http/httputil"
|
"net/http/httputil"
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"k8s.io/apimachinery/pkg/api/errors"
|
"k8s.io/apimachinery/pkg/api/errors"
|
||||||
@ -294,9 +293,12 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Proxy the connection.
|
// Proxy the connection. This is bidirectional, so we need a goroutine
|
||||||
wg := &sync.WaitGroup{}
|
// to copy in each direction. Once one side of the connection exits, we
|
||||||
wg.Add(2)
|
// exit the function which performs cleanup and in the process closes
|
||||||
|
// the other half of the connection in the defer.
|
||||||
|
writerComplete := make(chan struct{})
|
||||||
|
readerComplete := make(chan struct{})
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
var writer io.WriteCloser
|
var writer io.WriteCloser
|
||||||
@ -309,7 +311,7 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques
|
|||||||
if err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
|
if err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
|
||||||
glog.Errorf("Error proxying data from client to backend: %v", err)
|
glog.Errorf("Error proxying data from client to backend: %v", err)
|
||||||
}
|
}
|
||||||
wg.Done()
|
close(writerComplete)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
@ -323,10 +325,17 @@ func (h *UpgradeAwareHandler) tryUpgrade(w http.ResponseWriter, req *http.Reques
|
|||||||
if err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
|
if err != nil && !strings.Contains(err.Error(), "use of closed network connection") {
|
||||||
glog.Errorf("Error proxying data from backend to client: %v", err)
|
glog.Errorf("Error proxying data from backend to client: %v", err)
|
||||||
}
|
}
|
||||||
wg.Done()
|
close(readerComplete)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
wg.Wait()
|
// Wait for one half the connection to exit. Once it does the defer will
|
||||||
|
// clean up the other half of the connection.
|
||||||
|
select {
|
||||||
|
case <-writerComplete:
|
||||||
|
case <-readerComplete:
|
||||||
|
}
|
||||||
|
glog.V(6).Infof("Disconnecting from backend proxy %s\n Headers: %v", &location, clone.Header)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user