Skip to content

Commit 907019b

Browse files
FabianMeiswinkelannie-macxinlian12nehrao1
authored
EnableHttp2PublicAPI (#45294)
* allow using http2 * update pipeline * fix tests * allow enable http2 * resolve comments * fix tests * update changelog * add enableHttp2PublicAPI * update changelog * Update sdk/cosmos/azure-cosmos/CHANGELOG.md Co-authored-by: Fabian Meiswinkel <[email protected]> * resolve comments * fix tests * add javadocs * make toDiagnosticsString() package private * remove annotation * Http2ConnectionConfig.toDiagnosticsString() needs to be public for ConnectionPolicy.toString() * fix diagnostics tests * Fixing Beta-Version * Update Http2ConnectionConfig.java * Update Http2ConnectionConfig.java * Fixing more flaky tests * Fixing build break * Update ClientMetricsTest.java * Update ClientMetricsTest.java --------- Co-authored-by: annie-mac <[email protected]> Co-authored-by: Annie Liang <[email protected]> Co-authored-by: Neha Rao <[email protected]> Co-authored-by: nehrao1 <[email protected]>
1 parent ec93ae6 commit 907019b

18 files changed

+342
-68
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
package com.azure.cosmos.benchmark;
4+
5+
import org.slf4j.Logger;
6+
import org.slf4j.LoggerFactory;
7+
import org.testng.IRetryAnalyzer;
8+
import org.testng.ITestResult;
9+
10+
public class FlakyTestRetryAnalyzer implements IRetryAnalyzer {
11+
protected static Logger logger = LoggerFactory.getLogger(FlakyTestRetryAnalyzer.class.getSimpleName());
12+
private int counter = 0;
13+
protected int retryLimit = 2;
14+
15+
@Override
16+
public boolean retry(ITestResult iTestResult) {
17+
if (iTestResult.isSuccess()) {
18+
return false;
19+
}
20+
21+
if (counter < retryLimit) {
22+
counter++;
23+
logger.info(
24+
"Retrying test {} - retry number {} out of at most {}. Exception seen in previous attempt: {}",
25+
iTestResult.getTestName(),
26+
counter,
27+
retryLimit,
28+
iTestResult.getThrowable());
29+
30+
return true;
31+
}
32+
33+
return false;
34+
}
35+
}

sdk/cosmos/azure-cosmos-benchmark/src/test/java/com/azure/cosmos/benchmark/ReadMyWritesConsistencyTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ public Object[][] collectionLinkTypeArgProvider() {
9494
};
9595
}
9696

