Skip to content

Commit 7e083ba

Browse files
committed
kite: add configurable timeout support
1 parent eeaf9fa commit 7e083ba

File tree

2 files changed

+25
-19
lines changed

2 files changed

+25
-19
lines changed

config/config.go

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,18 @@ type Config struct {
7171
// Required.
7272
XHR *http.Client
7373

74+
// Timeout specified max time waiting for the following operations to complete:
75+
//
76+
// - polling on an XHR connection
77+
// - default timeout for certain kite requests (Kontrol API)
78+
// - HTTP heartbeats and register method
79+
//
80+
// NOTE: Ensure the Timeout is higher than SockJS.HeartbeatDelay, otherwise
81+
// XHR connections may get randomly closed.
82+
//
83+
// TODO(rjeczalik): Make kite heartbeats configurable as well.
84+
Timeout time.Duration
85+
7486
// Client is a HTTP client used for issuing HTTP register request and
7587
// HTTP heartbeats.
7688
Client *http.Client
@@ -101,15 +113,12 @@ var DefaultConfig = &Config{
101113
IP: "0.0.0.0",
102114
Port: 0,
103115
Transport: Auto,
116+
Timeout: 15 * time.Second,
104117
XHR: &http.Client{
105-
// TODO(rjeczalik): make XHR handler timeout if polling on body
106-
// is idle > timeout. Timing out after 10s is a bad idea when
107-
// the connection is active.
108-
// Timeout: 10 * time.Second,
109118
Jar: CookieJar,
110119
},
111120
Client: &http.Client{
112-
Timeout: 20 * time.Second,
121+
Timeout: 15 * time.Second,
113122
Jar: CookieJar,
114123
},
115124
Websocket: &websocket.Dialer{
@@ -121,7 +130,7 @@ var DefaultConfig = &Config{
121130
JSessionID: sockjs.DefaultOptions.JSessionID,
122131
SockJSURL: sockjs.DefaultOptions.SockJSURL,
123132
HeartbeatDelay: 10 * time.Second, // better fit for AWS ELB; empirically picked
124-
DisconnectDelay: 10 * time.Second, // >= XHR poll interval
133+
DisconnectDelay: 10 * time.Second, // >= Timeout
125134
ResponseLimit: sockjs.DefaultOptions.ResponseLimit,
126135
},
127136
}
@@ -210,7 +219,8 @@ func (c *Config) ReadEnvironmentVariables() error {
210219
}
211220

212221
if timeout, err := time.ParseDuration(os.Getenv("KITE_TIMEOUT")); err == nil {
213-
c.XHR.Timeout = timeout
222+
c.Timeout = timeout
223+
c.Client.Timeout = timeout
214224
}
215225

216226
if timeout, err := time.ParseDuration(os.Getenv("KITE_HANDSHAKE_TIMEOUT")); err == nil {

kontrolclient.go

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,6 @@ import (
1717
const (
1818
kontrolRetryDuration = 10 * time.Second
1919
proxyRetryDuration = 10 * time.Second
20-
21-
// kontrolConnectTimeout is the timeout for connecting to Kontrol in
22-
// TellKontrol-like methods.
23-
kontrolConnectTimeout = 10 * time.Second
2420
)
2521

2622
// Returned from GetKites when query matches no kites.
@@ -146,7 +142,7 @@ func (k *Kite) GetKites(query *protocol.KontrolQuery) ([]*Client, error) {
146142
func (k *Kite) getKites(args protocol.GetKitesArgs) ([]*Client, error) {
147143
<-k.kontrol.readyConnected
148144

149-
response, err := k.kontrol.TellWithTimeout("getKites", 4*time.Second, args)
145+
response, err := k.kontrol.TellWithTimeout("getKites", k.Config.Timeout, args)
150146
if err != nil {
151147
return nil, err
152148
}
@@ -195,7 +191,7 @@ func (k *Kite) GetToken(kite *protocol.Kite) (string, error) {
195191

196192
<-k.kontrol.readyConnected
197193

198-
result, err := k.kontrol.TellWithTimeout("getToken", 4*time.Second, kite)
194+
result, err := k.kontrol.TellWithTimeout("getToken", k.Config.Timeout, kite)
199195
if err != nil {
200196
return "", err
201197
}
@@ -225,7 +221,7 @@ func (k *Kite) GetTokenForce(kite *protocol.Kite) (string, error) {
225221
Force: true,
226222
}
227223

228-
result, err := k.kontrol.TellWithTimeout("getToken", 4*time.Second, args)
224+
result, err := k.kontrol.TellWithTimeout("getToken", k.Config.Timeout, args)
229225
if err != nil {
230226
return "", err
231227
}
@@ -250,7 +246,7 @@ func (k *Kite) GetKey() (string, error) {
250246

251247
<-k.kontrol.readyConnected
252248

253-
result, err := k.kontrol.TellWithTimeout("getKey", 4*time.Second)
249+
result, err := k.kontrol.TellWithTimeout("getKey", k.Config.Timeout)
254250
if err != nil {
255251
return "", err
256252
}
@@ -358,7 +354,7 @@ func (k *Kite) Register(kiteURL *url.URL) (*registerResult, error) {
358354

359355
k.Log.Info("Registering to kontrol with URL: %s", kiteURL.String())
360356

361-
response, err := k.kontrol.TellWithTimeout("register", 4*time.Second, args)
357+
response, err := k.kontrol.TellWithTimeout("register", k.Config.Timeout, args)
362358
if err != nil {
363359
return nil, err
364360
}
@@ -477,7 +473,7 @@ func (k *Kite) registerToProxyKite(c *Client, kiteURL *url.URL) (*url.URL, error
477473

478474
// this could be tunnelproxy or reverseproxy. Tunnelproxy doesn't need an
479475
// URL however Reverseproxy needs one.
480-
result, err := c.TellWithTimeout("register", 4*time.Second, kiteURL.String())
476+
result, err := c.TellWithTimeout("register", k.Config.Timeout, kiteURL.String())
481477
if err != nil {
482478
k.Log.Error("Proxy register error: %s", err.Error())
483479
return nil, err
@@ -508,12 +504,12 @@ func (k *Kite) TellKontrolWithTimeout(method string, timeout time.Duration, args
508504

509505
// Wait for readyConnect, or timeout
510506
select {
511-
case <-time.After(kontrolConnectTimeout):
507+
case <-time.After(k.Config.Timeout):
512508
return nil, &Error{
513509
Type: "timeout",
514510
Message: fmt.Sprintf(
515511
"Timed out registering to kontrol for %s method after %s",
516-
method, kontrolConnectTimeout,
512+
method, k.Config.Timeout,
517513
),
518514
}
519515
case <-k.kontrol.readyConnected:

0 commit comments

Comments
 (0)