Skip to content

Commit 0bfbd9f

Browse files
authored
Session retry options diagnostic improvement (#36711)
* Wired SessionRetryOptions in diagnostics. * Updated CHANGELOG.md * Added maxInRegionRetryCount and minInRegionRetryTime to diagnostic string. * Added maxInRegionRetryCount and minInRegionRetryTime to diagnostic string. * Updated CHANGELOG.md. * Updated CHANGELOG.md. * Refactoring. * Updated CHANGELOG.md.
1 parent c973498 commit 0bfbd9f

File tree

5 files changed

+143
-4
lines changed

5 files changed

+143
-4
lines changed

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

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
import com.azure.cosmos.CosmosContainerProactiveInitConfigBuilder;
99
import com.azure.cosmos.CosmosExcludedRegions;
1010
import com.azure.cosmos.DirectConnectionConfig;
11+
import com.azure.cosmos.CosmosRegionSwitchHint;
12+
import com.azure.cosmos.SessionRetryOptions;
13+
import com.azure.cosmos.SessionRetryOptionsBuilder;
1114
import com.azure.cosmos.implementation.directconnectivity.RntbdTransportClient;
1215
import com.azure.cosmos.implementation.guava25.collect.ImmutableList;
1316
import com.azure.cosmos.implementation.http.HttpClientConfig;
@@ -40,6 +43,9 @@ public class ClientConfigDiagnosticsTest {
4043
private static final ImplementationBridgeHelpers.CosmosContainerIdentityHelper.CosmosContainerIdentityAccessor containerIdentityAccessor = ImplementationBridgeHelpers
4144
.CosmosContainerIdentityHelper
4245
.getCosmosContainerIdentityAccessor();
46+
private static final ImplementationBridgeHelpers.CosmosSessionRetryOptionsHelper.CosmosSessionRetryOptionsAccessor sessionRetryOptionsAccessor = ImplementationBridgeHelpers
47+
.CosmosSessionRetryOptionsHelper
48+
.getCosmosSessionRetryOptionsAccessor();
4349

4450
@DataProvider(name = "proactiveContainerInitConfigProvider")
4551
public Object[][] proactiveContainerInitConfigProvider() {
@@ -88,6 +94,48 @@ public Object[][] proactiveContainerInitConfigProvider() {
8894
};
8995
}
9096

97+
@DataProvider(name = "sessionRetryOptionsConfigProvider")
98+
public Object[][] sessionRetryOptionsConfigProvider() {
99+
100+
SessionRetryOptions sessionRetryOptionsWithLocalRegionPreferred = new SessionRetryOptionsBuilder()
101+
.regionSwitchHint(CosmosRegionSwitchHint.LOCAL_REGION_PREFERRED)
102+
.build();
103+
104+
SessionRetryOptions sessionRetryOptionsWithRemoteRegionPreferred = new SessionRetryOptionsBuilder()
105+
.regionSwitchHint(CosmosRegionSwitchHint.REMOTE_REGION_PREFERRED)
106+
.build();
107+
108+
SessionRetryOptions sessionRetryOptionsWithNoDefaults = new SessionRetryOptionsBuilder()
109+
.regionSwitchHint(CosmosRegionSwitchHint.REMOTE_REGION_PREFERRED)
110+
.minTimeoutPerRegion(Duration.ofSeconds(2))
111+
.maxRetriesPerRegion(7)
112+
.build();
113+
114+
return new Object[][] {
115+
{
116+
sessionRetryOptionsWithLocalRegionPreferred,
117+
reconstructSessionRetryOptionsAsString(
118+
sessionRetryOptionsAccessor.getRegionSwitchHint(sessionRetryOptionsWithLocalRegionPreferred),
119+
sessionRetryOptionsAccessor.getMinInRegionRetryTime(sessionRetryOptionsWithLocalRegionPreferred),
120+
sessionRetryOptionsAccessor.getMaxInRegionRetryCount(sessionRetryOptionsWithLocalRegionPreferred))
121+
},
122+
{
123+
sessionRetryOptionsWithRemoteRegionPreferred,
124+
reconstructSessionRetryOptionsAsString(
125+
sessionRetryOptionsAccessor.getRegionSwitchHint(sessionRetryOptionsWithRemoteRegionPreferred),
126+
sessionRetryOptionsAccessor.getMinInRegionRetryTime(sessionRetryOptionsWithRemoteRegionPreferred),
127+
sessionRetryOptionsAccessor.getMaxInRegionRetryCount(sessionRetryOptionsWithRemoteRegionPreferred))
128+
},
129+
{
130+
sessionRetryOptionsWithNoDefaults,
131+
reconstructSessionRetryOptionsAsString(
132+
sessionRetryOptionsAccessor.getRegionSwitchHint(sessionRetryOptionsWithNoDefaults),
133+
sessionRetryOptionsAccessor.getMinInRegionRetryTime(sessionRetryOptionsWithNoDefaults),
134+
sessionRetryOptionsAccessor.getMaxInRegionRetryCount(sessionRetryOptionsWithNoDefaults))
135+
}
136+
};
137+
}
138+
91139
@Test(groups = { "unit" })
92140
public void bareMinimum() throws Exception {
93141
DiagnosticsClientContext clientContext = Mockito.mock(DiagnosticsClientContext.class);
@@ -238,11 +286,43 @@ public void full(
238286

239287
String expectedProactiveInitConfigString = reconstructProactiveInitConfigString(cosmosContainerIdentities, aggressiveWarmupDuration, proactiveConnectionRegionCount);
240288

241-
assertThat(objectNode.get("proactiveInit").asText()).isEqualTo(expectedProactiveInitConfigString);
289+
assertThat(objectNode.get("proactiveInitCfg").asText()).isEqualTo(expectedProactiveInitConfigString);
242290

243291
System.clearProperty("COSMOS.REPLICA_ADDRESS_VALIDATION_ENABLED");
244292
}
245293

294+
@Test(groups = {"unit"}, dataProvider = "sessionRetryOptionsConfigProvider")
295+
public void sessionRetryOptionsInDiagnostics(SessionRetryOptions sessionRetryOptions, String expectedSessionRetryOptionsAsString) throws Exception {
296+
DiagnosticsClientContext clientContext = Mockito.mock(DiagnosticsClientContext.class);
297+
298+
DiagnosticsClientContext.DiagnosticsClientConfig diagnosticsClientConfig = new DiagnosticsClientContext.DiagnosticsClientConfig();
299+
String machineId = "vmId:" + UUID.randomUUID();
300+
diagnosticsClientConfig.withMachineId(machineId);
301+
diagnosticsClientConfig.withClientId(1);
302+
diagnosticsClientConfig.withConnectionMode(ConnectionMode.DIRECT);
303+
diagnosticsClientConfig.withActiveClientCounter(new AtomicInteger(2));
304+
diagnosticsClientConfig.withClientMap(new HashMap<>());
305+
diagnosticsClientConfig.withSessionRetryOptions(sessionRetryOptions);
306+
307+
Mockito.doReturn(diagnosticsClientConfig).when(clientContext).getConfig();
308+
309+
StringWriter jsonWriter = new StringWriter();
310+
JsonGenerator jsonGenerator = new JsonFactory().createGenerator(jsonWriter);
311+
SerializerProvider serializerProvider = objectMapper.getSerializerProvider();
312+
DiagnosticsClientContext.DiagnosticsClientConfigSerializer.INSTANCE.serialize(clientContext.getConfig(), jsonGenerator, serializerProvider);
313+
jsonGenerator.flush();
314+
ObjectNode objectNode = (ObjectNode) objectMapper.readTree(jsonWriter.toString());
315+
316+
assertThat(objectNode.get("id").asInt()).isEqualTo(1);
317+
assertThat(objectNode.get("machineId").asText()).isEqualTo(machineId);
318+
assertThat(objectNode.get("numberOfClients").asInt()).isEqualTo(2);
319+
assertThat(objectNode.get("consistencyCfg").asText()).isEqualTo("(consistency: null, mm: false, prgns: [null])");
320+
assertThat(objectNode.get("connCfg").get("rntbd").asText()).isEqualTo("null");
321+
assertThat(objectNode.get("connCfg").get("gw").asText()).isEqualTo("null");
322+
assertThat(objectNode.get("connCfg").get("other").asText()).isEqualTo("(ed: false, cs: false, rv: true)");
323+
assertThat(objectNode.get("sessionRetryCfg").asText()).isEqualTo(expectedSessionRetryOptionsAsString);
324+
}
325+
246326
private static String reconstructProactiveInitConfigString(
247327
List<CosmosContainerIdentity> containerIdentities,
248328
Duration aggressiveWarmupDuration,
@@ -259,4 +339,13 @@ private static String reconstructProactiveInitConfigString(
259339
proactiveConnectionRegionCount,
260340
aggressiveWarmupDuration);
261341
}
342+
343+
private static String reconstructSessionRetryOptionsAsString(CosmosRegionSwitchHint regionSwitchHint, Duration minInRegionRetryTime, int maxInRegionRetryCount) {
344+
return String.format(
345+
"(rsh:%s, minrrt:%s, maxrrc:%s)",
346+
regionSwitchHint == CosmosRegionSwitchHint.REMOTE_REGION_PREFERRED ? "REMOTE_REGION_PREFERRED" : "LOCAL_REGION_PREFERRED",
347+
minInRegionRetryTime.toString(),
348+
maxInRegionRetryCount
349+
);
350+
}
262351
}

sdk/cosmos/azure-cosmos/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
* Fixed an issue where PartitionKeyRange request will not do cross region retry. - See [PR 37403](https://github.com/Azure/azure-sdk-for-java/pull/37403)
1212

1313
#### Other Changes
14+
* Added `sessionRetryCfg` to the diagnostic string and modified `proactiveInit` key name to `proactiveInitCfg` in the diagnostic string. - See [PR 36711](https://github.com/Azure/azure-sdk-for-java/pull/36711)
1415

1516
### 4.52.0 (2023-10-24)
1617
#### Features Added

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

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33

44
package com.azure.cosmos;
55

6-
import com.azure.cosmos.implementation.Configs;
76
import com.azure.cosmos.implementation.ImplementationBridgeHelpers;
87

98
import java.time.Duration;
@@ -17,8 +16,8 @@ public final class SessionRetryOptions {
1716

1817
private final CosmosRegionSwitchHint regionSwitchHint;
1918
private final Duration minInRegionRetryTime;
20-
2119
private final int maxInRegionRetryCount;
20+
private final String sessionRetryOptionsAsString;
2221

2322
/**
2423
* Instantiates {@link SessionRetryOptions}
@@ -29,6 +28,42 @@ public final class SessionRetryOptions {
2928
this.regionSwitchHint = regionSwitchHint;
3029
this.minInRegionRetryTime = minInRegionRetryTime ;
3130
this.maxInRegionRetryCount = maxInRegionRetryCount;
31+
this.sessionRetryOptionsAsString = sessionRetryOptionsAsString(this.regionSwitchHint, this.minInRegionRetryTime, this.maxInRegionRetryCount);
32+
}
33+
34+
@Override
35+
public String toString() {
36+
return this.sessionRetryOptionsAsString;
37+
}
38+
39+
private static String regionSwitchHintToString(CosmosRegionSwitchHint regionSwitchHint) {
40+
41+
String regionSwitchHintAsString = "";
42+
43+
if (regionSwitchHint == null) {
44+
return regionSwitchHintAsString;
45+
}
46+
47+
if (regionSwitchHint == CosmosRegionSwitchHint.REMOTE_REGION_PREFERRED) {
48+
regionSwitchHintAsString = "REMOTE_REGION_PREFERRED";
49+
}
50+
51+
if (regionSwitchHint == CosmosRegionSwitchHint.LOCAL_REGION_PREFERRED) {
52+
regionSwitchHintAsString = "LOCAL_REGION_PREFERRED";
53+
}
54+
55+
return regionSwitchHintAsString;
56+
}
57+
58+
private static String sessionRetryOptionsAsString(CosmosRegionSwitchHint regionSwitchHint,
59+
Duration minInRegionRetryTime,
60+
int maxInRegionRetryCount) {
61+
return String.format(
62+
"(rsh:%s, minrrt:%s, maxrrc:%s)",
63+
regionSwitchHintToString(regionSwitchHint),
64+
minInRegionRetryTime.toString(),
65+
maxInRegionRetryCount
66+
);
3267
}
3368

3469
static void initialize() {

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DiagnosticsClientContext.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.azure.cosmos.CosmosContainerProactiveInitConfig;
99
import com.azure.cosmos.CosmosDiagnostics;
1010
import com.azure.cosmos.CosmosEndToEndOperationLatencyPolicyConfig;
11+
import com.azure.cosmos.SessionRetryOptions;
1112
import com.azure.cosmos.implementation.clienttelemetry.ClientTelemetry;
1213
import com.azure.cosmos.implementation.guava27.Strings;
1314
import com.fasterxml.jackson.core.JsonGenerator;
@@ -78,8 +79,9 @@ public void serialize(DiagnosticsClientConfig clientConfig, JsonGenerator genera
7879
}
7980
generator.writeEndObject();
8081
generator.writeStringField("consistencyCfg", clientConfig.consistencyRelatedConfig());
81-
generator.writeStringField("proactiveInit", clientConfig.proactivelyInitializedContainersAsString);
82+
generator.writeStringField("proactiveInitCfg", clientConfig.proactivelyInitializedContainersAsString);
8283
generator.writeStringField("e2ePolicyCfg", clientConfig.endToEndOperationLatencyPolicyConfigAsString);
84+
generator.writeStringField("sessionRetryCfg", clientConfig.sessionRetryOptionsAsString);
8385
} catch (Exception e) {
8486
logger.debug("unexpected failure", e);
8587
}
@@ -110,6 +112,7 @@ class DiagnosticsClientConfig {
110112
private String machineId;
111113
private boolean replicaValidationEnabled = Configs.isReplicaAddressValidationEnabled();
112114
private ConnectionPolicy connectionPolicy;
115+
private String sessionRetryOptionsAsString;
113116

114117
public DiagnosticsClientConfig withMachineId(String machineId) {
115118
this.machineId = machineId;
@@ -207,6 +210,16 @@ public DiagnosticsClientConfig withConnectionMode(ConnectionMode connectionMode)
207210
return this;
208211
}
209212

213+
public DiagnosticsClientConfig withSessionRetryOptions(SessionRetryOptions sessionRetryOptions) {
214+
if (sessionRetryOptions == null) {
215+
this.sessionRetryOptionsAsString = "";
216+
} else {
217+
this.sessionRetryOptionsAsString = sessionRetryOptions.toString();
218+
}
219+
220+
return this;
221+
}
222+
210223
public ConnectionMode getConnectionMode() {
211224
return connectionMode;
212225
}

sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -484,6 +484,7 @@ private RxDocumentClientImpl(URI serviceEndpoint,
484484
this.diagnosticsClientConfig.withPreferredRegions(this.connectionPolicy.getPreferredRegions());
485485
this.diagnosticsClientConfig.withMachineId(tempMachineId);
486486
this.diagnosticsClientConfig.withProactiveContainerInitConfig(containerProactiveInitConfig);
487+
this.diagnosticsClientConfig.withSessionRetryOptions(sessionRetryOptions);
487488

488489
boolean disableSessionCapturing = (ConsistencyLevel.SESSION != consistencyLevel && !sessionCapturingOverrideEnabled);
489490

0 commit comments

Comments
 (0)