Skip to content

Commit 19c0c8b

Browse files
committed
added interceptors, go http pooling & removed unused settings
1 parent c3d66cb commit 19c0c8b

File tree

8 files changed

+161
-67
lines changed

8 files changed

+161
-67
lines changed

gremlin-go/driver/client.go

Lines changed: 8 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -21,25 +21,15 @@ package gremlingo
2121

2222
import (
2323
"crypto/tls"
24-
"fmt"
2524
"reflect"
2625
"runtime"
2726
"time"
2827

2928
"golang.org/x/text/language"
3029
)
3130

32-
const keepAliveIntervalDefault = 5 * time.Second
33-
const writeDeadlineDefault = 3 * time.Second
3431
const connectionTimeoutDefault = 5 * time.Second
3532

36-
// ReadBufferSize and WriteBufferSize specify I/O buffer sizes in bytes. The default is 64KB.
37-
// If a buffer size is set zero, then the transporter default size is used. The I/O buffer
38-
// sizes do not limit the size of the messages that can be sent or received.
39-
const readBufferSizeDefault = 65536 // 64KB
40-
const maxReadBufferSize = 1073741824 // 1GB - Go's maximum per Read() call
41-
const writeBufferSizeDefault = 65536 // 64KB
42-
4333
// ClientSettings is used to modify a Client's settings on initialization.
4434
type ClientSettings struct {
4535
TraversalSource string
@@ -48,16 +38,15 @@ type ClientSettings struct {
4838
Language language.Tag
4939
AuthInfo AuthInfoProvider
5040
TlsConfig *tls.Config
51-
KeepAliveInterval time.Duration
52-
WriteDeadline time.Duration
5341
ConnectionTimeout time.Duration
5442
EnableCompression bool
55-
ReadBufferSize int
56-
WriteBufferSize int
5743

5844
// Maximum number of concurrent connections. Default: number of runtime processors
5945
MaximumConcurrentConnections int
6046
EnableUserAgentOnConnect bool
47+
48+
// RequestInterceptors are functions that modify HTTP requests before sending.
49+
RequestInterceptors []RequestInterceptor
6150
}
6251

6352
// protocol defines the interface for HTTP communication with Gremlin server
@@ -85,40 +74,33 @@ func NewClient(url string, configurations ...func(settings *ClientSettings)) (*C
8574
Language: language.English,
8675
AuthInfo: &AuthInfo{},
8776
TlsConfig: &tls.Config{},
88-
KeepAliveInterval: keepAliveIntervalDefault,
89-
WriteDeadline: writeDeadlineDefault,
9077
ConnectionTimeout: connectionTimeoutDefault,
9178
EnableCompression: false,
9279
EnableUserAgentOnConnect: true,
93-
ReadBufferSize: readBufferSizeDefault,
94-
WriteBufferSize: writeBufferSizeDefault,
9580

9681
MaximumConcurrentConnections: runtime.NumCPU(),
9782
}
9883
for _, configuration := range configurations {
9984
configuration(settings)
10085
}
10186

102-
if settings.ReadBufferSize > maxReadBufferSize {
103-
return nil, fmt.Errorf("readBufferSize %d exceeds maximum of %d bytes", settings.ReadBufferSize, maxReadBufferSize)
104-
}
105-
10687
connSettings := &connectionSettings{
10788
authInfo: settings.AuthInfo,
10889
tlsConfig: settings.TlsConfig,
109-
keepAliveInterval: settings.KeepAliveInterval,
110-
writeDeadline: settings.WriteDeadline,
11190
connectionTimeout: settings.ConnectionTimeout,
11291
enableCompression: settings.EnableCompression,
113-
readBufferSize: settings.ReadBufferSize,
114-
writeBufferSize: settings.WriteBufferSize,
11592
enableUserAgentOnConnect: settings.EnableUserAgentOnConnect,
11693
}
11794

11895
logHandler := newLogHandler(settings.Logger, settings.LogVerbosity, settings.Language)
11996

12097
conn := newHttpConnection(logHandler, url, connSettings)
12198

99+
// Add user-provided interceptors
100+
for _, interceptor := range settings.RequestInterceptors {
101+
conn.AddInterceptor(interceptor)
102+
}
103+
122104
client := &Client{
123105
url: url,
124106
traversalSource: settings.TraversalSource,

gremlin-go/driver/connection.go

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,7 @@ import (
2727
type connectionSettings struct {
2828
authInfo AuthInfoProvider
2929
tlsConfig *tls.Config
30-
keepAliveInterval time.Duration
31-
writeDeadline time.Duration
3230
connectionTimeout time.Duration
3331
enableCompression bool
34-
readBufferSize int
35-
writeBufferSize int
3632
enableUserAgentOnConnect bool
3733
}

gremlin-go/driver/connection_test.go

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,9 @@ func newDefaultConnectionSettings() *connectionSettings {
5858
return &connectionSettings{
5959
authInfo: &AuthInfo{},
6060
tlsConfig: &tls.Config{},
61-
keepAliveInterval: keepAliveIntervalDefault,
62-
writeDeadline: writeDeadlineDefault,
6361
connectionTimeout: connectionTimeoutDefault,
6462
enableCompression: false,
6563
enableUserAgentOnConnect: true,
66-
readBufferSize: readBufferSizeDefault,
67-
writeBufferSize: writeBufferSizeDefault,
6864
}
6965
}
7066

@@ -275,14 +271,50 @@ func TestConnection(t *testing.T) {
275271
testBasicAuthAuthInfo := getBasicAuthInfo()
276272
testBasicAuthTlsConfig := &tls.Config{InsecureSkipVerify: true}
277273

274+
// this test is used to test the ws->http POC changes via manual execution with a local TP 4.0 gremlin server running on 8182
275+
t.Run("Test client.submit()", func(t *testing.T) {
276+
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
277+
278+
tlsConf := tls.Config{
279+
InsecureSkipVerify: true,
280+
}
281+
282+
client, err := NewClient(testNoAuthUrl,
283+
//client, err := NewClient(noAuthSslUrl,
284+
func(settings *ClientSettings) {
285+
settings.TlsConfig = &tlsConf
286+
settings.AuthInfo = testNoAuthAuthInfo
287+
settings.EnableCompression = true
288+
settings.TraversalSource = testServerModernGraphAlias
289+
})
290+
assert.Nil(t, err)
291+
assert.NotNil(t, client)
292+
defer client.Close()
293+
294+
// synchronous
295+
for i := 0; i < 5; i++ {
296+
submitCount(i, client, t)
297+
}
298+
299+
// async
300+
var wg sync.WaitGroup
301+
for i := 0; i < 5; i++ {
302+
wg.Add(1)
303+
go func(i int) {
304+
defer wg.Done()
305+
submitCount(i, client, t)
306+
}(i)
307+
}
308+
wg.Wait()
309+
})
310+
278311
t.Run("Test client.submit() with concurrency", func(t *testing.T) {
279312
skipTestsIfNotEnabled(t, integrationTestSuiteName, testNoAuthEnable)
280313

281314
client, err := NewClient(testNoAuthUrl,
282315
func(settings *ClientSettings) {
283316
settings.TlsConfig = testNoAuthTlsConfig
284317
settings.AuthInfo = testNoAuthAuthInfo
285-
settings.WriteBufferSize = 1024
286318
settings.EnableCompression = true
287319
settings.TraversalSource = testServerModernGraphAlias
288320
})

gremlin-go/driver/driverRemoteConnection.go

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -35,20 +35,15 @@ type DriverRemoteConnectionSettings struct {
3535
Language language.Tag
3636
AuthInfo AuthInfoProvider
3737
TlsConfig *tls.Config
38-
KeepAliveInterval time.Duration
39-
WriteDeadline time.Duration
4038
ConnectionTimeout time.Duration
4139
EnableCompression bool
4240
EnableUserAgentOnConnect bool
43-
ReadBufferSize int
44-
WriteBufferSize int
4541

46-
// Minimum amount of concurrent active traversals on a connection to trigger creation of a new connection
47-
NewConnectionThreshold int
4842
// Maximum number of concurrent connections. Default: number of runtime processors
4943
MaximumConcurrentConnections int
50-
// Initial amount of instantiated connections. Default: 1
51-
InitialConcurrentConnections int
44+
45+
// RequestInterceptors are functions that modify HTTP requests before sending.
46+
RequestInterceptors []RequestInterceptor
5247
}
5348

5449
// DriverRemoteConnection is a remote connection.
@@ -72,13 +67,9 @@ func NewDriverRemoteConnection(
7267
Language: language.English,
7368
AuthInfo: &AuthInfo{},
7469
TlsConfig: &tls.Config{},
75-
KeepAliveInterval: keepAliveIntervalDefault,
76-
WriteDeadline: writeDeadlineDefault,
7770
ConnectionTimeout: connectionTimeoutDefault,
7871
EnableCompression: false,
7972
EnableUserAgentOnConnect: true,
80-
ReadBufferSize: readBufferSizeDefault,
81-
WriteBufferSize: writeBufferSizeDefault,
8273

8374
MaximumConcurrentConnections: runtime.NumCPU(),
8475
}
@@ -89,19 +80,20 @@ func NewDriverRemoteConnection(
8980
connSettings := &connectionSettings{
9081
authInfo: settings.AuthInfo,
9182
tlsConfig: settings.TlsConfig,
92-
keepAliveInterval: settings.KeepAliveInterval,
93-
writeDeadline: settings.WriteDeadline,
9483
connectionTimeout: settings.ConnectionTimeout,
9584
enableCompression: settings.EnableCompression,
96-
readBufferSize: settings.ReadBufferSize,
97-
writeBufferSize: settings.WriteBufferSize,
9885
enableUserAgentOnConnect: settings.EnableUserAgentOnConnect,
9986
}
10087

10188
logHandler := newLogHandler(settings.Logger, settings.LogVerbosity, settings.Language)
10289

10390
conn := newHttpConnection(logHandler, url, connSettings)
10491

92+
// Add user-provided interceptors
93+
for _, interceptor := range settings.RequestInterceptors {
94+
conn.AddInterceptor(interceptor)
95+
}
96+
10597
client := &Client{
10698
url: url,
10799
traversalSource: settings.TraversalSource,

0 commit comments

Comments
 (0)