Skip to content

Commit 0385e7a

Browse files
committed
proxy: reliability fixes
1 parent 03d21ff commit 0385e7a

2 files changed

Lines changed: 42 additions & 15 deletions

File tree

proxy/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ func DefaultProxySettings() *ProxySettings {
4545
ProxyWriteTimeout: 30 * time.Second,
4646
ProxyIdleTimeout: 5 * time.Minute,
4747
ProxyTlsHandshakeTimeout: 30 * time.Second,
48+
ProxyConnectTimeout: 30 * time.Minute,
4849
NotificationTimeout: 5 * time.Second,
4950
WarmupTimeout: 30 * time.Minute,
5051
}
@@ -55,6 +56,7 @@ type ProxySettings struct {
5556
ProxyWriteTimeout time.Duration
5657
ProxyIdleTimeout time.Duration
5758
ProxyTlsHandshakeTimeout time.Duration
59+
ProxyConnectTimeout time.Duration
5860
NotificationTimeout time.Duration
5961
WarmupTimeout time.Duration
6062
}
@@ -411,6 +413,7 @@ func (self *httpServer) run() {
411413
httpProxy.ProxyReadTimeout = self.settings.ProxyReadTimeout
412414
httpProxy.ProxyWriteTimeout = self.settings.ProxyWriteTimeout
413415
httpProxy.ProxyIdleTimeout = self.settings.ProxyIdleTimeout
416+
httpProxy.ProxyConnectTimeout = self.settings.ProxyConnectTimeout
414417
httpProxy.ProxyTlsHandshakeTimeout = self.settings.ProxyTlsHandshakeTimeout
415418
// httpProxy.AllowHTTP2 = true
416419
// httpProxy.Tr = &http.Transport{

proxy/proxy_device.go

Lines changed: 39 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ type ProxyDeviceManager struct {
3535
networkSpace *sdk.NetworkSpace
3636

3737
stateLock sync.Mutex
38-
proxyDevices map[server.Id]*ProxyDevice
38+
proxyDevices map[server.Id]*proxyDeviceState
3939
}
4040

4141
func NewProxyDeviceManagerWithDefaults(ctx context.Context) *ProxyDeviceManager {
@@ -62,14 +62,11 @@ func NewProxyDeviceManager(ctx context.Context, settings *ProxyDeviceManagerSett
6262
cancel: cancel,
6363
settings: settings,
6464
networkSpace: networkSpace,
65-
proxyDevices: map[server.Id]*ProxyDevice{},
65+
proxyDevices: map[server.Id]*proxyDeviceState{},
6666
}
6767
}
6868

6969
func (self *ProxyDeviceManager) OpenProxyDevice(proxyId server.Id) (*ProxyDevice, error) {
70-
self.stateLock.Lock()
71-
defer self.stateLock.Unlock()
72-
7370
nextProxyDevice := func() (*ProxyDevice, error) {
7471
proxyDeviceConfig := model.GetProxyDeviceConfig(self.ctx, proxyId)
7572
if proxyDeviceConfig == nil {
@@ -85,18 +82,25 @@ func (self *ProxyDeviceManager) OpenProxyDevice(proxyId server.Id) (*ProxyDevice
8582
defer func() {
8683
self.stateLock.Lock()
8784
defer self.stateLock.Unlock()
85+
8886
glog.Infof("[pd]cancel")
8987
// note we don't call close here because only the sender should call close
9088
pd.Cancel()
91-
if currentPd := self.proxyDevices[proxyId]; pd == currentPd {
92-
delete(self.proxyDevices, proxyId)
89+
if pdState, ok := self.proxyDevices[proxyId]; ok {
90+
func() {
91+
pdState.StateLock.Lock()
92+
defer pdState.StateLock.Unlock()
93+
94+
if pd == pdState.ProxyDevice {
95+
delete(self.proxyDevices, proxyId)
96+
}
97+
}()
9398
}
9499
}()
95100
pd.Run()
96101
})
97102

98103
go server.HandleError(func() {
99-
defer self.cancel()
100104
for {
101105
if pd.CancelIfIdle() {
102106
return
@@ -113,20 +117,35 @@ func (self *ProxyDeviceManager) OpenProxyDevice(proxyId server.Id) (*ProxyDevice
113117
return pd, nil
114118
}
115119

116-
if pd, ok := self.proxyDevices[proxyId]; ok && pd.UpdateActivity() {
117-
return pd, nil
120+
pdState := func() *proxyDeviceState {
121+
self.stateLock.Lock()
122+
defer self.stateLock.Unlock()
123+
pdState, ok := self.proxyDevices[proxyId]
124+
if !ok {
125+
pdState = &proxyDeviceState{}
126+
self.proxyDevices[proxyId] = pdState
127+
}
128+
return pdState
129+
}()
130+
131+
pdState.StateLock.Lock()
132+
defer pdState.StateLock.Unlock()
133+
134+
if pd := pdState.ProxyDevice; pd != nil {
135+
if pd.UpdateActivity() {
136+
return pd, nil
137+
} else {
138+
pd.Cancel()
139+
pdState.ProxyDevice = nil
140+
}
118141
}
119142

120143
pd, err := nextProxyDevice()
121144
if err != nil {
122145
return nil, err
123146
}
124147

125-
if replacedPd, ok := self.proxyDevices[proxyId]; ok {
126-
replacedPd.Cancel()
127-
}
128-
self.proxyDevices[proxyId] = pd
129-
148+
pdState.ProxyDevice = pd
130149
return pd, nil
131150
}
132151

@@ -139,6 +158,11 @@ func (self *ProxyDeviceManager) Close() {
139158
self.cancel()
140159
}
141160

161+
type proxyDeviceState struct {
162+
StateLock sync.Mutex
163+
ProxyDevice *ProxyDevice
164+
}
165+
142166
func DefaultProxyDeviceSettings() *ProxyDeviceSettings {
143167
return &ProxyDeviceSettings{
144168
ProxyDeviceDescription: "resident proxy",

0 commit comments

Comments
 (0)