Skip to content

Commit 7a86092

Browse files
author
Dan Larkin-York
committed
Adjustments to timeouts and image.
1 parent e7e3747 commit 7a86092

File tree

3 files changed

+60
-85
lines changed

3 files changed

+60
-85
lines changed

pkg/util/arangod/client.go

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,31 @@ func WithRequireAuthentication(ctx context.Context) context.Context {
6262

6363
var (
6464
sharedHTTPTransport = &nhttp.Transport{
65+
Proxy: nhttp.ProxyFromEnvironment,
66+
DialContext: (&net.Dialer{
67+
Timeout: 30 * time.Second,
68+
KeepAlive: 90 * time.Second,
69+
DualStack: true,
70+
}).DialContext,
71+
MaxIdleConns: 100,
72+
IdleConnTimeout: 90 * time.Second,
73+
TLSHandshakeTimeout: 10 * time.Second,
74+
ExpectContinueTimeout: 1 * time.Second,
75+
}
76+
sharedHTTPSTransport = &nhttp.Transport{
77+
Proxy: nhttp.ProxyFromEnvironment,
78+
DialContext: (&net.Dialer{
79+
Timeout: 30 * time.Second,
80+
KeepAlive: 90 * time.Second,
81+
DualStack: true,
82+
}).DialContext,
83+
MaxIdleConns: 100,
84+
IdleConnTimeout: 90 * time.Second,
85+
TLSHandshakeTimeout: 10 * time.Second,
86+
ExpectContinueTimeout: 1 * time.Second,
87+
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
88+
}
89+
sharedHTTPTransportShortTimeout = &nhttp.Transport{
6590
Proxy: nhttp.ProxyFromEnvironment,
6691
DialContext: (&net.Dialer{
6792
Timeout: 30 * time.Second,
@@ -73,7 +98,7 @@ var (
7398
TLSHandshakeTimeout: 10 * time.Second,
7499
ExpectContinueTimeout: 1 * time.Second,
75100
}
76-
sharedHTTPSTransport = &nhttp.Transport{
101+
sharedHTTPSTransportShortTimeout = &nhttp.Transport{
77102
Proxy: nhttp.ProxyFromEnvironment,
78103
DialContext: (&net.Dialer{
79104
Timeout: 30 * time.Second,
@@ -92,18 +117,18 @@ var (
92117
func CreateArangodClient(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, group api.ServerGroup, id string) (driver.Client, error) {
93118
// Create connection
94119
dnsName := k8sutil.CreatePodDNSName(apiObject, group.AsRole(), id)
95-
c, err := createArangodClientForDNSName(ctx, cli, apiObject, dnsName)
120+
c, err := createArangodClientForDNSName(ctx, cli, apiObject, dnsName, false)
96121
if err != nil {
97122
return nil, maskAny(err)
98123
}
99124
return c, nil
100125
}
101126

102127
// CreateArangodDatabaseClient creates a go-driver client for accessing the entire cluster (or single server).
103-
func CreateArangodDatabaseClient(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment) (driver.Client, error) {
128+
func CreateArangodDatabaseClient(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, shortTimeout bool) (driver.Client, error) {
104129
// Create connection
105130
dnsName := k8sutil.CreateDatabaseClientServiceDNSName(apiObject)
106-
c, err := createArangodClientForDNSName(ctx, cli, apiObject, dnsName)
131+
c, err := createArangodClientForDNSName(ctx, cli, apiObject, dnsName, shortTimeout)
107132
if err != nil {
108133
return nil, maskAny(err)
109134
}
@@ -147,16 +172,16 @@ func CreateArangodAgencyClient(ctx context.Context, cli corev1.CoreV1Interface,
147172
func CreateArangodImageIDClient(ctx context.Context, deployment k8sutil.APIObject, role, id string) (driver.Client, error) {
148173
// Create connection
149174
dnsName := k8sutil.CreatePodDNSName(deployment, role, id)
150-
c, err := createArangodClientForDNSName(ctx, nil, nil, dnsName)
175+
c, err := createArangodClientForDNSName(ctx, nil, nil, dnsName, false)
151176
if err != nil {
152177
return nil, maskAny(err)
153178
}
154179
return c, nil
155180
}
156181

157182
// CreateArangodClientForDNSName creates a go-driver client for a given DNS name.
158-
func createArangodClientForDNSName(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, dnsName string) (driver.Client, error) {
159-
connConfig, err := createArangodHTTPConfigForDNSNames(ctx, cli, apiObject, []string{dnsName})
183+
func createArangodClientForDNSName(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, dnsName string, shortTimeout bool) (driver.Client, error) {
184+
connConfig, err := createArangodHTTPConfigForDNSNames(ctx, cli, apiObject, []string{dnsName}, shortTimeout)
160185
if err != nil {
161186
return nil, maskAny(err)
162187
}
@@ -183,12 +208,18 @@ func createArangodClientForDNSName(ctx context.Context, cli corev1.CoreV1Interfa
183208
}
184209

185210
// createArangodHTTPConfigForDNSNames creates a go-driver HTTP connection config for a given DNS names.
186-
func createArangodHTTPConfigForDNSNames(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, dnsNames []string) (http.ConnectionConfig, error) {
211+
func createArangodHTTPConfigForDNSNames(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, dnsNames []string, shortTimeout bool) (http.ConnectionConfig, error) {
187212
scheme := "http"
188213
transport := sharedHTTPTransport
214+
if shortTimeout {
215+
transport = sharedHTTPTransportShortTimeout
216+
}
189217
if apiObject != nil && apiObject.Spec.IsSecure() {
190218
scheme = "https"
191219
transport = sharedHTTPSTransport
220+
if shortTimeout {
221+
transport = sharedHTTPSTransportShortTimeout
222+
}
192223
}
193224
connConfig := http.ConnectionConfig{
194225
Transport: transport,

tests/load_balancer_test.go

Lines changed: 7 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -37,30 +37,29 @@ import (
3737

3838
func TestLoadBalancingCursorVST(t *testing.T) {
3939
// run with VST
40-
LoadBalancingCursorSubtest(t, true)
40+
loadBalancingCursorSubtest(t, true)
4141
}
4242

4343
func TestLoadBalancingCursorHTTP(t *testing.T) {
4444
// run with HTTP
45-
LoadBalancingCursorSubtest(t, false)
45+
loadBalancingCursorSubtest(t, false)
4646
}
4747

48-
func wasForwarded(r *driver.Response) bool {
49-
h := (*r).Header("x-arango-request-served-by")
48+
func wasForwarded(r driver.Response) bool {
49+
h := r.Header("x-arango-request-forwarded-to")
5050
return h != ""
5151
}
5252

5353
// tests cursor forwarding with load-balanced conn.
54-
func LoadBalancingCursorSubtest(t *testing.T, useVst bool) {
54+
func loadBalancingCursorSubtest(t *testing.T, useVst bool) {
5555
c := client.MustNewInCluster()
5656
kubecli := mustNewKubeClient(t)
5757
ns := getNamespace(t)
5858

5959
// Prepare deployment config
6060
depl := newDeployment("test-lb-" + uniuri.NewLen(4))
6161
depl.Spec.Mode = api.NewMode(api.DeploymentModeCluster)
62-
image := "dhly/arangodb:3.3.11-local"
63-
depl.Spec.Image = &image
62+
depl.Spec.Image = util.NewString("arangodb/arangodb:3.3.13")
6463

6564
// Create deployment
6665
_, err := c.DatabaseV1alpha().ArangoDeployments(ns).Create(depl)
@@ -135,72 +134,12 @@ func LoadBalancingCursorSubtest(t *testing.T, useVst bool) {
135134
ExpectedDocuments: collectionData["books"],
136135
DocumentType: reflect.TypeOf(Book{}),
137136
},
138-
/* queryTest{
139-
Query: "FOR d IN books FILTER d.Title==@title SORT d.Title RETURN d",
140-
BindVars: map[string]interface{}{"title": "Book 02"},
141-
ExpectSuccess: true,
142-
ExpectedDocuments: []interface{}{collectionData["books"][1]},
143-
DocumentType: reflect.TypeOf(Book{}),
144-
},
145-
queryTest{
146-
Query: "FOR d IN books FILTER d.Title==@title SORT d.Title RETURN d",
147-
BindVars: map[string]interface{}{"somethingelse": "Book 02"},
148-
ExpectSuccess: false, // Unknown `@title`
149-
},
150-
queryTest{
151-
Query: "FOR u IN users FILTER u.age>100 SORT u.name RETURN u",
152-
ExpectSuccess: true,
153-
ExpectedDocuments: []interface{}{},
154-
DocumentType: reflect.TypeOf(UserDoc{}),
155-
},
156-
queryTest{
157-
Query: "FOR u IN users FILTER u.age<@maxAge SORT u.name RETURN u",
158-
BindVars: map[string]interface{}{"maxAge": 20},
159-
ExpectSuccess: true,
160-
ExpectedDocuments: []interface{}{collectionData["users"][2], collectionData["users"][0], collectionData["users"][5]},
161-
DocumentType: reflect.TypeOf(UserDoc{}),
162-
},
163-
queryTest{
164-
Query: "FOR u IN users FILTER u.age<@maxAge SORT u.name RETURN u",
165-
BindVars: map[string]interface{}{"maxage": 20},
166-
ExpectSuccess: false, // `@maxage` versus `@maxAge`
167-
},
168-
queryTest{
169-
Query: "FOR u IN users SORT u.age RETURN u.age",
170-
ExpectedDocuments: []interface{}{12, 12, 13, 25, 42, 67},
171-
DocumentType: reflect.TypeOf(12),
172-
ExpectSuccess: true,
173-
},
174-
queryTest{
175-
Query: "FOR p IN users COLLECT a = p.age WITH COUNT INTO c SORT a RETURN [a, c]",
176-
ExpectedDocuments: []interface{}{[]int{12, 2}, []int{13, 1}, []int{25, 1}, []int{42, 1}, []int{67, 1}},
177-
DocumentType: reflect.TypeOf([]int{}),
178-
ExpectSuccess: true,
179-
},
180-
queryTest{
181-
Query: "FOR u IN users SORT u.name RETURN u.name",
182-
ExpectedDocuments: []interface{}{"Blair", "Clair", "Jake", "John", "Johnny", "Zz"},
183-
DocumentType: reflect.TypeOf("foo"),
184-
ExpectSuccess: true,
185-
},*/
186137
}
187138

188139
var r driver.Response
189140
// Setup context alternatives
190141
contexts := []queryTestContext{
191-
/*queryTestContext{driver.WithResponse(nil, &r), false},
192-
queryTestContext{driver.WithResponse(context.Background(), &r), false},
193-
queryTestContext{driver.WithResponse(driver.WithQueryCount(nil), &r), true},
194-
queryTestContext{driver.WithResponse(driver.WithQueryCount(nil, true), &r), true},
195-
queryTestContext{driver.WithResponse(driver.WithQueryCount(nil, false), &r), false},*/
196142
queryTestContext{driver.WithResponse(driver.WithQueryBatchSize(nil, 1), &r), false},
197-
/*queryTestContext{driver.WithResponse(driver.WithQueryCache(nil), &r), false},
198-
queryTestContext{driver.WithResponse(driver.WithQueryCache(nil, true), &r), false},
199-
queryTestContext{driver.WithResponse(driver.WithQueryCache(nil, false), &r), false},
200-
queryTestContext{driver.WithResponse(driver.WithQueryMemoryLimit(nil, 60000), &r), false},
201-
queryTestContext{driver.WithResponse(driver.WithQueryTTL(nil, time.Minute), &r), false},
202-
queryTestContext{driver.WithResponse(driver.WithQueryBatchSize(driver.WithQueryCount(nil), 1), &r), true},
203-
queryTestContext{driver.WithResponse(driver.WithQueryCache(driver.WithQueryCount(driver.WithQueryBatchSize(nil, 2))), &r), true},*/
204143
}
205144

206145
// keep track of whether at least one request was forwarded internally to the
@@ -247,7 +186,7 @@ func LoadBalancingCursorSubtest(t *testing.T, useVst bool) {
247186
t.Error("HasMore returned false, but ReadDocument returns a document")
248187
}
249188
result = append(result, doc.Elem().Interface())
250-
if wasForwarded(&r) {
189+
if (wasForwarded(r)) {
251190
someRequestForwarded = true
252191
}
253192
time.Sleep(200 * time.Millisecond)

tests/test_util.go

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -95,16 +95,20 @@ func createArangodVSTClientForDNSName(ctx context.Context, cli corev1.CoreV1Inte
9595
}
9696

9797
// createArangodVSTConfigForDNSNames creates a go-driver VST connection config for a given DNS names.
98-
func createArangodVSTConfigForDNSNames(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, dnsNames []string) (vst.ConnectionConfig, error) {
98+
func createArangodVSTConfigForDNSNames(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, dnsNames []string, shortTimeout bool) (vst.ConnectionConfig, error) {
9999
scheme := "http"
100100
tlsConfig := &tls.Config{}
101+
timeout := 90 * time.Second
102+
if shortTimeout {
103+
timeout = 100 * time.Millisecond
104+
}
101105
if apiObject != nil && apiObject.Spec.IsSecure() {
102106
scheme = "https"
103107
tlsConfig = &tls.Config{InsecureSkipVerify: true}
104108
}
105109
transport := vstProtocol.TransportConfig{
106-
IdleConnTimeout: 100 * time.Millisecond,
107-
Version: vstProtocol.Version1_1,
110+
IdleConnTimeout: timeout,
111+
Version: vstProtocol.Version1_1,
108112
}
109113
connConfig := vst.ConnectionConfig{
110114
TLSConfig: tlsConfig,
@@ -117,10 +121,10 @@ func createArangodVSTConfigForDNSNames(ctx context.Context, cli corev1.CoreV1Int
117121
}
118122

119123
// CreateArangodDatabaseVSTClient creates a go-driver client for accessing the entire cluster (or single server) via VST
120-
func CreateArangodDatabaseVSTClient(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment) (driver.Client, error) {
124+
func createArangodDatabaseVSTClient(ctx context.Context, cli corev1.CoreV1Interface, apiObject *api.ArangoDeployment, shortTimeout bool) (driver.Client, error) {
121125
// Create connection
122126
dnsName := k8sutil.CreateDatabaseClientServiceDNSName(apiObject)
123-
c, err := createArangodVSTClientForDNSName(ctx, cli, apiObject, dnsName)
127+
c, err := createArangodVSTClientForDNSName(ctx, cli, apiObject, dnsName, shortTimeout)
124128
if err != nil {
125129
return nil, maskAny(err)
126130
}
@@ -168,13 +172,14 @@ func mustNewKubeClient(t *testing.T) kubernetes.Interface {
168172

169173
// mustNewArangodDatabaseClient creates a new database client,
170174
// failing the test on errors.
171-
func mustNewArangodDatabaseClient(ctx context.Context, kubecli kubernetes.Interface, apiObject *api.ArangoDeployment, t *testing.T, useVst ...bool) driver.Client {
175+
func mustNewArangodDatabaseClient(ctx context.Context, kubecli kubernetes.Interface, apiObject *api.ArangoDeployment, t *testing.T, flags ...bool) driver.Client {
172176
var c driver.Client
173177
var err error
174-
if len(useVst) > 0 && useVst[0] {
175-
c, err = CreateArangodDatabaseVSTClient(ctx, kubecli.CoreV1(), apiObject)
178+
bool shortTimeout = len(flags) > 0 && flags[0]
179+
if len(flags) > 1 && flags[1] {
180+
c, err = createArangodDatabaseVSTClient(ctx, kubecli.CoreV1(), apiObject, shortTimeout)
176181
} else {
177-
c, err = arangod.CreateArangodDatabaseClient(ctx, kubecli.CoreV1(), apiObject)
182+
c, err = arangod.CreateArangodDatabaseClient(ctx, kubecli.CoreV1(), apiObject, shortTimeout)
178183
}
179184
if err != nil {
180185
t.Fatalf("Failed to create arango database client: %v", err)

0 commit comments

Comments
 (0)