97-
@Test(dataProvider = "collectionLinkTypeArgProvider", groups = "e2e")
97+
@Test(dataProvider = "collectionLinkTypeArgProvider", groups = "e2e", retryAnalyzer = FlakyTestRetryAnalyzer.class)
9898
public void readMyWrites(boolean useNameLink) throws Exception {
9999

100100
int concurrency = 5;

sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/ClientMetricsTest.java

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ public void createItem() throws Exception {
139139

140140
for (boolean disableLatencyMeter: disableLatencyMeterTestCases) {
141141

142+
logger.info("Disable latency meter: {}", disableLatencyMeter);
142143
try (TestState state = new TestState(getClientBuilder(), CosmosMetricCategory.DEFAULT)) {
143144
if (disableLatencyMeter) {
144145
state.inputMetricsOptions
@@ -1507,14 +1508,27 @@ public TestState(CosmosClientBuilder clientBuilder,
15071508
assertThat(writeRegions).isNotNull().isNotEmpty();
15081509
this.preferredRegion = writeRegions.iterator().next();
15091510

1510-
CosmosAsyncDatabase db = getSharedCosmosDatabase(this.client.asyncClient());
1511-
CosmosAsyncContainer asyncContainer = createCollection(
1512-
db,
1513-
getCollectionDefinitionWithRangeRangeIndex(),
1514-
new CosmosContainerRequestOptions(),
1515-
10100);
1516-
this.databaseId = db.getId();
1517-
this.containerId = asyncContainer.getId();
1511+
CosmosClient mgmtClient = clientBuilder
1512+
.clientTelemetryConfig(
1513+
new CosmosClientTelemetryConfig().metricsOptions(new CosmosMicrometerMetricsOptions().setEnabled(false))
1514+
)
1515+
.buildClient();
1516+
try {
1517+
CosmosAsyncDatabase db = getSharedCosmosDatabase(mgmtClient.asyncClient());
1518+
CosmosAsyncContainer asyncContainer = createCollection(
1519+
db,
1520+
getCollectionDefinitionWithRangeRangeIndex(),
1521+
new CosmosContainerRequestOptions(),
1522+
10100);
1523+
1524+
this.databaseId = db.getId();
1525+
this.containerId = asyncContainer.getId();
1526+
mgmtClient.close();
1527+
} catch (Exception error) {
1528+
logger.error(error.getMessage(), error);
1529+
throw error;
1530+
}
1531+
15181532
this.clientCorrelationTag = client.asyncClient().getClientCorrelationTag();
15191533
this.container = client.getDatabase(databaseId).getContainer(containerId);
15201534
}
@@ -1541,7 +1555,11 @@ public void close() throws Exception {
15411555
}
15421556
}
15431557

1544-
CosmosClient mgmtClient = clientBuilder.buildClient();
1558+
CosmosClient mgmtClient = clientBuilder
1559+
.clientTelemetryConfig(
1560+
new CosmosClientTelemetryConfig().metricsOptions(new CosmosMicrometerMetricsOptions().setEnabled(false))
1561+
)
1562+
.buildClient();
15451563
try {
15461564
mgmtClient.getDatabase(this.databaseId).getContainer(this.containerId).delete();
15471565
mgmtClient.close();

sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/ProactiveConnectionManagementTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ public void openConnectionsAndInitCachesWithInvalidCosmosClientConfig(List<Strin
135135
}
136136
}
137137

138-
@Test(groups = {"multi-master"}, dataProvider = "proactiveContainerInitConfigs")
138+
@Test(groups = {"multi-master"}, dataProvider = "proactiveContainerInitConfigs", retryAnalyzer = FlakyTestRetryAnalyzer.class)
139139
public void openConnectionsAndInitCachesWithContainer(ProactiveConnectionManagementTestConfig proactiveConnectionManagementTestConfig) {
140140
CosmosAsyncClient asyncClient = null;
141141

sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/implementation/ClientConfigDiagnosticsTest.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ public void rntbd() throws Exception {
202202
assertThat(objectNode.get("numberOfClients").asInt()).isEqualTo(2);
203203
assertThat(objectNode.get("consistencyCfg").asText()).isEqualTo("(consistency: null, readConsistencyStrategy: null, mm: false, prgns: [null])");
204204
assertThat(objectNode.get("connCfg").get("rntbd").asText()).isEqualTo("(cto:PT5S, nrto:PT5S, icto:PT0S, ieto:PT1H, mcpe:130, mrpc:30, cer:true)");
205-
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("(cps:1000, nrto:PT1M, icto:PT1M, cto:PT45S, p:false)");
205+
206+
String http2Enabled = Configs.isHttp2Enabled() ? "true" : "false";
207+
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("(cps:1000, nrto:PT1M, icto:PT1M, cto:PT45S, p:false, http2:(enabled:"+ http2Enabled + ", maxc:1000, minc:1, maxs:30))");
206208
assertThat(objectNode.get("connCfg").get("other").asText()).isEqualTo("(ed: false, cs: false, rv: true)");
207209
}
208210

@@ -237,7 +239,9 @@ public void gw() throws Exception {
237239
assertThat(objectNode.get("numberOfClients").asInt()).isEqualTo(2);
238240
assertThat(objectNode.get("consistencyCfg").asText()).isEqualTo("(consistency: null, readConsistencyStrategy: null, mm: false, prgns: [null])");
239241
assertThat(objectNode.get("connCfg").get("rntbd").asText()).isEqualTo("null");
240-
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("(cps:500, nrto:PT18S, icto:PT17S, cto:PT45S, p:false)");
242+
243+
String http2Enabled = Configs.isHttp2Enabled() ? "true" : "false";
244+
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("(cps:500, nrto:PT18S, icto:PT17S, cto:PT45S, p:false, http2:(enabled:" + http2Enabled + ", maxc:1000, minc:1, maxs:30))");
241245
assertThat(objectNode.get("connCfg").get("other").asText()).isEqualTo("(ed: false, cs: false, rv: true)");
242246
}
243247

@@ -309,7 +313,9 @@ public void full(
309313
assertThat(objectNode.get("numberOfClients").asInt()).isEqualTo(2);
310314
assertThat(objectNode.get("consistencyCfg").asText()).isEqualTo("(consistency: null, readConsistencyStrategy: null, mm: false, prgns: [westus1,westus2])");
311315
assertThat(objectNode.get("connCfg").get("rntbd").asText()).isEqualTo("null");
312-
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("(cps:500, nrto:PT18S, icto:PT17S, cto:PT45S, p:false)");
316+
317+
String http2Enabled = Configs.isHttp2Enabled() ? "true" : "false";
318+
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("(cps:500, nrto:PT18S, icto:PT17S, cto:PT45S, p:false, http2:(enabled:" + http2Enabled + ", maxc:1000, minc:1, maxs:30))");
313319
assertThat(objectNode.get("connCfg").get("other").asText()).isEqualTo("(ed: true, cs: true, rv: false)");
314320
assertThat(objectNode.get("excrgns").asText()).isEqualTo("[westus2]");
315321

sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/implementation/RxDocumentClientImplTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.azure.cosmos.CosmosDiagnostics;
1111
import com.azure.cosmos.CosmosEndToEndOperationLatencyPolicyConfig;
1212
import com.azure.cosmos.CosmosItemSerializer;
13+
import com.azure.cosmos.Http2ConnectionConfig;
1314
import com.azure.cosmos.SessionRetryOptions;
1415
import com.azure.cosmos.implementation.apachecommons.lang.tuple.ImmutablePair;
1516
import com.azure.cosmos.implementation.caches.RxClientCollectionCache;
@@ -179,6 +180,7 @@ public void readMany() {
179180
Mockito.when(this.connectionPolicyMock.getMaxConnectionPoolSize()).thenReturn(dummyInt);
180181
Mockito.when(this.connectionPolicyMock.getProxy()).thenReturn(dummyProxyOptions);
181182
Mockito.when(this.connectionPolicyMock.getHttpNetworkRequestTimeout()).thenReturn(dummyDuration);
183+
Mockito.when(this.connectionPolicyMock.getHttp2ConnectionConfig()).thenReturn(new Http2ConnectionConfig());
182184

183185
httpClientMock
184186
.when(() -> HttpClient.createFixed(Mockito.any(HttpClientConfig.class)))

sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/rx/TestSuiteBase.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
import com.azure.core.credential.AzureKeyCredential;
66
import com.azure.cosmos.BridgeInternal;
7-
import com.azure.cosmos.ConnectionMode;
87
import com.azure.cosmos.ConsistencyLevel;
98
import com.azure.cosmos.CosmosAsyncClient;
109
import com.azure.cosmos.CosmosAsyncClientTest;
@@ -14,15 +13,14 @@
1413
import com.azure.cosmos.CosmosBridgeInternal;
1514
import com.azure.cosmos.CosmosClient;
1615
import com.azure.cosmos.CosmosClientBuilder;
17-
import com.azure.cosmos.CosmosContainer;
1816
import com.azure.cosmos.CosmosDatabase;
1917
import com.azure.cosmos.CosmosDatabaseForTest;
2018
import com.azure.cosmos.CosmosEndToEndOperationLatencyPolicyConfigBuilder;
2119
import com.azure.cosmos.CosmosException;
2220
import com.azure.cosmos.CosmosResponseValidator;
2321
import com.azure.cosmos.DirectConnectionConfig;
2422
import com.azure.cosmos.GatewayConnectionConfig;
25-
import com.azure.cosmos.ReadConsistencyStrategy;
23+
import com.azure.cosmos.Http2ConnectionConfig;
2624
import com.azure.cosmos.TestNGLogListener;
2725
import com.azure.cosmos.ThrottlingRetryOptions;
2826
import com.azure.cosmos.implementation.Configs;
@@ -1474,6 +1472,15 @@ static protected CosmosClientBuilder createGatewayRxDocumentClient(
14741472
boolean retryOnThrottledRequests) {
14751473

14761474
GatewayConnectionConfig gatewayConnectionConfig = new GatewayConnectionConfig();
1475+
if (Configs.isHttp2Enabled()) {
1476+
Http2ConnectionConfig http2ConnectionConfig = new Http2ConnectionConfig()
1477+
.setEnabled(true)
1478+
.setMaxConnectionPoolSize(10)
1479+
.setMinConnectionPoolSize(1)
1480+
.setMaxConcurrentStreams(30);
1481+
gatewayConnectionConfig.setHttp2ConnectionConfig(http2ConnectionConfig);
1482+
}
1483+
14771484
CosmosClientBuilder builder = new CosmosClientBuilder().endpoint(endpoint)
14781485
.credential(credential)
14791486
.gatewayMode(gatewayConnectionConfig)

sdk/cosmos/azure-cosmos/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
### 4.69.0 (2025-05-13)
44

55
#### Features Added
6+
* Added Beta public API to enable http2. - See [PR 43123](https://github.com/Azure/azure-sdk-for-java/pull/43123)
67
* Added API to allow customers to wrap/extend `CosmosAsyncContainer` - [PR 43724](https://github.com/Azure/azure-sdk-for-java/pull/43724) and [PR 45087](https://github.com/Azure/azure-sdk-for-java/pull/45087)
78
* Added Per-Partition Automatic Failover which enables failover for writes at per-partition level for Single-Write Multi-Region accounts. - [PR 44099](https://github.com/Azure/azure-sdk-for-java/pull/44099)
89
* Added Beta public API to allow defining the consistency behavior for read / query / change feed operations independent of the chosen account-level consistency level. **NOTE: This API is still in preview mode and can only be used when using DIRECT connection mode.** - See [PR 45161](https://github.com/Azure/azure-sdk-for-java/pull/45161)

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/BridgeInternal.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,5 +623,6 @@ public static void initializeAllAccessors() {
623623
SessionRetryOptions.initialize();
624624
CosmosItemSerializer.initialize();
625625
ReadConsistencyStrategy.initialize();
626+
Http2ConnectionConfig.initialize();
626627
}
627628
}

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/GatewayConnectionConfig.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import com.azure.core.http.ProxyOptions;
77
import com.azure.cosmos.implementation.Configs;
8+
import com.azure.cosmos.util.Beta;
89

910
import java.time.Duration;
1011

@@ -24,6 +25,7 @@ public final class GatewayConnectionConfig {
2425
private int maxConnectionPoolSize;
2526
private Duration idleConnectionTimeout;
2627
private ProxyOptions proxy;
28+
private Http2ConnectionConfig http2ConnectionConfig;
2729

2830
/**
2931
* Constructor.
@@ -32,6 +34,7 @@ public GatewayConnectionConfig() {
3234
this.idleConnectionTimeout = DEFAULT_IDLE_CONNECTION_TIMEOUT;
3335
this.maxConnectionPoolSize = Configs.getDefaultHttpPoolSize();
3436
this.networkRequestTimeout = DEFAULT_NETWORK_REQUEST_TIMEOUT;
37+
this.http2ConnectionConfig = new Http2ConnectionConfig();
3538
}
3639

3740
/**
@@ -136,6 +139,27 @@ public GatewayConnectionConfig setProxy(ProxyOptions proxy) {
136139
return this;
137140
}
138141

142+
/***
143+
* Get the http2 connection config.
144+
* @return the {@link Http2ConnectionConfig}.
145+
*/
146+
@Beta(value = Beta.SinceVersion.V4_69_0, warningText = Beta.PREVIEW_SUBJECT_TO_CHANGE_WARNING)
147+
public Http2ConnectionConfig getHttp2ConnectionConfig() {
148+
return http2ConnectionConfig;
149+
}
150+
151+
/***
152+
* Set the http2 connection config.
153+
* @param http2ConnectionConfig the {@link Http2ConnectionConfig}.
154+
*/
155+
@Beta(value = Beta.SinceVersion.V4_69_0, warningText = Beta.PREVIEW_SUBJECT_TO_CHANGE_WARNING)
156+
public GatewayConnectionConfig setHttp2ConnectionConfig(Http2ConnectionConfig http2ConnectionConfig) {
157+
checkNotNull(http2ConnectionConfig, "Argument 'http2ConnectionConfig' can not be null");
158+
159+
this.http2ConnectionConfig = http2ConnectionConfig;
160+
return this;
161+
}
162+
139163
@Override
140164
public String toString() {
141165
String proxyType = proxy != null ? proxy.getType().toString() : null;
@@ -147,6 +171,7 @@ public String toString() {
147171
", networkRequestTimeout=" + networkRequestTimeout +
148172
", proxyType=" + proxyType +
149173
", inetSocketProxyAddress=" + proxyAddress +
174+
", http2ConnectionConfig=" + http2ConnectionConfig.toDiagnosticsString() +
150175
'}';
151176
}
152177
}

0 commit comments

Comments
 (0)