Skip to content

Commit 3cc020b

Browse files
authored
[ENGTAI-69911] mongo connection timeout support (#237)
1 parent 1f1876c commit 3cc020b

File tree

5 files changed

+39
-4
lines changed

5 files changed

+39
-4
lines changed

document-store/src/main/java/org/hypertrace/core/documentstore/TypesafeDatastoreConfigAdapter.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package org.hypertrace.core.documentstore;
22

33
import static java.util.Collections.emptyList;
4+
import static org.hypertrace.core.documentstore.model.config.ConnectionConfig.DEFAULT_CONNECTION_TIMEOUT;
5+
import static org.hypertrace.core.documentstore.model.config.ConnectionConfig.DEFAULT_QUERY_TIMEOUT;
46

57
import com.mongodb.ConnectionString;
68
import com.mongodb.MongoClientSettings;
79
import com.typesafe.config.Config;
8-
import java.time.Duration;
910
import java.util.Collections;
1011
import org.hypertrace.core.documentstore.model.config.AggregatePipelineMode;
1112
import org.hypertrace.core.documentstore.model.config.DatabaseType;
@@ -35,7 +36,8 @@ public DatastoreConfig convert(final Config config) {
3536
null,
3637
AggregatePipelineMode.DEFAULT_ALWAYS,
3738
DataFreshness.SYSTEM_DEFAULT,
38-
Duration.ofMinutes(20),
39+
DEFAULT_QUERY_TIMEOUT,
40+
DEFAULT_CONNECTION_TIMEOUT,
3941
Collections.emptyMap()) {
4042
public MongoClientSettings toSettings() {
4143
final MongoClientSettings.Builder settingsBuilder =

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/ConnectionConfig.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,16 @@
3131
public class ConnectionConfig {
3232
private static final String DEFAULT_APP_NAME = "document-store";
3333

34+
public static final Duration DEFAULT_CONNECTION_TIMEOUT = Duration.ofSeconds(10);
35+
public static final Duration DEFAULT_QUERY_TIMEOUT = Duration.ofMinutes(20);
36+
3437
@Singular @NonNull List<@NonNull Endpoint> endpoints;
3538
@NonNull String database;
3639
@Nullable ConnectionCredentials credentials;
3740
@NonNull AggregatePipelineMode aggregationPipelineMode;
3841
@NonNull DataFreshness dataFreshness;
3942
@NonNull Duration queryTimeout;
43+
@NonNull Duration connectionTimeout;
4044
@NonNull Map<String, String> customParameters;
4145

4246
public ConnectionConfig(
@@ -50,7 +54,8 @@ public ConnectionConfig(
5054
credentials,
5155
AggregatePipelineMode.DEFAULT_ALWAYS,
5256
DataFreshness.SYSTEM_DEFAULT,
53-
Duration.ofMinutes(20),
57+
DEFAULT_QUERY_TIMEOUT,
58+
DEFAULT_CONNECTION_TIMEOUT,
5459
customParameters != null ? customParameters : Collections.emptyMap());
5560
}
5661

@@ -79,7 +84,8 @@ public ConnectionConfigBuilder customParameter(String key, String value) {
7984
ConnectionPoolConfig connectionPoolConfig;
8085
AggregatePipelineMode aggregationPipelineMode = AggregatePipelineMode.DEFAULT_ALWAYS;
8186
DataFreshness dataFreshness = DataFreshness.SYSTEM_DEFAULT;
82-
Duration queryTimeout = Duration.ofMinutes(20);
87+
Duration queryTimeout = DEFAULT_QUERY_TIMEOUT;
88+
Duration connectionTimeout = DEFAULT_CONNECTION_TIMEOUT;
8389

8490
public ConnectionConfigBuilder type(final DatabaseType type) {
8591
this.type = type;
@@ -110,6 +116,7 @@ public ConnectionConfig build() {
110116
aggregationPipelineMode,
111117
dataFreshness,
112118
queryTimeout,
119+
connectionTimeout,
113120
customParameters);
114121

115122
case POSTGRES:

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractor.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class TypesafeConfigDatastoreConfigExtractor {
3333
private static final String DEFAULT_AGGREGATION_PIPELINE_MODE_KEY = "aggregationPipelineMode";
3434
private static final String DEFAULT_DATA_FRESHNESS_KEY = "dataFreshness";
3535
private static final String DEFAULT_QUERY_TIMEOUT_KEY = "queryTimeout";
36+
private static final String DEFAULT_CONNECTION_TIMEOUT_KEY = "connectionTimeout";
3637
private static final String DEFAULT_CUSTOM_PARAMETERS_PREFIX = "customParams";
3738

3839
@NonNull Config config;
@@ -80,6 +81,7 @@ private TypesafeConfigDatastoreConfigExtractor(
8081
.aggregationPipelineMode(DEFAULT_AGGREGATION_PIPELINE_MODE_KEY)
8182
.dataFreshnessKey(DEFAULT_DATA_FRESHNESS_KEY)
8283
.queryTimeoutKey(DEFAULT_QUERY_TIMEOUT_KEY)
84+
.connectionTimeoutKey(DEFAULT_CONNECTION_TIMEOUT_KEY)
8385
.customParametersKey(DEFAULT_CUSTOM_PARAMETERS_PREFIX);
8486
}
8587

@@ -244,6 +246,13 @@ public TypesafeConfigDatastoreConfigExtractor queryTimeoutKey(@NonNull final Str
244246
return this;
245247
}
246248

249+
public TypesafeConfigDatastoreConfigExtractor connectionTimeoutKey(@NonNull final String key) {
250+
if (config.hasPath(key)) {
251+
connectionConfigBuilder.connectionTimeout(config.getDuration(key));
252+
}
253+
return this;
254+
}
255+
247256
public DatastoreConfig extract() {
248257
if (connectionConfigBuilder.endpoints().isEmpty()
249258
&& !Endpoint.builder().build().equals(endpointBuilder.build())) {

document-store/src/main/java/org/hypertrace/core/documentstore/model/config/mongo/MongoConnectionConfig.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.mongodb.ServerAddress;
1111
import com.mongodb.connection.ClusterSettings;
1212
import com.mongodb.connection.ConnectionPoolSettings;
13+
import com.mongodb.connection.SocketSettings;
1314
import java.time.Duration;
1415
import java.util.ArrayList;
1516
import java.util.List;
@@ -55,6 +56,7 @@ public MongoConnectionConfig(
5556
@NonNull final AggregatePipelineMode aggregationPipelineMode,
5657
@NonNull final DataFreshness dataFreshness,
5758
@NonNull final Duration queryTimeout,
59+
@NonNull final Duration connectionTimeout,
5860
@NonNull final Map<String, String> customParameters) {
5961
super(
6062
ensureAtLeastOneEndpoint(endpoints),
@@ -63,6 +65,7 @@ public MongoConnectionConfig(
6365
aggregationPipelineMode,
6466
dataFreshness,
6567
queryTimeout,
68+
connectionTimeout,
6669
customParameters);
6770
this.applicationName = applicationName;
6871
this.replicaSetName = replicaSetName;
@@ -79,6 +82,7 @@ public MongoClientSettings toSettings() {
7982
applyClusterSettings(settingsBuilder);
8083
applyConnectionPoolSettings(settingsBuilder);
8184
applyCredentialSettings(settingsBuilder);
85+
applyConnectionTimeoutSettings(settingsBuilder);
8286

8387
return settingsBuilder.build();
8488
}
@@ -174,4 +178,12 @@ private void applyCredentialSettings(final Builder settingsBuilder) {
174178
settingsBuilder.credential(credential);
175179
}
176180
}
181+
182+
private void applyConnectionTimeoutSettings(final Builder settingsBuilder) {
183+
SocketSettings socketSettings =
184+
SocketSettings.builder()
185+
.connectTimeout(connectionTimeout().toMillis(), TimeUnit.MILLISECONDS)
186+
.build();
187+
settingsBuilder.applyToSocketSettings(builder -> builder.applySettings(socketSettings));
188+
}
177189
}

document-store/src/test/java/org/hypertrace/core/documentstore/model/config/TypesafeConfigDatastoreConfigExtractorTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ class TypesafeConfigDatastoreConfigExtractorTest {
3333
private static final String AGGREGATION_PIPELINE_MODE_KEY = "aggregationPipelineMode";
3434
private static final String DATA_FRESHNESS_KEY = "dataFreshness";
3535
private static final String QUERY_TIMEOUT_KEY = "queryTimeout";
36+
private static final String CONNECTION_TIMEOUT_KEY = "connectionTimeout";
3637

3738
private static final String host = "red.planet";
3839
private static final String host1 = "RED_PLANET";
@@ -50,6 +51,7 @@ class TypesafeConfigDatastoreConfigExtractorTest {
5051
private static final AggregatePipelineMode aggregatePipelineMode = SORT_OPTIMIZED_IF_POSSIBLE;
5152
private static final DataFreshness dataFreshness = NEAR_REALTIME_FRESHNESS;
5253
private static final Duration queryTimeout = Duration.ofSeconds(45);
54+
private static final Duration connectionTimeout = Duration.ofSeconds(30);
5355

5456
@SuppressWarnings("ConstantConditions")
5557
@Test
@@ -109,6 +111,7 @@ void testBuildMongo() {
109111
.aggregationPipelineMode(AGGREGATION_PIPELINE_MODE_KEY)
110112
.dataFreshnessKey(DATA_FRESHNESS_KEY)
111113
.queryTimeoutKey(QUERY_TIMEOUT_KEY)
114+
.connectionTimeoutKey(CONNECTION_TIMEOUT_KEY)
112115
.extract()
113116
.connectionConfig();
114117
final ConnectionConfig expected =
@@ -134,6 +137,7 @@ void testBuildMongo() {
134137
.dataFreshness(dataFreshness)
135138
.aggregationPipelineMode(aggregatePipelineMode)
136139
.queryTimeout(queryTimeout)
140+
.connectionTimeout(connectionTimeout)
137141
.build();
138142

139143
assertEquals(expected, config);
@@ -363,6 +367,7 @@ private Config buildConfigMap() {
363367
entry(CONNECTION_SURRENDER_TIMEOUT_KEY, surrenderTimeout),
364368
entry(AGGREGATION_PIPELINE_MODE_KEY, SORT_OPTIMIZED_IF_POSSIBLE.name()),
365369
entry(DATA_FRESHNESS_KEY, NEAR_REALTIME_FRESHNESS.name()),
370+
entry(CONNECTION_TIMEOUT_KEY, connectionTimeout),
366371
entry(QUERY_TIMEOUT_KEY, queryTimeout)));
367372
}
368373

0 commit comments

Comments
 (0)