diff --git a/sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/implementation/ImplementationBridgeHelpersTest.java b/sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/implementation/ImplementationBridgeHelpersTest.java
index a8b6a301f761..7374340e9e71 100644
--- a/sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/implementation/ImplementationBridgeHelpersTest.java
+++ b/sdk/cosmos/azure-cosmos-tests/src/test/java/com/azure/cosmos/implementation/ImplementationBridgeHelpersTest.java
@@ -11,7 +11,16 @@
import org.slf4j.LoggerFactory;
import org.testng.annotations.Test;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
@@ -101,4 +110,340 @@ public void accessorInitialization() {
fail("Failed with IllegalAccessException : ", e.getMessage());
}
}
+
+ /**
+ * Regression test for #48622
+ * and #48585.
+ *
+ * Forks a fresh JVM that concurrently triggers {@code } of 12 different Cosmos classes
+ * from 12 threads synchronized via a {@link CyclicBarrier}. In a fresh JVM, {@code }
+ * runs for the first time — the only way to exercise the real deadlock scenario. A 30-second
+ * timeout detects the hang. Runs 5 invocations via TestNG ({@code invocationCount = 5}),
+ * each forking 3 child JVMs — totaling 15 fresh JVMs × 12 concurrent threads = 180
+ * {@code } race attempts.
+ */
+ @Test(groups = { "unit" }, invocationCount = 5)
+ public void concurrentAccessorInitializationShouldNotDeadlock() throws Exception {
+
+ String javaHome = System.getProperty("java.home");
+ String javaBin = javaHome + java.io.File.separator + "bin" + java.io.File.separator + "java";
+ String classpath = System.getProperty("java.class.path");
+
+ List command = new ArrayList<>();
+ command.add(javaBin);
+
+ // --add-opens is only supported on JDK 9+
+ try {
+ int majorVersion = Integer.parseInt(System.getProperty("java.specification.version").split("\\.")[0]);
+ if (majorVersion >= 9) {
+ command.add("--add-opens");
+ command.add("java.base/java.lang=ALL-UNNAMED");
+ }
+ } catch (NumberFormatException e) {
+ // JDK 8 returns "1.8" — first element is "1", which is < 9, so no --add-opens
+ }
+
+ command.add("-cp");
+ command.add(classpath);
+ command.add(ConcurrentClinitChildProcess.class.getName());
+
+ int timeoutSeconds = 30;
+ int runs = 1;
+
+ for (int run = 1; run <= runs; run++) {
+ final int currentRun = run;
+ ProcessBuilder pb = new ProcessBuilder(command);
+ pb.redirectErrorStream(true);
+ Process process = pb.start();
+
+ // Drain stdout on a separate thread to prevent blocking if child JVM deadlocks.
+ // Without this, readLine() would block indefinitely and the timeout below
+ // would never be reached.
+ StringBuilder output = new StringBuilder();
+ Thread gobbler = new Thread(() -> {
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ output.append(line).append(System.lineSeparator());
+ logger.info("[child-jvm-run-{}] {}", currentRun, line);
+ }
+ } catch (Exception e) {
+ // Process was destroyed — expected on timeout
+ }
+ });
+ gobbler.setDaemon(true);
+ gobbler.start();
+
+ boolean completed = process.waitFor(timeoutSeconds, TimeUnit.SECONDS);
+
+ if (!completed) {
+ process.destroyForcibly();
+ gobbler.join(5000);
+ fail("Run " + run + ": Child JVM did not complete within " + timeoutSeconds
+ + " seconds — deadlock detected");
+ }
+
+ gobbler.join(5000);
+ int exitCode = process.exitValue();
+ assertThat(exitCode)
+ .as("Run " + run + ": Child JVM exited with non-zero code. Output:\n" + output)
+ .isEqualTo(0);
+ }
+ }
+
+ /**
+ * Entry point for the forked child JVM. Concurrently triggers {@code } of 12 different
+ * Cosmos classes that are involved in the circular initialization chain reported in the issues.
+ * Exits 0 on success, 1 on deadlock (timeout).
+ */
+ public static final class ConcurrentClinitChildProcess {
+ public static void main(String[] args) {
+ int timeoutSeconds = 20;
+
+ String[] classesToLoad = {
+ "com.azure.cosmos.CosmosAsyncClient",
+ "com.azure.cosmos.models.SqlParameter",
+ "com.azure.cosmos.models.FeedResponse",
+ "com.azure.cosmos.models.CosmosItemRequestOptions",
+ "com.azure.cosmos.CosmosAsyncContainer",
+ "com.azure.cosmos.util.CosmosPagedFluxDefaultImpl",
+ "com.azure.cosmos.CosmosClientBuilder",
+ "com.azure.cosmos.CosmosItemSerializer",
+ "com.azure.cosmos.CosmosDiagnostics",
+ "com.azure.cosmos.CosmosDiagnosticsContext",
+ "com.azure.cosmos.models.CosmosQueryRequestOptions",
+ "com.azure.cosmos.models.CosmosChangeFeedRequestOptions"
+ };
+
+ int threadCount = classesToLoad.length;
+
+ // CyclicBarrier ensures all threads release at the exact same instant,
+ // maximizing the probability of concurrent collisions. Without it,
+ // thread startup stagger means earlier threads may finish before
+ // later threads start — hiding the deadlock.
+ CyclicBarrier barrier = new CyclicBarrier(threadCount);
+ ExecutorService executor = Executors.newFixedThreadPool(threadCount);
+
+ try {
+ List> futures = new ArrayList<>();
+ for (int i = 0; i < classesToLoad.length; i++) {
+ final String className = classesToLoad[i];
+ final int idx = i;
+ futures.add(executor.submit(() -> {
+ try {
+ barrier.await();
+ System.out.println("[Thread-" + idx + "] Loading " + className);
+ Class.forName(className);
+ System.out.println("[Thread-" + idx + "] Done.");
+ } catch (Exception e) {
+ throw new RuntimeException("Failed to load " + className, e);
+ }
+ }));
+ }
+
+ boolean deadlock = false;
+ for (int i = 0; i < futures.size(); i++) {
+ try {
+ futures.get(i).get(timeoutSeconds, TimeUnit.SECONDS);
+ } catch (java.util.concurrent.TimeoutException e) {
+ System.err.println("DEADLOCK: Thread-" + i + " timed out after " + timeoutSeconds + "s");
+ deadlock = true;
+ } catch (Exception e) {
+ Throwable root = e;
+ while (root.getCause() != null) {
+ root = root.getCause();
+ }
+ System.err.println("Thread-" + i + " error: " + root);
+ }
+ }
+
+ if (deadlock) {
+ System.exit(1);
+ }
+
+ // Verify all classes are actually initialized
+ for (String className : classesToLoad) {
+ try {
+ // Class.forName with initialize=false just checks if already loaded
+ // If the class was loaded above, this returns immediately
+ Class> cls = Class.forName(className, false,
+ ConcurrentClinitChildProcess.class.getClassLoader());
+ // Verify the class is initialized by accessing its static state
+ // (calling a static method would trigger if not done,
+ // but we explicitly check it's already done)
+ System.out.println("Verified loaded: " + cls.getName());
+ } catch (ClassNotFoundException e) {
+ System.err.println("Class not loaded: " + className);
+ System.exit(1);
+ }
+ }
+
+ System.exit(0);
+ } finally {
+ executor.shutdownNow();
+ }
+ }
+ }
+
+ /**
+ * Enforces that every {@code *Helper} inner class in
+ * {@link ImplementationBridgeHelpers} registers its accessor during {@code }
+ * (i.e., has a {@code static { initialize(); }} block).
+ *
+ * Verification is behavioral, not source-based: a forked child JVM iterates every
+ * {@code *Helper} inner class, calls each {@code getXxxAccessor()} getter (which
+ * lazily resolves the accessor), and checks the accessor is non-null via reflection.
+ * If a class is missing {@code static { initialize(); }}, the accessor remains null
+ * and this test fails.
+ */
+ @Test(groups = { "unit" })
+ public void allAccessorClassesMustHaveStaticInitializerBlock() throws Exception {
+ String javaHome = System.getProperty("java.home");
+ String javaBin = javaHome + java.io.File.separator + "bin" + java.io.File.separator + "java";
+ String classpath = System.getProperty("java.class.path");
+
+ List command = new ArrayList<>();
+ command.add(javaBin);
+
+ try {
+ int majorVersion = Integer.parseInt(System.getProperty("java.specification.version").split("\\.")[0]);
+ if (majorVersion >= 9) {
+ command.add("--add-opens");
+ command.add("java.base/java.lang=ALL-UNNAMED");
+ }
+ } catch (NumberFormatException e) {
+ // JDK 8
+ }
+
+ command.add("-cp");
+ command.add(classpath);
+ command.add(AccessorRegistrationChildProcess.class.getName());
+
+ ProcessBuilder pb = new ProcessBuilder(command);
+ pb.redirectErrorStream(true);
+ Process process = pb.start();
+
+ StringBuilder output = new StringBuilder();
+ Thread gobbler = new Thread(() -> {
+ try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ output.append(line).append(System.lineSeparator());
+ logger.info("[accessor-check] {}", line);
+ }
+ } catch (Exception e) {
+ // Process destroyed
+ }
+ });
+ gobbler.setDaemon(true);
+ gobbler.start();
+
+ boolean completed = process.waitFor(60, TimeUnit.SECONDS);
+ if (!completed) {
+ process.destroyForcibly();
+ gobbler.join(5000);
+ fail("Accessor registration check timed out after 60s. Output:\n" + output);
+ }
+
+ gobbler.join(5000);
+ int exitCode = process.exitValue();
+ assertThat(exitCode)
+ .as("Some accessor classes don't register their accessor during . Output:\n" + output)
+ .isEqualTo(0);
+ }
+
+ /**
+ * Child process that verifies every {@code *Helper} inner class in
+ * {@link ImplementationBridgeHelpers} has its accessor registered after calling the
+ * corresponding {@code getXxxAccessor()} getter. Runs in a fresh JVM where no Cosmos
+ * classes have been loaded yet, so {@code } is triggered for the first time.
+ */
+ public static final class AccessorRegistrationChildProcess {
+ public static void main(String[] args) throws Exception {
+ // Iterate all *Helper inner classes in ImplementationBridgeHelpers.
+ // For each, call the getXxxAccessor() getter which lazily resolves the
+ // accessor (triggering if needed). Then verify the accessor field is non-null.
+
+ Class>[] helpers = ImplementationBridgeHelpers.class.getDeclaredClasses();
+ List failures = new ArrayList<>();
+
+ for (Class> helper : helpers) {
+ if (!helper.getSimpleName().endsWith("Helper")) {
+ continue;
+ }
+
+ // Find the accessor AtomicReference field
+ Field accessorField = null;
+ Field classLoadedField = null;
+ for (Field f : helper.getDeclaredFields()) {
+ if (f.getName().contains("accessor") && f.getType() == AtomicReference.class) {
+ accessorField = f;
+ }
+ if (f.getName().contains("ClassLoaded") && f.getType() == AtomicBoolean.class) {
+ classLoadedField = f;
+ }
+ }
+
+ if (accessorField == null || classLoadedField == null) {
+ continue;
+ }
+
+ // Check if the accessor is already set (from transitive of earlier classes)
+ accessorField.setAccessible(true);
+ AtomicReference> ref = (AtomicReference>) accessorField.get(null);
+ if (ref.get() != null) {
+ System.out.println("OK (already loaded): " + helper.getSimpleName());
+ continue;
+ }
+
+ // Find the target class name by looking for a getXxxAccessor method that lazily
+ // resolves the accessor. We can't easily extract the string constant, so instead
+ // we call the getter and check if the accessor becomes non-null.
+ // The getter lazily triggers of the target class if needed.
+ // If calls initialize(), the accessor is registered.
+ java.lang.reflect.Method getterMethod = null;
+ for (java.lang.reflect.Method m : helper.getDeclaredMethods()) {
+ if (m.getName().startsWith("get") && m.getName().endsWith("Accessor")
+ && m.getParameterCount() == 0
+ && java.lang.reflect.Modifier.isStatic(m.getModifiers())) {
+ getterMethod = m;
+ break;
+ }
+ }
+
+ if (getterMethod == null) {
+ continue;
+ }
+
+ try {
+ Object result = getterMethod.invoke(null);
+ if (result == null) {
+ failures.add(helper.getSimpleName() + ": accessor is null after getter call — "
+ + "target class does not call initialize()");
+ } else {
+ System.out.println("OK: " + helper.getSimpleName());
+ }
+ } catch (Exception e) {
+ Throwable root = e;
+ while (root.getCause() != null) {
+ root = root.getCause();
+ }
+ failures.add(helper.getSimpleName() + ": " + root.getClass().getSimpleName()
+ + " — " + root.getMessage());
+ }
+ }
+
+ if (failures.isEmpty()) {
+ System.out.println("All accessor classes register their accessor during .");
+ System.exit(0);
+ } else {
+ System.err.println("FAILURES — the following classes do not register their accessor "
+ + "during (missing 'static { initialize(); }' block):");
+ for (String f : failures) {
+ System.err.println(" " + f);
+ }
+ System.exit(1);
+ }
+ }
+ }
}
diff --git a/sdk/cosmos/azure-cosmos/CHANGELOG.md b/sdk/cosmos/azure-cosmos/CHANGELOG.md
index 818e49226a40..168cd7e6d1a6 100644
--- a/sdk/cosmos/azure-cosmos/CHANGELOG.md
+++ b/sdk/cosmos/azure-cosmos/CHANGELOG.md
@@ -7,7 +7,8 @@
#### Breaking Changes
#### Bugs Fixed
-Fixing an NPE caused due to boxed Boolean conversion. - See [PR 48656](https://github.com/Azure/azure-sdk-for-java/pull/48656/)
+* Fixing an NPE caused due to boxed Boolean conversion. - See [PR 48656](https://github.com/Azure/azure-sdk-for-java/pull/48656/)
+* Fixed JVM `` deadlock when multiple threads concurrently trigger Cosmos SDK class loading for the first time. - See [PR 48689](https://github.com/Azure/azure-sdk-for-java/pull/48689)
#### Other Changes
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncClient.java
index ec0dd64af008..c8408efd175d 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncClient.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncClient.java
@@ -79,22 +79,14 @@
builder = CosmosClientBuilder.class,
isAsync = true)
public final class CosmosAsyncClient implements Closeable {
+ private final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor
+ queryOptionsAccessor = ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor
+ feedResponseAccessor = ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
+
private static final Logger logger = LoggerFactory.getLogger(CosmosAsyncClient.class);
private static final CosmosClientTelemetryConfig DEFAULT_TELEMETRY_CONFIG = new CosmosClientTelemetryConfig();
- private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor =
- ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
- private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor =
- ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
- private static final ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor
- telemetryConfigAccessor = ImplementationBridgeHelpers
- .CosmosClientTelemetryConfigHelper
- .getCosmosClientTelemetryConfigAccessor();
-
- private static final ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor
- readConsistencyStrategyAccessor = ImplementationBridgeHelpers
- .ReadConsistencyStrategyHelper
- .getReadConsistencyStrategyAccessor();
private final static Function DEFAULT_CONTAINER_FACTORY =
(originalContainer) -> originalContainer;
@@ -148,7 +140,7 @@ public final class CosmosAsyncClient implements Closeable {
this.clientTelemetryConfig = effectiveTelemetryConfig;
boolean contentResponseOnWriteEnabled = builder.isContentResponseOnWriteEnabled();
ApiType apiType = builder.apiType();
- String clientCorrelationId = telemetryConfigAccessor
+ String clientCorrelationId = ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getClientCorrelationId(effectiveTelemetryConfig);
List permissionList = new ArrayList<>();
@@ -207,15 +199,14 @@ public final class CosmosAsyncClient implements Closeable {
TagName.ClientCorrelationId.toString(),
ClientTelemetryMetrics.escape(effectiveClientCorrelationId));
- this.clientMetricRegistrySnapshot = telemetryConfigAccessor
+ this.clientMetricRegistrySnapshot = ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getClientMetricRegistry(effectiveTelemetryConfig);
- CosmosMeterOptions cpuMeterOptions = telemetryConfigAccessor
+ CosmosMeterOptions cpuMeterOptions = ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getMeterOptions(effectiveTelemetryConfig, CosmosMetricName.SYSTEM_CPU);
- CosmosMeterOptions memoryMeterOptions = telemetryConfigAccessor
+ CosmosMeterOptions memoryMeterOptions = ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getMeterOptions(effectiveTelemetryConfig, CosmosMetricName.SYSTEM_MEMORY_FREE);
-
if (clientMetricRegistrySnapshot != null) {
ClientTelemetryMetrics.add(clientMetricRegistrySnapshot, cpuMeterOptions, memoryMeterOptions);
}
@@ -224,15 +215,15 @@ public final class CosmosAsyncClient implements Closeable {
);
if (this.clientMetricRegistrySnapshot != null) {
- telemetryConfigAccessor.setClientCorrelationTag(
+ ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor().setClientCorrelationTag(
effectiveTelemetryConfig,
this.clientCorrelationTag );
- telemetryConfigAccessor.setAccountName(
+ ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor().setAccountName(
effectiveTelemetryConfig,
this.accountTagValue
);
- telemetryConfigAccessor.addDiagnosticsHandler(
+ ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor().addDiagnosticsHandler(
effectiveTelemetryConfig,
new ClientMetricsDiagnosticsHandler(this)
);
@@ -504,7 +495,6 @@ public CosmosPagedFlux readAllDatabases() {
return readAllDatabases(new CosmosQueryRequestOptions());
}
-
/**
* Query for databases.
*
@@ -677,7 +667,6 @@ private CosmosPagedFlux queryDatabasesInternal(
});
}
-
private Mono createDatabaseIfNotExistsInternal(CosmosAsyncDatabase database,
ThroughputProperties throughputProperties, Context context) {
String spanName = "createDatabaseIfNotExists." + database.getId();
@@ -765,7 +754,7 @@ ReadConsistencyStrategy getEffectiveReadConsistencyStrategy(
OperationType operationType,
ReadConsistencyStrategy desiredReadConsistencyStrategyOfOperation) {
- return readConsistencyStrategyAccessor.getEffectiveReadConsistencyStrategy(
+ return ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor().getEffectiveReadConsistencyStrategy(
resourceType,
operationType,
desiredReadConsistencyStrategyOfOperation,
@@ -780,13 +769,12 @@ CosmosDiagnosticsThresholds getEffectiveDiagnosticsThresholds(
return operationLevelThresholds;
}
-
if (this.clientTelemetryConfig == null) {
return new CosmosDiagnosticsThresholds();
}
CosmosDiagnosticsThresholds clientLevelThresholds =
- telemetryConfigAccessor.getDiagnosticsThresholds(this.clientTelemetryConfig);
+ ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor().getDiagnosticsThresholds(this.clientTelemetryConfig);
return clientLevelThresholds != null ? clientLevelThresholds : new CosmosDiagnosticsThresholds();
}
@@ -805,7 +793,7 @@ boolean isTransportLevelTracingEnabled() {
this.clientTelemetryConfig
: DEFAULT_TELEMETRY_CONFIG;
- if (telemetryConfigAccessor.isLegacyTracingEnabled(effectiveConfig)) {
+ if (ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor().isLegacyTracingEnabled(effectiveConfig)) {
return false;
}
@@ -813,7 +801,7 @@ boolean isTransportLevelTracingEnabled() {
return false;
}
- return telemetryConfigAccessor.isTransportLevelTracingEnabled(effectiveConfig);
+ return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor().isTransportLevelTracingEnabled(effectiveConfig);
}
void recordOpenConnectionsAndInitCachesCompleted(List cosmosContainerIdentities) {
@@ -859,13 +847,13 @@ public String getAccountTagValue(CosmosAsyncClient client) {
@Override
public EnumSet getMetricTagNames(CosmosAsyncClient client) {
- return telemetryConfigAccessor
+ return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getMetricTagNames(client.clientTelemetryConfig);
}
@Override
public EnumSet getMetricCategories(CosmosAsyncClient client) {
- return telemetryConfigAccessor
+ return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getMetricCategories(client.clientTelemetryConfig);
}
@@ -896,7 +884,7 @@ public String getUserAgent(CosmosAsyncClient client) {
@Override
public CosmosMeterOptions getMeterOptions(CosmosAsyncClient client, CosmosMetricName name) {
- return telemetryConfigAccessor
+ return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor()
.getMeterOptions(client.clientTelemetryConfig, name);
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncContainer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncContainer.java
index b3888f1bad3a..20e35aaf1694 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncContainer.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncContainer.java
@@ -98,29 +98,51 @@
* Provides methods for interacting with child resources (Items, Scripts, Conflicts)
*/
public class CosmosAsyncContainer {
+ private static ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor() {
+ return ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() {
+ return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosItemRequestOptionsHelper.CosmosItemRequestOptionsAccessor itemOptionsAccessor() {
+ return ImplementationBridgeHelpers.CosmosItemRequestOptionsHelper.getCosmosItemRequestOptionsAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() {
+ return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosItemResponseHelper.CosmosItemResponseBuilderAccessor itemResponseAccessor() {
+ return ImplementationBridgeHelpers.CosmosItemResponseHelper.getCosmosItemResponseBuilderAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosReadManyRequestOptionsHelper.CosmosReadManyRequestOptionsAccessor readManyOptionsAccessor() {
+ return ImplementationBridgeHelpers.CosmosReadManyRequestOptionsHelper.getCosmosReadManyRequestOptionsAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() {
+ return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosOperationDetailsHelper.CosmosOperationDetailsAccessor operationDetailsAccessor() {
+ return ImplementationBridgeHelpers.CosmosOperationDetailsHelper.getCosmosOperationDetailsAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosBulkExecutionOptionsHelper.CosmosBulkExecutionOptionsAccessor bulkExecutionOptionsAccessor() {
+ return ImplementationBridgeHelpers.CosmosBulkExecutionOptionsHelper.getCosmosBulkExecutionOptionsAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor() {
+ return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.CosmosBatchRequestOptionsAccessor batchRequestOptionsAccessor() {
+ return ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.getCosmosBatchRequestOptionsAccessor();
+ }
+
private final static Logger logger = LoggerFactory.getLogger(CosmosAsyncContainer.class);
- private static final ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor =
- ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor();
- private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor =
- ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
- private static final ImplementationBridgeHelpers.CosmosItemRequestOptionsHelper.CosmosItemRequestOptionsAccessor itemOptionsAccessor =
- ImplementationBridgeHelpers.CosmosItemRequestOptionsHelper.getCosmosItemRequestOptionsAccessor();
- private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor =
- ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
- private static final ImplementationBridgeHelpers.CosmosItemResponseHelper.CosmosItemResponseBuilderAccessor itemResponseAccessor =
- ImplementationBridgeHelpers.CosmosItemResponseHelper.getCosmosItemResponseBuilderAccessor();
- private static final ImplementationBridgeHelpers.CosmosReadManyRequestOptionsHelper.CosmosReadManyRequestOptionsAccessor readManyOptionsAccessor =
- ImplementationBridgeHelpers.CosmosReadManyRequestOptionsHelper.getCosmosReadManyRequestOptionsAccessor();
- private static final ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor =
- ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor();
- private static final ImplementationBridgeHelpers.CosmosOperationDetailsHelper.CosmosOperationDetailsAccessor operationDetailsAccessor =
- ImplementationBridgeHelpers.CosmosOperationDetailsHelper.getCosmosOperationDetailsAccessor();
- private static final ImplementationBridgeHelpers.CosmosBulkExecutionOptionsHelper.CosmosBulkExecutionOptionsAccessor bulkExecutionOptionsAccessor =
- ImplementationBridgeHelpers.CosmosBulkExecutionOptionsHelper.getCosmosBulkExecutionOptionsAccessor();
- private static final ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor =
- ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor();
- private static final ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.CosmosBatchRequestOptionsAccessor batchRequestOptionsAccessor =
- ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.getCosmosBatchRequestOptionsAccessor();
private final CosmosAsyncDatabase database;
private final String id;
@@ -414,7 +436,7 @@ private Mono> replaceItemWithTrackingId(Class itemT
.readDocument(getItemLink(itemId), requestOptions)
.map(response -> {
mergeDiagnostics(response, cosmosException);
- return itemResponseAccessor
+ return itemResponseAccessor()
.createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer());
})
.single();
@@ -428,8 +450,8 @@ private Mono> replaceItemWithTrackingId(Class itemT
})
.flatMap(readResponse -> {
if (readResponse.getStatusCode() == 200
- && itemResponseAccessor.hasTrackingId(readResponse, trackingId)) {
- return Mono.just(itemResponseAccessor.withRemappedStatusCode(
+ && itemResponseAccessor().hasTrackingId(readResponse, trackingId)) {
+ return Mono.just(itemResponseAccessor().withRemappedStatusCode(
readResponse,
200,
cosmosException.getRequestCharge(),
@@ -496,7 +518,7 @@ private Mono> createItemWithTrackingId(
return clientWrapper.readDocument(getItemLink(itemId), readRequestOptions)
.map(response -> {
mergeDiagnostics(response, cosmosException);
- return itemResponseAccessor
+ return itemResponseAccessor()
.createCosmosItemResponse(
response, itemType, readRequestOptions.getEffectiveItemSerializer());
}).single();
@@ -511,8 +533,8 @@ private Mono> createItemWithTrackingId(
})
.flatMap(readResponse -> {
if (readResponse.getStatusCode() == 200
- && itemResponseAccessor.hasTrackingId(readResponse, trackingId)) {
- return Mono.just(itemResponseAccessor.withRemappedStatusCode(
+ && itemResponseAccessor().hasTrackingId(readResponse, trackingId)) {
+ return Mono.just(itemResponseAccessor().withRemappedStatusCode(
readResponse,
201,
cosmosException.getRequestCharge(),
@@ -530,7 +552,7 @@ private boolean isContentResponseOnWriteEffectivelyEnabled(RequestOptions option
requestOptionsContentResponseEnabled = options.isContentResponseOnWriteEnabled();
}
- return clientAccessor.isEffectiveContentResponseOnWriteEnabled(
+ return clientAccessor().isEffectiveContentResponseOnWriteEnabled(
this.database.getClient(), requestOptionsContentResponseEnabled);
}
@@ -538,7 +560,7 @@ private Mono> createItemInternal(T item, CosmosItemReq
checkNotNull(options, "Argument 'options' must not be null.");
RequestOptions requestOptions =
- itemOptionsAccessor.toRequestOptions(options);
+ itemOptionsAccessor().toRequestOptions(options);
applyPolicies(OperationType.Create, ResourceType.Document, requestOptions, this.createItemSpanName);
WriteRetryPolicy nonIdempotentWriteRetryPolicy = requestOptions
.calculateAndGetEffectiveNonIdempotentRetriesEnabled(
@@ -577,30 +599,30 @@ private void applyPolicies(OperationType operationType, ResourceType resourceTyp
String spanName) {
CosmosAsyncClient client = this.database.getClient();
CosmosDiagnosticsThresholds thresholds = requestOptions != null
- ? clientAccessor.getEffectiveDiagnosticsThresholds(client, requestOptions.getDiagnosticsThresholds())
- : clientAccessor.getEffectiveDiagnosticsThresholds(client, null);
- CosmosDiagnosticsContext cosmosCtx = ctxAccessor.create(
+ ? clientAccessor().getEffectiveDiagnosticsThresholds(client, requestOptions.getDiagnosticsThresholds())
+ : clientAccessor().getEffectiveDiagnosticsThresholds(client, null);
+ CosmosDiagnosticsContext cosmosCtx = ctxAccessor().create(
spanName,
- clientAccessor.getAccountTagValue(client),
+ clientAccessor().getAccountTagValue(client),
BridgeInternal.getServiceEndpoint(client),
database.getId(),
getId(),
resourceType,
operationType,
null,
- clientAccessor.getEffectiveConsistencyLevel(client, operationType, requestOptions.getConsistencyLevel()),
- clientAccessor.getEffectiveReadConsistencyStrategy(client, resourceType, operationType, requestOptions.getReadConsistencyStrategy()),
+ clientAccessor().getEffectiveConsistencyLevel(client, operationType, requestOptions.getConsistencyLevel()),
+ clientAccessor().getEffectiveReadConsistencyStrategy(client, resourceType, operationType, requestOptions.getReadConsistencyStrategy()),
null,
thresholds,
null,
- clientAccessor.getConnectionMode(client),
- clientAccessor.getUserAgent(client),
+ clientAccessor().getConnectionMode(client),
+ clientAccessor().getUserAgent(client),
null,
null,
requestOptions);
- CosmosOperationDetails operationDetails = operationDetailsAccessor.create(requestOptions, cosmosCtx);
- clientAccessor.getOperationPolicies(client).forEach(policy -> {
+ CosmosOperationDetails operationDetails = operationDetailsAccessor().create(requestOptions, cosmosCtx);
+ clientAccessor().getOperationPolicies(client).forEach(policy -> {
try {
policy.process(operationDetails);
} catch (RuntimeException exception) {
@@ -625,7 +647,7 @@ private Mono> createItemInternalCore(
item,
requestOptions,
true)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()))
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()))
.single();
}
@@ -713,8 +735,8 @@ CosmosPagedFlux readAllItems(CosmosQueryRequestOptions options, Class
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
CosmosAsyncClient client = this.getDatabase().getClient();
CosmosQueryRequestOptions requestOptions = options != null ?
- queryOptionsAccessor.clone(options) : new CosmosQueryRequestOptions();
- CosmosQueryRequestOptionsBase> optionsImpl = queryOptionsAccessor.getImpl(requestOptions);
+ queryOptionsAccessor().clone(options) : new CosmosQueryRequestOptions();
+ CosmosQueryRequestOptionsBase> optionsImpl = queryOptionsAccessor().getImpl(requestOptions);
applyPolicies(OperationType.ReadFeed, ResourceType.Document, optionsImpl, this.readAllItemsSpanName);
QueryFeedOperationState state = new QueryFeedOperationState(
client,
@@ -723,7 +745,7 @@ CosmosPagedFlux readAllItems(CosmosQueryRequestOptions options, Class
this.getId(),
ResourceType.Document,
OperationType.ReadFeed,
- queryOptionsAccessor.getQueryNameOrDefault(requestOptions, this.readAllItemsSpanName),
+ queryOptionsAccessor().getQueryNameOrDefault(requestOptions, this.readAllItemsSpanName),
requestOptions,
pagedFluxOptions
);
@@ -838,8 +860,8 @@ public Mono openConnectionsAndInitCaches() {
@Deprecated
public Mono openConnectionsAndInitCaches(int numProactiveConnectionRegions) {
- List preferredRegions = clientAccessor.getPreferredRegions(this.database.getClient());
- boolean endpointDiscoveryEnabled = clientAccessor.isEndpointDiscoveryEnabled(this.database.getClient());
+ List preferredRegions = clientAccessor().getPreferredRegions(this.database.getClient());
+ boolean endpointDiscoveryEnabled = clientAccessor().isEndpointDiscoveryEnabled(this.database.getClient());
checkArgument(numProactiveConnectionRegions > 0, "no. of proactive connection regions should be greater than 0");
@@ -1012,13 +1034,13 @@ Function>> queryItemsInternalFu
SqlQuerySpec sqlQuerySpec, CosmosQueryRequestOptions cosmosQueryRequestOptions, Class classType, boolean isParameterized) {
CosmosAsyncClient client = this.getDatabase().getClient();
CosmosQueryRequestOptions options = cosmosQueryRequestOptions != null ?
- queryOptionsAccessor.clone(cosmosQueryRequestOptions): new CosmosQueryRequestOptions();
- CosmosQueryRequestOptionsBase> optionsImpl = queryOptionsAccessor.getImpl(options);
+ queryOptionsAccessor().clone(cosmosQueryRequestOptions): new CosmosQueryRequestOptions();
+ CosmosQueryRequestOptionsBase> optionsImpl = queryOptionsAccessor().getImpl(options);
applyPolicies(OperationType.Query, ResourceType.Document, optionsImpl, this.queryItemsSpanName);
Function>> pagedFluxOptionsFluxFunction = (pagedFluxOptions -> {
String spanName = this.queryItemsSpanName;
- ShowQueryMode showQueryMode = clientTelemetryConfigAccessor.showQueryMode(client.getClientTelemetryConfig());
+ ShowQueryMode showQueryMode = clientTelemetryConfigAccessor().showQueryMode(client.getClientTelemetryConfig());
if(ShowQueryMode.PARAMETERIZED_ONLY.equals(showQueryMode) && isParameterized) {
@@ -1035,7 +1057,7 @@ Function>> queryItemsInternalFu
this.getId(),
ResourceType.Document,
OperationType.Query,
- queryOptionsAccessor.getQueryNameOrDefault(options, spanName),
+ queryOptionsAccessor().getQueryNameOrDefault(options, spanName),
options,
pagedFluxOptions
);
@@ -1057,8 +1079,8 @@ Function>> queryItemsInternalFu
CosmosAsyncClient client = this.getDatabase().getClient();
String spanName = this.queryItemsSpanName;
CosmosQueryRequestOptions options = cosmosQueryRequestOptions != null ?
- queryOptionsAccessor.clone(cosmosQueryRequestOptions): new CosmosQueryRequestOptions();
- CosmosQueryRequestOptionsBase> optionsImpl = queryOptionsAccessor.getImpl(options);
+ queryOptionsAccessor().clone(cosmosQueryRequestOptions): new CosmosQueryRequestOptions();
+ CosmosQueryRequestOptionsBase> optionsImpl = queryOptionsAccessor().getImpl(options);
applyPolicies(OperationType.Query, ResourceType.Document, optionsImpl, spanName);
QueryFeedOperationState state = new QueryFeedOperationState(
client,
@@ -1067,7 +1089,7 @@ Function>> queryItemsInternalFu
this.getId(),
ResourceType.Document,
OperationType.Query,
- queryOptionsAccessor.getQueryNameOrDefault(options, spanName),
+ queryOptionsAccessor().getQueryNameOrDefault(options, spanName),
options,
pagedFluxOptions
);
@@ -1268,7 +1290,7 @@ public Mono executeCosmosBatch(
RequestOptions requestOptionsInternal = ModelBridgeInternal.toRequestOptions(requestOptions);
applyPolicies(OperationType.Batch, ResourceType.Document, requestOptionsInternal, this.batchSpanName);
- boolean disableRetryForThrottledBatchRequest = batchRequestOptionsAccessor.shouldDisableRetryForThrottledBatchRequest(requestOptions);
+ boolean disableRetryForThrottledBatchRequest = batchRequestOptionsAccessor().shouldDisableRetryForThrottledBatchRequest(requestOptions);
return withContext(context -> {
final BatchExecutor executor =
new BatchExecutor(
@@ -1355,8 +1377,8 @@ public Flux> executeBulkOperati
bulkOptions = new CosmosBulkExecutionOptions();
}
- CosmosBulkExecutionOptions clonedOptions = bulkExecutionOptionsAccessor.clone(bulkOptions);
- CosmosBulkExecutionOptionsImpl requestOptionsInternal = bulkExecutionOptionsAccessor.getImpl(clonedOptions);
+ CosmosBulkExecutionOptions clonedOptions = bulkExecutionOptionsAccessor().clone(bulkOptions);
+ CosmosBulkExecutionOptionsImpl requestOptionsInternal = bulkExecutionOptionsAccessor().getImpl(clonedOptions);
applyPolicies(OperationType.Batch, ResourceType.Document, requestOptionsInternal, this.bulkSpanName);
return Flux.deferContextual(context -> {
@@ -1539,10 +1561,10 @@ private Mono> readManyInternal(
CosmosQueryRequestOptions queryRequestOptions = requestOptions == null
? new CosmosQueryRequestOptions()
- : queryOptionsAccessor.clone(readManyOptionsAccessor.getImpl(requestOptions));
+ : queryOptionsAccessor().clone(readManyOptionsAccessor().getImpl(requestOptions));
queryRequestOptions.setMaxDegreeOfParallelism(-1);
queryRequestOptions.setQueryName("readMany");
- CosmosQueryRequestOptionsBase> cosmosQueryRequestOptionsImpl = queryOptionsAccessor.getImpl(queryRequestOptions);
+ CosmosQueryRequestOptionsBase> cosmosQueryRequestOptionsImpl = queryOptionsAccessor().getImpl(queryRequestOptions);
applyPolicies(OperationType.Query, ResourceType.Document, cosmosQueryRequestOptionsImpl, this.readManyItemsSpanName);
CosmosAsyncClient client = this.getDatabase().getClient();
@@ -1555,7 +1577,7 @@ private Mono> readManyInternal(
this.getId(),
ResourceType.Document,
OperationType.Query,
- queryOptionsAccessor.getQueryNameOrDefault(queryRequestOptions, this.readManyItemsSpanName),
+ queryOptionsAccessor().getQueryNameOrDefault(queryRequestOptions, this.readManyItemsSpanName),
queryRequestOptions,
fluxOptions
);
@@ -1564,7 +1586,7 @@ private Mono> readManyInternal(
.getAsyncDocumentClient(this.getDatabase())
.readMany(itemIdentityList, BridgeInternal.getLink(this), state, classType);
- RequestOptions options = queryOptionsAccessor.toRequestOptions(queryRequestOptions);
+ RequestOptions options = queryOptionsAccessor().toRequestOptions(queryRequestOptions);
return client
.getDiagnosticsProvider()
@@ -1649,7 +1671,7 @@ public CosmosPagedFlux readAllItems(
requestOptions.setPartitionKey(partitionKey);
- CosmosQueryRequestOptionsBase> cosmosQueryRequestOptionsImpl = queryOptionsAccessor.getImpl(requestOptions);
+ CosmosQueryRequestOptionsBase> cosmosQueryRequestOptionsImpl = queryOptionsAccessor().getImpl(requestOptions);
applyPolicies(OperationType.Query, ResourceType.Document, cosmosQueryRequestOptionsImpl, this.readManyItemsSpanName);
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
@@ -1661,7 +1683,7 @@ public CosmosPagedFlux readAllItems(
this.getId(),
ResourceType.Document,
OperationType.ReadFeed,
- queryOptionsAccessor.getQueryNameOrDefault(requestOptions, this.readAllItemsOfLogicalPartitionSpanName),
+ queryOptionsAccessor().getQueryNameOrDefault(requestOptions, this.readAllItemsOfLogicalPartitionSpanName),
requestOptions,
pagedFluxOptions
);
@@ -1912,7 +1934,7 @@ public Mono> deleteAllItemsByPartitionKey(PartitionKe
}
ModelBridgeInternal.setPartitionKey(options, partitionKey);
RequestOptions requestOptions =
- itemOptionsAccessor.toRequestOptions(options);
+ itemOptionsAccessor().toRequestOptions(options);
requestOptions.setEffectiveItemSerializer(this.database.getClient().getEffectiveItemSerializer(requestOptions.getEffectiveItemSerializer()));
return withContext(context -> deleteAllItemsByPartitionKeyInternal(partitionKey, requestOptions, context));
}
@@ -1998,7 +2020,7 @@ public CosmosPagedFlux readAllConflicts(CosmosQueryReq
this.getId(),
ResourceType.Conflict,
OperationType.ReadFeed,
- queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, this.readAllConflictsSpanName),
+ queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, this.readAllConflictsSpanName),
nonNullOptions,
pagedFluxOptions
);
@@ -2006,7 +2028,7 @@ public CosmosPagedFlux readAllConflicts(CosmosQueryReq
pagedFluxOptions.setFeedOperationState(state);
return database.getDocClientWrapper().readConflicts(getLink(), state)
- .map(response -> feedResponseAccessor.createFeedResponse(
+ .map(response -> feedResponseAccessor().createFeedResponse(
ModelBridgeInternal.getCosmosConflictPropertiesFromV2Results(response.getResults()),
response.getResponseHeaders(),
response.getCosmosDiagnostics()));
@@ -2054,7 +2076,7 @@ public CosmosPagedFlux queryConflicts(String query, Co
final CosmosQueryRequestOptions requestOptions = options == null ? new CosmosQueryRequestOptions() : options;
return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> {
CosmosAsyncClient client = this.getDatabase().getClient();
- String operationId = queryOptionsAccessor.getQueryNameOrDefault(requestOptions, this.queryConflictsSpanName);
+ String operationId = queryOptionsAccessor().getQueryNameOrDefault(requestOptions, this.queryConflictsSpanName);
QueryFeedOperationState state = new QueryFeedOperationState(
client,
@@ -2063,7 +2085,7 @@ public CosmosPagedFlux queryConflicts(String query, Co
this.getId(),
ResourceType.Conflict,
OperationType.Query,
- queryOptionsAccessor.getQueryNameOrDefault(requestOptions, this.queryConflictsSpanName),
+ queryOptionsAccessor().getQueryNameOrDefault(requestOptions, this.queryConflictsSpanName),
requestOptions,
pagedFluxOptions
);
@@ -2071,7 +2093,7 @@ public CosmosPagedFlux queryConflicts(String query, Co
pagedFluxOptions.setFeedOperationState(state);
return database.getDocClientWrapper().queryConflicts(getLink(), query, state)
- .map(response -> feedResponseAccessor.createFeedResponse(
+ .map(response -> feedResponseAccessor().createFeedResponse(
ModelBridgeInternal.getCosmosConflictPropertiesFromV2Results(response.getResults()),
response.getResponseHeaders(),
response.getCosmosDiagnostics()));
@@ -2157,7 +2179,7 @@ private Mono> deleteItemInternal(
Context context) {
RequestOptions requestOptions =
- itemOptionsAccessor.toRequestOptions(options);
+ itemOptionsAccessor().toRequestOptions(options);
applyPolicies(OperationType.Delete, ResourceType.Document, requestOptions, this.deleteItemSpanName);
WriteRetryPolicy nonIdempotentWriteRetryPolicy = requestOptions
.calculateAndGetEffectiveNonIdempotentRetriesEnabled(
@@ -2179,7 +2201,7 @@ private Mono> deleteItemInternalCore(
Mono> responseMono = this.getDatabase()
.getDocClientWrapper()
.deleteDocument(getItemLink(itemId), internalObjectNode, requestOptions)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(response, Object.class, CosmosItemSerializer.DEFAULT_SERIALIZER))
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(response, Object.class, CosmosItemSerializer.DEFAULT_SERIALIZER))
.single();
CosmosAsyncClient client = database.getClient();
return client
@@ -2205,7 +2227,7 @@ private Mono> deleteAllItemsByPartitionKeyInternal(
Mono> responseMono = this.getDatabase()
.getDocClientWrapper()
.deleteAllDocumentsByPartitionKey(getLink(), partitionKey, requestOptions)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(response, Object.class, CosmosItemSerializer.DEFAULT_SERIALIZER))
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(response, Object.class, CosmosItemSerializer.DEFAULT_SERIALIZER))
.single();
CosmosAsyncClient client = database.getClient();
return client
@@ -2236,7 +2258,7 @@ private Mono> replaceItemInternalCore(
return this.getDatabase()
.getDocClientWrapper()
.replaceDocument(getItemLink(itemId), item, requestOptions)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()))
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()))
.single();
}
@@ -2266,7 +2288,7 @@ private Mono> replaceItemInternal(
checkNotNull(options, "Argument 'options' must not be null.");
RequestOptions requestOptions =
- itemOptionsAccessor.toRequestOptions(options);
+ itemOptionsAccessor().toRequestOptions(options);
applyPolicies(OperationType.Replace, ResourceType.Document, requestOptions, this.replaceItemSpanName);
WriteRetryPolicy nonIdempotentWriteRetryPolicy = requestOptions
.calculateAndGetEffectiveNonIdempotentRetriesEnabled(
@@ -2309,7 +2331,7 @@ private Mono> patchItemInternal(
Context context,
Class itemType) {
- RequestOptions requestOptions = itemOptionsAccessor.toRequestOptions(options);
+ RequestOptions requestOptions = itemOptionsAccessor().toRequestOptions(options);
applyPolicies(OperationType.Patch, ResourceType.Document, requestOptions, this.patchItemSpanName);
WriteRetryPolicy nonIdempotentWriteRetryPolicy = requestOptions
@@ -2325,7 +2347,7 @@ private Mono> patchItemInternal(
Mono> responseMono = this.getDatabase()
.getDocClientWrapper()
.patchDocument(getItemLink(itemId), cosmosPatchOperations, requestOptions)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()));
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()));
CosmosAsyncClient client = database
.getClient();
@@ -2349,7 +2371,7 @@ private Mono> upsertItemInternal(T item, CosmosItemReq
@SuppressWarnings("unchecked")
Class itemType = (Class) item.getClass();
RequestOptions requestOptions =
- itemOptionsAccessor.toRequestOptions(options);
+ itemOptionsAccessor().toRequestOptions(options);
applyPolicies(OperationType.Upsert, ResourceType.Document, requestOptions, this.upsertItemSpanName);
WriteRetryPolicy nonIdempotentWriteRetryPolicy = requestOptions
@@ -2364,7 +2386,7 @@ private Mono> upsertItemInternal(T item, CosmosItemReq
.upsertDocument(this.getLink(), item,
effectiveOptions,
true)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(
response, itemType, requestOptions.getEffectiveItemSerializer()))
.single();
CosmosAsyncClient client = database
@@ -2390,12 +2412,12 @@ private Mono> readItemInternal(
CosmosItemRequestOptions options, Class itemType,
Context context) {
RequestOptions requestOptions =
- itemOptionsAccessor.toRequestOptions(options);
+ itemOptionsAccessor().toRequestOptions(options);
requestOptions.setEffectiveItemSerializer(database.getClient().getEffectiveItemSerializer(requestOptions.getEffectiveItemSerializer()));
applyPolicies(OperationType.Read, ResourceType.Document, requestOptions, this.readItemSpanName);
Mono> responseMono = this.getDatabase().getDocClientWrapper()
.readDocument(getItemLink(itemId), requestOptions)
- .map(response -> itemResponseAccessor.createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()))
+ .map(response -> itemResponseAccessor().createCosmosItemResponse(response, itemType, requestOptions.getEffectiveItemSerializer()))
.single();
CosmosAsyncClient client = database
.getClient();
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncDatabase.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncDatabase.java
index ce4de922f157..ef7bf2a113ba 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncDatabase.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncDatabase.java
@@ -44,11 +44,11 @@
* Perform read and delete databases, update database throughput, and perform operations on child resources
*/
public class CosmosAsyncDatabase {
- private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor =
- ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor
+ queryOptionsAccessor = ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor
+ feedResponseAccessor = ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
- private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor =
- ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
private final CosmosAsyncClient client;
private final String id;
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java
index 2273ea50197c..b445dcbade73 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncScripts.java
@@ -32,11 +32,11 @@
* and Triggers
*/
public class CosmosAsyncScripts {
- private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor =
- ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor
+ queryOptionsAccessor = ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor
+ feedResponseAccessor = ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
- private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor =
- ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
private final CosmosAsyncContainer container;
private final CosmosAsyncDatabase database;
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncUser.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncUser.java
index 45cf0f1ae331..cbfa1294e2a4 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncUser.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosAsyncUser.java
@@ -27,11 +27,11 @@
* The type Cosmos async user.
*/
public class CosmosAsyncUser {
- private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor =
- ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor
+ queryOptionsAccessor = ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor();
+ private final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor
+ feedResponseAccessor = ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
- private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor =
- ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
private final CosmosAsyncDatabase database;
@@ -129,7 +129,6 @@ public Mono upsertPermission(
return withContext(context -> upsertPermissionInternal(permission, requestOptions, context));
}
-
/**
* Reads all permissions.
*
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosContainerProactiveInitConfig.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosContainerProactiveInitConfig.java
index 2ac188cabc02..5416285e4af7 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosContainerProactiveInitConfig.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosContainerProactiveInitConfig.java
@@ -18,10 +18,6 @@
* Encapsulates the list of container identities and no. of proactive connection regions.
* */
public final class CosmosContainerProactiveInitConfig {
- private final static ImplementationBridgeHelpers.CosmosContainerIdentityHelper.CosmosContainerIdentityAccessor
- containerIdAccessor = ImplementationBridgeHelpers
- .CosmosContainerIdentityHelper
- .getCosmosContainerIdentityAccessor();
private final List cosmosContainerIdentities;
private final Map containerDirectConnectionMetadataMap;
private final int numProactiveConnectionRegions;
@@ -105,7 +101,7 @@ public String toString() {
.stream()
.map(ci -> String.join(
".",
- containerIdAccessor.getContainerLink(ci)))
+ ImplementationBridgeHelpers.CosmosContainerIdentityHelper.getCosmosContainerIdentityAccessor().getContainerLink(ci)))
.collect(Collectors.joining(";")),
numProactiveConnectionRegions,
aggressiveWarmupDuration);
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnosticsContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnosticsContext.java
index a5adfae71043..9846bda021ba 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnosticsContext.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosDiagnosticsContext.java
@@ -1201,4 +1201,6 @@ public Integer getTargetMaxMicroBatchSize(CosmosDiagnosticsContext ctx) {
}
});
}
+
+ static { initialize(); }
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosItemSerializer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosItemSerializer.java
index f66dff9a21c1..e36ae3c5fd03 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosItemSerializer.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosItemSerializer.java
@@ -30,6 +30,9 @@
*/
public abstract class CosmosItemSerializer {
+ // Register the accessor before any static fields that may trigger other classes'
+ // which need this accessor (e.g., DefaultCosmosItemSerializer).
+ static { initialize(); }
/**
* Gets the default Cosmos item serializer. This serializer is used by default when no custom serializer is
@@ -163,6 +166,4 @@ public ObjectMapper getItemObjectMapper(CosmosItemSerializer serializer) {
}
});
}
-
- static { initialize(); }
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosRequestContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosRequestContext.java
index f2a352b93f1b..be6538430345 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosRequestContext.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/CosmosRequestContext.java
@@ -217,4 +217,6 @@ public CosmosRequestContext create(OverridableRequestOptions requestOptions) {
}
);
}
+
+ static { initialize(); }
}
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedQueryImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedQueryImpl.java
index eb5d3110f8e1..98313130f2ad 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedQueryImpl.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedQueryImpl.java
@@ -30,13 +30,6 @@
class ChangeFeedQueryImpl {
- private final static
- ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor =
- ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor();
-
- private final static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedRequestOptionsAccessor =
- ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor();
-
private static final int INITIAL_TOP_VALUE = -1;
private final RxDocumentClientImpl client;
@@ -194,7 +187,7 @@ private Mono> executeRequestAsync(RxDocumentServiceRequest reque
if (this.operationContextAndListener == null) {
return handlePerPartitionFailoverPrerequisites(request)
.flatMap(client::readFeed)
- .map(rsp -> feedResponseAccessor.createChangeFeedResponse(rsp, this.itemSerializer, klass, rsp.getCosmosDiagnostics()));
+ .map(rsp -> ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor().createChangeFeedResponse(rsp, this.itemSerializer, klass, rsp.getCosmosDiagnostics()));
} else {
final OperationListener listener = operationContextAndListener.getOperationListener();
final OperationContext operationContext = operationContextAndListener.getOperationContext();
@@ -208,7 +201,7 @@ private Mono> executeRequestAsync(RxDocumentServiceRequest reque
.map(rsp -> {
listener.responseListener(operationContext, rsp);
- final FeedResponse feedResponse = feedResponseAccessor.createChangeFeedResponse(
+ final FeedResponse feedResponse = ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor().createChangeFeedResponse(
rsp, this.itemSerializer, klass, rsp.getCosmosDiagnostics());
Map rspHeaders = feedResponse.getResponseHeaders();
@@ -258,8 +251,8 @@ private Mono handlePerPartitionFailoverPrerequisites(R
checkNotNull(collectionRoutingMapValueHolder, "Argument 'collectionRoutingMapValueHolder' cannot be null!");
checkNotNull(collectionRoutingMapValueHolder.v, "Argument 'collectionRoutingMapValueHolder.v' cannot be null!");
- changeFeedRequestOptionsAccessor.setPartitionKeyDefinition(options, documentCollectionValueHolder.v.getPartitionKey());
- changeFeedRequestOptionsAccessor.setCollectionRid(options, documentCollectionValueHolder.v.getResourceId());
+ ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor().setPartitionKeyDefinition(options, documentCollectionValueHolder.v.getPartitionKey());
+ ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor().setCollectionRid(options, documentCollectionValueHolder.v.getResourceId());
PartitionKeyRange preResolvedPartitionKeyRangeIfAny = this.client
.setPartitionKeyRangeForChangeFeedOperationRequestForPerPartitionAutomaticFailover(
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java
index 9cd6441e4888..d546dea8fd6e 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ConnectionPolicy.java
@@ -24,13 +24,13 @@
* Represents the Connection policy associated with a Cosmos client in the Azure Cosmos DB service.
*/
public final class ConnectionPolicy {
+ private final ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor
+ httpCfgAccessor = ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor();
+
private static final int defaultGatewayMaxConnectionPoolSize = GatewayConnectionConfig.getDefaultConfig()
.getMaxConnectionPoolSize();
- private static final ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor =
- ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor();
-
private ConnectionMode connectionMode;
private boolean endpointDiscoveryEnabled;
private boolean multipleWriteRegionsEnabled;
@@ -157,7 +157,6 @@ public ConnectionPolicy setTcpConnectionEndpointRediscoveryEnabled(boolean tcpCo
return this;
}
-
/**
* Gets the default connection policy.
*
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsBase.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsBase.java
index ec9168a3a36f..91aefb3a6951 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsBase.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsBase.java
@@ -29,9 +29,6 @@
* in the Azure Cosmos DB database service.
*/
public abstract class CosmosQueryRequestOptionsBase> implements OverridableRequestOptions {
- private final static ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.CosmosDiagnosticsThresholdsAccessor thresholdsAccessor =
- ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.getCosmosAsyncClientAccessor();
-
private ConsistencyLevel consistencyLevel;
private ReadConsistencyStrategy readConsistencyStrategy;
private String sessionToken;
@@ -373,7 +370,9 @@ public Duration getThresholdForDiagnosticsOnTracer() {
return CosmosDiagnosticsThresholds.DEFAULT_NON_POINT_OPERATION_LATENCY_THRESHOLD;
}
- return thresholdsAccessor.getNonPointReadLatencyThreshold(this.thresholds);
+ return ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper
+ .getCosmosDiagnosticsThresholdsAccessor()
+ .getNonPointReadLatencyThreshold(this.thresholds);
}
/**
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsImpl.java
index 9c51cf958137..ef1542701f5c 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsImpl.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/CosmosQueryRequestOptionsImpl.java
@@ -13,8 +13,6 @@
import java.util.List;
public final class CosmosQueryRequestOptionsImpl extends CosmosQueryRequestOptionsBase {
- private final static ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.CosmosDiagnosticsThresholdsAccessor thresholdsAccessor =
- ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.getCosmosAsyncClientAccessor();
private String partitionKeyRangeId;
private Boolean scanInQueryEnabled;
private Boolean emitVerboseTracesInQuery;
diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DiagnosticsProvider.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DiagnosticsProvider.java
index 989d5ec4aa6c..a36e65f62098 100644
--- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DiagnosticsProvider.java
+++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DiagnosticsProvider.java
@@ -74,17 +74,18 @@
import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull;
public final class DiagnosticsProvider {
- private static final ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor =
- ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor();
- private static final ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor =
- ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor();
- private static final ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor =
- ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor();
- private static final
- ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor =
- ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor();
- private static final ImplementationBridgeHelpers.CosmosBatchResponseHelper.CosmosBatchResponseAccessor cosmosBatchResponseAccessor
- = ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor();
+ private static ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor() {
+ return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() {
+ return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor();
+ }
+
+ private static ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor() {
+ return ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor();
+ }
+
private static final Logger LOGGER = LoggerFactory.getLogger(DiagnosticsProvider.class);
private static final ObjectMapper mapper = new ObjectMapper();
@@ -115,7 +116,6 @@ public final class DiagnosticsProvider {
final Supplier samplingRateSnapshotSupplier;
-
public DiagnosticsProvider(
CosmosClientTelemetryConfig clientTelemetryConfig,
String clientId,
@@ -130,12 +130,12 @@ public DiagnosticsProvider(
this.telemetryConfig = clientTelemetryConfig;
this.samplingRateSnapshotSupplier = () -> isEnabled()
- ? clientTelemetryConfigAccessor.getSamplingRate(this.telemetryConfig)
+ ? clientTelemetryConfigAccessor().getSamplingRate(this.telemetryConfig)
: 0;
this.diagnosticHandlers = new ArrayList<>(
- clientTelemetryConfigAccessor.getDiagnosticHandlers(clientTelemetryConfig));
- Tracer tracerCandidate = clientTelemetryConfigAccessor.getOrCreateTracer(clientTelemetryConfig);
+ clientTelemetryConfigAccessor().getDiagnosticHandlers(clientTelemetryConfig));
+ Tracer tracerCandidate = clientTelemetryConfigAccessor().getOrCreateTracer(clientTelemetryConfig);
LOGGER.debug(
"TracerCandidate: {} - {}",
@@ -154,7 +154,7 @@ public DiagnosticsProvider(
}
if (this.tracer.isEnabled()) {
- if (clientTelemetryConfigAccessor.isLegacyTracingEnabled(clientTelemetryConfig)) {
+ if (clientTelemetryConfigAccessor().isLegacyTracingEnabled(clientTelemetryConfig)) {
this.cosmosTracer = new LegacyCosmosTracer(this.tracer);
} else {
this.cosmosTracer = new OpenTelemetryCosmosTracer(
@@ -255,7 +255,7 @@ public Context startSpan(
checkNotNull(spanName, "Argument 'spanName' must not be null.");
checkNotNull(cosmosCtx, "Argument 'cosmosCtx' must not be null.");
- ctxAccessor.startOperation(cosmosCtx);
+ ctxAccessor().startOperation(cosmosCtx);
Context local = Objects
.requireNonNull(context, "'context' cannot be null.")
.addData(COSMOS_DIAGNOSTICS_CONTEXT_KEY, cosmosCtx);
@@ -330,7 +330,7 @@ private void endSpanCore(
diagnostics,
null,
context,
- ctxAccessor.isEmptyCompletion(cosmosCtx),
+ ctxAccessor().isEmptyCompletion(cosmosCtx),
isSampledOut);
break;
case ON_NEXT:
@@ -370,7 +370,7 @@ private void endSpanCore(
}
effectiveDiagnostics = exception.getDiagnostics();
if (effectiveDiagnostics != null) {
- diagnosticsAccessor.isDiagnosticsCapturedInPagedFlux(effectiveDiagnostics).set(true);
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor().isDiagnosticsCapturedInPagedFlux(effectiveDiagnostics).set(true);
}
}
}
@@ -474,7 +474,7 @@ private void recordPageCore(
Integer actualItemCount,
Double requestCharge
) {
- ctxAccessor.recordOperation(
+ ctxAccessor().recordOperation(
cosmosCtx, 200, 0, actualItemCount, requestCharge, diagnostics, null);
}
@@ -575,7 +575,7 @@ public > Mono traceEnabledCosmosResponsePublisher
checkNotNull(client, "Argument 'client' must not be null.");
- String accountName = clientAccessor.getAccountTagValue(client);
+ String accountName = clientAccessor().getAccountTagValue(client);
return publisherWithDiagnostics(
resultPublisher,
@@ -596,7 +596,7 @@ public > Mono traceEnabledCosmosResponsePublisher
(r, samplingRate) -> {
CosmosDiagnostics diagnostics = r.getDiagnostics();
if (diagnostics != null) {
- diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate);
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor().setSamplingRateSnapshot(diagnostics, samplingRate);
}
return diagnostics;
@@ -624,7 +624,7 @@ public Mono traceEnabledBatchResponsePublishe
checkNotNull(client, "Argument 'client' must not be null.");
- String accountName = clientAccessor.getAccountTagValue(client);
+ String accountName = clientAccessor().getAccountTagValue(client);
return publisherWithDiagnostics(
resultPublisher,
@@ -645,15 +645,15 @@ public Mono traceEnabledBatchResponsePublishe
(r, samplingRate) -> {
CosmosDiagnostics diagnostics = r.getDiagnostics();
if (diagnostics != null) {
- diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate);
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor().setSamplingRateSnapshot(diagnostics, samplingRate);
}
return diagnostics;
},
- cosmosBatchResponseAccessor::getOpCountPerEvaluation,
- cosmosBatchResponseAccessor::getRetriedOpCountPerEvaluation,
- cosmosBatchResponseAccessor::getGlobalOpCount,
- cosmosBatchResponseAccessor::getTargetMaxMicroBatchSize,
+ ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor()::getOpCountPerEvaluation,
+ ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor()::getRetriedOpCountPerEvaluation,
+ ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor()::getGlobalOpCount,
+ ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor()::getTargetMaxMicroBatchSize,
requestOptions,
null);
}
@@ -674,7 +674,7 @@ public Mono> traceEnabledCosmosItemResponsePublisher(
checkNotNull(requestOptions, "Argument 'requestOptions' must not be null.");
checkNotNull(client, "Argument 'client' must not be null.");
- String accountName = clientAccessor.getAccountTagValue(client);
+ String accountName = clientAccessor().getAccountTagValue(client);
return publisherWithDiagnostics(
resultPublisher,
@@ -695,7 +695,7 @@ public Mono> traceEnabledCosmosItemResponsePublisher(
(r, samplingRate) -> {
CosmosDiagnostics diagnostics = r.getDiagnostics();
if (diagnostics != null) {
- diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate);
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor().setSamplingRateSnapshot(diagnostics, samplingRate);
}
return diagnostics;
@@ -719,13 +719,13 @@ private Mono> wrapReadManyFeedResponseWithTracingIfEnabled(
final double samplingRateSnapshot = this.samplingRateSnapshotSupplier.get();
final boolean isSampledOut = this.shouldSampleOutOperation(samplingRateSnapshot);
final CosmosDiagnosticsContext ctx = state.getDiagnosticsContextSnapshot();
- ctxAccessor.setSamplingRateSnapshot(ctx, samplingRateSnapshot, isSampledOut);
+ ctxAccessor().setSamplingRateSnapshot(ctx, samplingRateSnapshot, isSampledOut);
if (ctx == null || isSampledOut) {
return publisher.map(r -> {
CosmosDiagnostics diagnostics = r.getCosmosDiagnostics();
if (diagnostics != null) {
- diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRateSnapshot);
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor().setSamplingRateSnapshot(diagnostics, samplingRateSnapshot);
}
return r;
});
@@ -740,8 +740,8 @@ private Mono> wrapReadManyFeedResponseWithTracingIfEnabled(
ctx.getAccountName(),
client,
ctx.getEffectiveConsistencyLevel(),
- ctxAccessor.getOperationType(ctx),
- ctxAccessor.getResourceType(ctx),
+ ctxAccessor().getOperationType(ctx),
+ ctxAccessor().getResourceType(ctx),
null,
itemIdentityList.size(),
(r) -> HttpConstants.StatusCodes.OK, // FeedResponse would only ever be created in success case
@@ -750,7 +750,7 @@ private Mono> wrapReadManyFeedResponseWithTracingIfEnabled(
(r, samplingRate) -> {
CosmosDiagnostics diagnostics = r.getCosmosDiagnostics();
if (diagnostics != null) {
- diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate);
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor().setSamplingRateSnapshot(diagnostics, samplingRate);
}
return diagnostics;
@@ -782,13 +782,13 @@ public static void recordFeedResponse(
response.getResults().size() : null;
if (diagnostics != null &&
- diagnosticsAccessor
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor()
.isDiagnosticsCapturedInPagedFlux(diagnostics)
.compareAndSet(false, true)) {
Double samplingRateSnapshot = samplingRateSnapshotSupplier.get();
if (samplingRateSnapshot != null && samplingRateSnapshot < 1) {
- diagnosticsAccessor
+ ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor()
.setSamplingRateSnapshot(diagnostics, samplingRateSnapshot);
}
@@ -826,7 +826,7 @@ public Mono> traceEnabledReadManyResponsePublisher(
checkNotNull(requestOptions, "Argument 'requestOptions' must not be null.");
checkNotNull(client, "Argument 'client' must not be null.");
- String accountName = clientAccessor.getAccountTagValue(client);
+ String accountName = clientAccessor().getAccountTagValue(client);
return wrapReadManyFeedResponseWithTracingIfEnabled(
client,
@@ -851,7 +851,7 @@ public Flux runUnderSpanInContext(Flux publisher) {
}
public boolean shouldSampleOutOperation(CosmosPagedFluxOptions options) {
- final double samplingRateSnapshot = clientTelemetryConfigAccessor.getSamplingRate(this.telemetryConfig);
+ final double samplingRateSnapshot = clientTelemetryConfigAccessor().getSamplingRate(this.telemetryConfig);
boolean result = shouldSampleOutOperation(samplingRateSnapshot);
options.setSamplingRateSnapshot(samplingRateSnapshot, result);
return result;
@@ -883,10 +883,10 @@ private Mono diagnosticsEnabledPublisher(
Function globalOpCountPerEvaluationPeriodFunc,
Function targetMaxMicroBatchSizeFunc) {
- final double samplingRateSnapshot = isEnabled() ? clientTelemetryConfigAccessor.getSamplingRate(this.telemetryConfig) : 0;
+ final double samplingRateSnapshot = isEnabled() ? clientTelemetryConfigAccessor().getSamplingRate(this.telemetryConfig) : 0;
final boolean isSampledOut = this.shouldSampleOutOperation(samplingRateSnapshot);
if (cosmosCtx != null) {
- ctxAccessor.setSamplingRateSnapshot(cosmosCtx, samplingRateSnapshot, isSampledOut);
+ ctxAccessor().setSamplingRateSnapshot(cosmosCtx, samplingRateSnapshot, isSampledOut);
}
Optional