Skip to content

Commit 3d9ee0f

Browse files
committed
fix: expose IncludeDedicatedClusterManagers and DiscoveryTimeout in opensearch.Config
The documentation showed examples using configuration fields within opensearch.Config.Transport, but this didn't work because: - Transport expects http.RoundTripper, not opensearchtransport.Config - Key fields were only available in low-level transport config, not exposed through the high-level API - Documentation had architectural inconsistencies across multiple guides API Changes: - Add IncludeDedicatedClusterManagers field to opensearch.Config - Add DiscoveryTimeout field to opensearch.Config - Pass both fields through to transport config in NewClient() Documentation Fixes: - Fix node_discovery_and_roles.md Transport configuration example - Fix 6 incorrect Transport examples across guides/search.md and guides/bulk.md - Replace Transport: &opensearchtransport.Config{Selector: ...} with direct Selector: ... assignment - Update Transport field comments to clarify it's for http.RoundTripper (TLS config) - Update terminology from "cluster master" to "cluster manager" Architecture: - All opensearchtransport.Config fields are properly exposed in opensearch.Config - Transport field correctly documented for HTTP/TLS configuration only - Selector, Logger, ConnectionPoolFunc available as direct fields Fixes broken documentation examples and provides proper API access to discovery timeout and dedicated cluster manager node settings. Signed-off-by: Sean Chittenden <sean.chittenden@crowdstrike.com>
1 parent f27a82f commit 3d9ee0f

8 files changed

Lines changed: 44 additions & 63 deletions

File tree

guides/bulk.md

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,9 @@ For high-throughput bulk operations, you can configure the client to automatical
5353
DiscoverNodesInterval: 5 * time.Minute,
5454

5555
// Configure smart routing: bulk operations go to ingest nodes, searches go to data nodes
56-
Transport: &opensearchtransport.Config{
57-
Selector: opensearchtransport.NewSmartSelector(
58-
opensearchtransport.NewRoundRobinSelector(),
59-
),
60-
},
56+
Selector: opensearchtransport.NewSmartSelector(
57+
opensearchtransport.NewRoundRobinSelector(),
58+
),
6159
})
6260
if err != nil {
6361
return err
@@ -268,11 +266,9 @@ For production environments with dedicated ingest nodes, you can optimize bulk o
268266
DiscoverNodesInterval: 5 * time.Minute,
269267

270268
// Use smart selector for automatic operation routing
271-
Transport: &opensearchtransport.Config{
272-
Selector: opensearchtransport.NewSmartSelector(
273-
opensearchtransport.NewRoundRobinSelector(),
274-
),
275-
},
269+
Selector: opensearchtransport.NewSmartSelector(
270+
opensearchtransport.NewRoundRobinSelector(),
271+
),
276272
})
277273
if err != nil {
278274
return err

guides/node_discovery_and_roles.md

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -299,13 +299,9 @@ client, err := opensearch.NewClient(opensearch.Config{
299299
You can observe connection preservation in debug logs:
300300

301301
```go
302-
import "github.com/opensearch-project/opensearch-go/v4/opensearchtransport"
303-
304302
// Enable debug logging to see connection preservation
305303
client, err := opensearch.NewClient(opensearch.Config{
306-
Transport: &opensearchtransport.Config{
307-
EnableDebugLogger: true,
308-
},
304+
EnableDebugLogger: true,
309305
})
310306
311307
// Logs will show:
@@ -338,10 +334,12 @@ client, err := opensearch.NewClient(opensearch.Config{
338334
Enable debug logging to see node discovery details:
339335
340336
```go
341-
import "github.com/opensearch-project/opensearch-go/v4/opensearchtransport"
337+
client, err := opensearch.NewClient(opensearch.Config{
338+
EnableDebugLogger: true,
339+
})
342340
343341
// The client will log discovered nodes and role validation results
344-
// when debug logging is enabled in your application
342+
// when debug logging is enabled
345343
```
346344
347345
## Example: Complete Setup
@@ -366,10 +364,10 @@ func main() {
366364
DiscoverNodesInterval: 5 * time.Minute,
367365
DiscoveryTimeout: 45 * time.Second, // Custom timeout for discovery operations
368366
369-
// Optional: Custom transport for additional configuration
370-
Transport: &opensearchtransport.Config{
371-
// Additional transport settings...
372-
},
367+
// Optional: Custom HTTP transport for TLS configuration
368+
// Transport: &http.Transport{
369+
// TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
370+
// },
373371
})
374372
if err != nil {
375373
log.Fatalf("Error creating client: %s", err)

guides/search.md

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -55,11 +55,9 @@ For search-heavy applications, you can configure the client to automatically rou
5555
DiscoverNodesInterval: 5 * time.Minute,
5656

5757
// Configure automatic routing to data nodes for search operations
58-
Transport: &opensearchtransport.Config{
59-
Selector: opensearchtransport.NewSmartSelector(
60-
opensearchtransport.NewRoundRobinSelector(),
61-
),
62-
},
58+
Selector: opensearchtransport.NewSmartSelector(
59+
opensearchtransport.NewRoundRobinSelector(),
60+
),
6361
})
6462
if err != nil {
6563
return err
@@ -288,11 +286,9 @@ For production search workloads, you can optimize performance by ensuring search
288286
DiscoverNodesInterval: 5 * time.Minute,
289287

290288
// Use data-preferred selector for search optimization
291-
Transport: &opensearchtransport.Config{
292-
Selector: opensearchtransport.NewRoleBasedSelector(
293-
opensearchtransport.WithRequiredRoles(opensearchtransport.RoleData),
294-
),
295-
},
289+
Selector: opensearchtransport.NewRoleBasedSelector(
290+
opensearchtransport.WithRequiredRoles(opensearchtransport.RoleData),
291+
),
296292
})
297293
if err != nil {
298294
return err
@@ -326,12 +322,9 @@ The smart selector automatically detects operation types and routes them to the
326322

327323
DiscoverNodesOnStart: true,
328324
DiscoverNodesInterval: 5 * time.Minute,
329-
330-
Transport: &opensearchtransport.Config{
331-
Selector: opensearchtransport.NewSmartSelector(
332-
opensearchtransport.NewRoundRobinSelector(),
333-
),
334-
},
325+
Selector: opensearchtransport.NewSmartSelector(
326+
opensearchtransport.NewRoundRobinSelector(),
327+
),
335328
})
336329
if err != nil {
337330
return err

opensearch.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,13 @@ type Config struct {
9191
DiscoverNodesOnStart bool // Discover nodes synchronously when initializing the client (blocks until complete). Default: false.
9292
DiscoverNodesInterval time.Duration // Discover nodes periodically in background. Default: disabled.
9393

94+
// DiscoveryTimeout configures the timeout for discovery operations.
95+
// When > 0, discovery operations will timeout after this duration.
96+
// When = 0, uses the default timeout (30 seconds).
97+
// When < 0, disables timeout (blocks until completion).
98+
// Default: 0 (uses 30 second default timeout)
99+
DiscoveryTimeout time.Duration
100+
94101
// IncludeDedicatedClusterManagers includes dedicated cluster manager nodes in request routing.
95102
// When false (default), dedicated cluster manager nodes are excluded from client requests,
96103
// following best practices and matching the Java client's NodeSelector.SKIP_DEDICATED_CLUSTER_MASTERS behavior.
@@ -187,6 +194,7 @@ func NewClient(cfg Config) (*Client, error) {
187194

188195
DiscoverNodesOnStart: cfg.DiscoverNodesOnStart,
189196
DiscoverNodesInterval: cfg.DiscoverNodesInterval,
197+
DiscoveryTimeout: cfg.DiscoveryTimeout,
190198

191199
IncludeDedicatedClusterManagers: cfg.IncludeDedicatedClusterManagers,
192200

opensearchtransport/connection.go

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -469,25 +469,11 @@ func (c *Connection) markAsDeadWithLock() {
469469
c.failures.Add(1)
470470
}
471471

472-
// markAsLive marks the connection as alive.
473-
func (c *Connection) markAsLive() {
474-
c.mu.Lock()
475-
defer c.mu.Unlock()
476-
c.markAsLiveWithLock()
477-
}
478-
479472
// markAsLiveWithLock marks the connection as alive (caller must hold lock).
480473
func (c *Connection) markAsLiveWithLock() {
481474
c.mu.isDead = false
482475
}
483476

484-
// markAsHealthy marks the connection as healthy.
485-
func (c *Connection) markAsHealthy() {
486-
c.mu.Lock()
487-
defer c.mu.Unlock()
488-
c.markAsHealthyWithLock()
489-
}
490-
491477
// markAsHealthyWithLock marks the connection as healthy (caller must hold lock).
492478
func (c *Connection) markAsHealthyWithLock() {
493479
c.mu.isDead = false

opensearchtransport/discovery_internal_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ func TestDiscovery(t *testing.T) {
138138
// Return valid JSON response with empty nodes object
139139
body := `{"nodes": {}}`
140140
return &http.Response{
141-
StatusCode: 200,
141+
StatusCode: http.StatusOK,
142142
Header: http.Header{"Content-Type": []string{"application/json"}},
143143
Body: io.NopCloser(strings.NewReader(body)),
144144
}, nil
@@ -1824,7 +1824,7 @@ func (t *slowMockTransport) RoundTrip(req *http.Request) (*http.Response, error)
18241824

18251825
body, _ := json.Marshal(nodesResponse)
18261826
return &http.Response{
1827-
StatusCode: 200,
1827+
StatusCode: http.StatusOK,
18281828
Body: io.NopCloser(bytes.NewReader(body)),
18291829
Header: make(http.Header),
18301830
}, nil

opensearchtransport/opensearchtransport.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ type Config struct {
8282
EnableMetrics bool
8383
EnableDebugLogger bool
8484

85-
DiscoverNodesOnStart bool // Discover nodes synchronously when initializing the client (blocks until complete). Default: false.
85+
DiscoverNodesOnStart bool // Discover nodes synchronously when initializing the client (blocks until complete). Default: false.
8686
DiscoverNodesInterval time.Duration
8787

8888
// DiscoveryTimeout controls the timeout for node discovery operations.

opensearchtransport/opensearchtransport_internal_test.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1173,7 +1173,7 @@ func TestRequestSigning(t *testing.T) {
11731173

11741174
func TestResolveDiscoveryTimeout(t *testing.T) {
11751175
tests := []struct {
1176-
name string
1176+
name string
11771177
discoveryTimeout time.Duration
11781178
expectedDuration time.Duration
11791179
expectedEnabled bool
@@ -1237,23 +1237,23 @@ func TestResolveDiscoveryTimeout(t *testing.T) {
12371237

12381238
func TestConfigDiscoveryTimeout(t *testing.T) {
12391239
tests := []struct {
1240-
name string
1241-
configTimeout time.Duration
1240+
name string
1241+
configTimeout time.Duration
12421242
expectedClientTimeout time.Duration
12431243
}{
12441244
{
1245-
name: "zero config timeout",
1246-
configTimeout: 0,
1245+
name: "zero config timeout",
1246+
configTimeout: 0,
12471247
expectedClientTimeout: 0,
12481248
},
12491249
{
1250-
name: "positive config timeout",
1251-
configTimeout: 30 * time.Second,
1250+
name: "positive config timeout",
1251+
configTimeout: 30 * time.Second,
12521252
expectedClientTimeout: 30 * time.Second,
12531253
},
12541254
{
1255-
name: "negative config timeout",
1256-
configTimeout: -5 * time.Second,
1255+
name: "negative config timeout",
1256+
configTimeout: -5 * time.Second,
12571257
expectedClientTimeout: -5 * time.Second,
12581258
},
12591259
}

0 commit comments

Comments
 (0)