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..dd9260e7d447 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,466 @@ 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 1 child JVM — totaling 5 fresh JVMs × 12 concurrent threads = 60 + * {@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); + } + } + } + + /** + * Enforces that no consuming class stores an accessor in a {@code static} field or + * {@code final} instance field assigned at declaration. Such fields are initialized + * during {@code } (for static) or eagerly during construction (for instance + * finals assigned inline), and can trigger {@code initializeAllAccessors()}, creating + * circular class-initialization lock chains that deadlock under concurrent class + * loading (JLS §12.4.2). + *

+ * The approved pattern is a {@code private static} getter method: + *

{@code
+     * private static XxxAccessor xxxAccessor() {
+     *     return ImplementationBridgeHelpers.XxxHelper.getXxxAccessor();
+     * }
+     * }
+ *

+ * Uses reflection — immune to formatting, multiline declarations, and import aliases. + */ + @Test(groups = { "unit" }) + public void noStaticOrInstanceAccessorFieldsInConsumingClasses() throws Exception { + // Step 1: Collect all Accessor interface types from ImplementationBridgeHelpers + java.util.Set> accessorTypes = new java.util.HashSet<>(); + for (Class inner : ImplementationBridgeHelpers.class.getDeclaredClasses()) { + for (Class nested : inner.getDeclaredClasses()) { + if (nested.isInterface() && nested.getSimpleName().endsWith("Accessor")) { + accessorTypes.add(nested); + } + } + } + + assertThat(accessorTypes) + .as("Should find accessor interfaces in ImplementationBridgeHelpers") + .isNotEmpty(); + + // Step 2: Classes that legitimately hold accessor AtomicReference fields + java.util.Set exemptClassNames = new java.util.HashSet<>(java.util.Arrays.asList( + "com.azure.cosmos.implementation.ImplementationBridgeHelpers", + "com.azure.cosmos.BridgeInternal", + "com.azure.cosmos.models.ModelBridgeInternal", + "com.azure.cosmos.util.UtilBridgeInternal" + )); + + // Step 3: Force-load all cosmos classes so we can scan them + // initializeAllAccessors() transitively loads the main classes + ImplementationBridgeHelpers.initializeAllAccessors(); + + // Get all classes visible via the classloader that are in com.azure.cosmos + // We use the source tree to enumerate class names, then load them + java.nio.file.Path cosmosRoot = java.nio.file.Paths.get( + System.getProperty("user.dir")) + .getParent() + .resolve("azure-cosmos") + .resolve("src") + .resolve("main") + .resolve("java"); + + assertThat(java.nio.file.Files.exists(cosmosRoot)) + .as("azure-cosmos source root must exist at: " + cosmosRoot) + .isTrue(); + + java.nio.file.Path javaRoot = cosmosRoot; + List violations = new ArrayList<>(); + + java.nio.file.Files.walk(cosmosRoot) + .filter(p -> p.toString().endsWith(".java")) + .filter(p -> !p.getFileName().toString().equals("module-info.java")) + .forEach(p -> { + // Convert file path to class name + String relative = javaRoot.relativize(p).toString(); + String className = relative + .replace(java.io.File.separatorChar, '.') + .replaceAll("\\.java$", ""); + + if (exemptClassNames.contains(className)) { + return; + } + + // Also skip inner classes of exempt classes + for (String exempt : exemptClassNames) { + if (className.startsWith(exempt + "$")) { + return; + } + } + + try { + Class cls = Class.forName(className, false, + ImplementationBridgeHelpers.class.getClassLoader()); + + for (Field field : cls.getDeclaredFields()) { + Class fieldType = field.getType(); + + // Check if this field's type is one of the Accessor interfaces + if (!accessorTypes.contains(fieldType)) { + continue; + } + + int mods = field.getModifiers(); + boolean isStatic = java.lang.reflect.Modifier.isStatic(mods); + boolean isFinal = java.lang.reflect.Modifier.isFinal(mods); + + // Dangerous: any static accessor field (runs during ) + // Also flag: final instance fields (assigned at declaration = eager init) + if (isStatic) { + violations.add(cls.getName() + "." + field.getName() + + " — static " + (isFinal ? "final " : "") + + fieldType.getSimpleName() + + " (runs during , can deadlock)"); + } else if (isFinal) { + violations.add(cls.getName() + "." + field.getName() + + " — final " + fieldType.getSimpleName() + + " (instance field assigned at declaration, " + + "prefer static getter method for consistency)"); + } + } + } catch (ClassNotFoundException | NoClassDefFoundError e) { + // Skip classes that can't be loaded (e.g., optional dependencies) + } + }); + + assertThat(violations) + .as("Found accessor fields that can trigger deadlocks or are inconsistent " + + "with the approved static getter pattern.\n" + + "Use 'private static XxxAccessor xxx() { return getXxxAccessor(); }' instead.\n" + + "Violations:\n" + String.join("\n", violations)) + .isEmpty(); + } } diff --git a/sdk/cosmos/azure-cosmos/CHANGELOG.md b/sdk/cosmos/azure-cosmos/CHANGELOG.md index 19ff1ace1e95..52bf69487d48 100644 --- a/sdk/cosmos/azure-cosmos/CHANGELOG.md +++ b/sdk/cosmos/azure-cosmos/CHANGELOG.md @@ -7,6 +7,8 @@ #### Breaking Changes #### Bugs Fixed +* 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) +* Fixed `CosmosItemSerializer.DEFAULT_SERIALIZER` returning null when `DefaultCosmosItemSerializer` class is loaded before `CosmosItemSerializer` (circular `` dependency). - 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..ad111dfdebb9 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,25 @@ builder = CosmosClientBuilder.class, isAsync = true) public final class CosmosAsyncClient implements Closeable { + private static ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor() { + return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); + } + + private static ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor() { + return ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } + + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return 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 +151,7 @@ public final class CosmosAsyncClient implements Closeable { this.clientTelemetryConfig = effectiveTelemetryConfig; boolean contentResponseOnWriteEnabled = builder.isContentResponseOnWriteEnabled(); ApiType apiType = builder.apiType(); - String clientCorrelationId = telemetryConfigAccessor + String clientCorrelationId = clientTelemetryConfigAccessor() .getClientCorrelationId(effectiveTelemetryConfig); List permissionList = new ArrayList<>(); @@ -207,15 +210,14 @@ public final class CosmosAsyncClient implements Closeable { TagName.ClientCorrelationId.toString(), ClientTelemetryMetrics.escape(effectiveClientCorrelationId)); - this.clientMetricRegistrySnapshot = telemetryConfigAccessor + this.clientMetricRegistrySnapshot = clientTelemetryConfigAccessor() .getClientMetricRegistry(effectiveTelemetryConfig); - CosmosMeterOptions cpuMeterOptions = telemetryConfigAccessor + CosmosMeterOptions cpuMeterOptions = clientTelemetryConfigAccessor() .getMeterOptions(effectiveTelemetryConfig, CosmosMetricName.SYSTEM_CPU); - CosmosMeterOptions memoryMeterOptions = telemetryConfigAccessor + CosmosMeterOptions memoryMeterOptions = clientTelemetryConfigAccessor() .getMeterOptions(effectiveTelemetryConfig, CosmosMetricName.SYSTEM_MEMORY_FREE); - if (clientMetricRegistrySnapshot != null) { ClientTelemetryMetrics.add(clientMetricRegistrySnapshot, cpuMeterOptions, memoryMeterOptions); } @@ -224,15 +226,15 @@ public final class CosmosAsyncClient implements Closeable { ); if (this.clientMetricRegistrySnapshot != null) { - telemetryConfigAccessor.setClientCorrelationTag( + clientTelemetryConfigAccessor().setClientCorrelationTag( effectiveTelemetryConfig, this.clientCorrelationTag ); - telemetryConfigAccessor.setAccountName( + clientTelemetryConfigAccessor().setAccountName( effectiveTelemetryConfig, this.accountTagValue ); - telemetryConfigAccessor.addDiagnosticsHandler( + clientTelemetryConfigAccessor().addDiagnosticsHandler( effectiveTelemetryConfig, new ClientMetricsDiagnosticsHandler(this) ); @@ -475,7 +477,7 @@ CosmosPagedFlux readAllDatabases(CosmosQueryRequestOpt null, ResourceType.Database, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -484,7 +486,7 @@ CosmosPagedFlux readAllDatabases(CosmosQueryRequestOpt return getDocClientWrapper().readDatabases(state) .map(response -> - feedResponseAccessor.createFeedResponse( + feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosDatabasePropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -504,7 +506,6 @@ public CosmosPagedFlux readAllDatabases() { return readAllDatabases(new CosmosQueryRequestOptions()); } - /** * Query for databases. *
@@ -662,7 +663,7 @@ private CosmosPagedFlux queryDatabasesInternal( null, ResourceType.Database, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -670,14 +671,13 @@ private CosmosPagedFlux queryDatabasesInternal( pagedFluxOptions.setFeedOperationState(state); return getDocClientWrapper().queryDatabases(querySpec, state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosDatabasePropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); }); } - private Mono createDatabaseIfNotExistsInternal(CosmosAsyncDatabase database, ThroughputProperties throughputProperties, Context context) { String spanName = "createDatabaseIfNotExists." + database.getId(); @@ -765,7 +765,7 @@ ReadConsistencyStrategy getEffectiveReadConsistencyStrategy( OperationType operationType, ReadConsistencyStrategy desiredReadConsistencyStrategyOfOperation) { - return readConsistencyStrategyAccessor.getEffectiveReadConsistencyStrategy( + return readConsistencyStrategyAccessor().getEffectiveReadConsistencyStrategy( resourceType, operationType, desiredReadConsistencyStrategyOfOperation, @@ -780,13 +780,12 @@ CosmosDiagnosticsThresholds getEffectiveDiagnosticsThresholds( return operationLevelThresholds; } - if (this.clientTelemetryConfig == null) { return new CosmosDiagnosticsThresholds(); } CosmosDiagnosticsThresholds clientLevelThresholds = - telemetryConfigAccessor.getDiagnosticsThresholds(this.clientTelemetryConfig); + clientTelemetryConfigAccessor().getDiagnosticsThresholds(this.clientTelemetryConfig); return clientLevelThresholds != null ? clientLevelThresholds : new CosmosDiagnosticsThresholds(); } @@ -805,7 +804,7 @@ boolean isTransportLevelTracingEnabled() { this.clientTelemetryConfig : DEFAULT_TELEMETRY_CONFIG; - if (telemetryConfigAccessor.isLegacyTracingEnabled(effectiveConfig)) { + if (clientTelemetryConfigAccessor().isLegacyTracingEnabled(effectiveConfig)) { return false; } @@ -813,7 +812,7 @@ boolean isTransportLevelTracingEnabled() { return false; } - return telemetryConfigAccessor.isTransportLevelTracingEnabled(effectiveConfig); + return clientTelemetryConfigAccessor().isTransportLevelTracingEnabled(effectiveConfig); } void recordOpenConnectionsAndInitCachesCompleted(List cosmosContainerIdentities) { @@ -859,13 +858,13 @@ public String getAccountTagValue(CosmosAsyncClient client) { @Override public EnumSet getMetricTagNames(CosmosAsyncClient client) { - return telemetryConfigAccessor + return clientTelemetryConfigAccessor() .getMetricTagNames(client.clientTelemetryConfig); } @Override public EnumSet getMetricCategories(CosmosAsyncClient client) { - return telemetryConfigAccessor + return clientTelemetryConfigAccessor() .getMetricCategories(client.clientTelemetryConfig); } @@ -896,7 +895,7 @@ public String getUserAgent(CosmosAsyncClient client) { @Override public CosmosMeterOptions getMeterOptions(CosmosAsyncClient client, CosmosMetricName name) { - return telemetryConfigAccessor + return clientTelemetryConfigAccessor() .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..ad871bb97c01 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,55 @@ * Provides methods for interacting with child resources (Items, Scripts, Conflicts) */ public class CosmosAsyncContainer { + private static ImplementationBridgeHelpers.PartitionKeyHelper.PartitionKeyAccessor partitionKeyAccessor() { + return ImplementationBridgeHelpers.PartitionKeyHelper.getPartitionKeyAccessor(); + } + + 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 +440,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 +454,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(), @@ -487,16 +513,14 @@ private Mono> createItemWithTrackingId( PartitionKeyDefinition pkDef = collection.getPartitionKey(); PartitionKeyInternal partitionKeyInternal = PartitionKeyHelper .extractPartitionKeyValueFromDocument(internalObjectNode, pkDef); - PartitionKey partitionKey = ImplementationBridgeHelpers - .PartitionKeyHelper - .getPartitionKeyAccessor() + PartitionKey partitionKey = partitionKeyAccessor() .toPartitionKey(partitionKeyInternal); readRequestOptions.setPartitionKey(partitionKey); return clientWrapper.readDocument(getItemLink(itemId), readRequestOptions) .map(response -> { mergeDiagnostics(response, cosmosException); - return itemResponseAccessor + return itemResponseAccessor() .createCosmosItemResponse( response, itemType, readRequestOptions.getEffectiveItemSerializer()); }).single(); @@ -511,8 +535,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 +554,7 @@ private boolean isContentResponseOnWriteEffectivelyEnabled(RequestOptions option requestOptionsContentResponseEnabled = options.isContentResponseOnWriteEnabled(); } - return clientAccessor.isEffectiveContentResponseOnWriteEnabled( + return clientAccessor().isEffectiveContentResponseOnWriteEnabled( this.database.getClient(), requestOptionsContentResponseEnabled); } @@ -538,7 +562,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 +601,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 +649,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 +737,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 +747,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 +862,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 +1036,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 +1059,7 @@ Function>> queryItemsInternalFu this.getId(), ResourceType.Document, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(options, spanName), + queryOptionsAccessor().getQueryNameOrDefault(options, spanName), options, pagedFluxOptions ); @@ -1057,8 +1081,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 +1091,7 @@ Function>> queryItemsInternalFu this.getId(), ResourceType.Document, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(options, spanName), + queryOptionsAccessor().getQueryNameOrDefault(options, spanName), options, pagedFluxOptions ); @@ -1268,7 +1292,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 +1379,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 +1563,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 +1579,7 @@ private Mono> readManyInternal( this.getId(), ResourceType.Document, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(queryRequestOptions, this.readManyItemsSpanName), + queryOptionsAccessor().getQueryNameOrDefault(queryRequestOptions, this.readManyItemsSpanName), queryRequestOptions, fluxOptions ); @@ -1564,7 +1588,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 +1673,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 +1685,7 @@ public CosmosPagedFlux readAllItems( this.getId(), ResourceType.Document, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(requestOptions, this.readAllItemsOfLogicalPartitionSpanName), + queryOptionsAccessor().getQueryNameOrDefault(requestOptions, this.readAllItemsOfLogicalPartitionSpanName), requestOptions, pagedFluxOptions ); @@ -1912,7 +1936,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 +2022,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 +2030,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 +2078,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 +2087,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 +2095,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 +2181,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 +2203,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 +2229,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 +2260,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 +2290,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 +2333,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 +2349,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 +2373,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 +2388,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 +2414,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..aeecab59d61b 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,13 @@ * 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 static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } private final CosmosAsyncClient client; private final String id; @@ -636,9 +638,7 @@ public CosmosPagedFlux readAllContainers(CosmosQueryR return UtilBridgeInternal.createCosmosPagedFlux(pagedFluxOptions -> { String spanName = "readAllContainers." + this.getId(); CosmosAsyncClient client = this.getClient(); - String operationId = ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + String operationId = queryOptionsAccessor() .getQueryNameOrDefault(requestOptions, spanName); QueryFeedOperationState state = new QueryFeedOperationState( @@ -648,7 +648,7 @@ public CosmosPagedFlux readAllContainers(CosmosQueryR null, ResourceType.DocumentCollection, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(requestOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(requestOptions, spanName), requestOptions, pagedFluxOptions ); @@ -656,7 +656,7 @@ public CosmosPagedFlux readAllContainers(CosmosQueryR pagedFluxOptions.setFeedOperationState(state); return getDocClientWrapper().readCollections(getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosContainerPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -956,7 +956,7 @@ CosmosPagedFlux readAllUsers(CosmosQueryRequestOptions opt null, ResourceType.User, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -964,7 +964,7 @@ CosmosPagedFlux readAllUsers(CosmosQueryRequestOptions opt pagedFluxOptions.setFeedOperationState(state); return getDocClientWrapper().readUsers(getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosUserPropertiesFromV2Results(response.getResults()), response .getResponseHeaders(), response.getCosmosDiagnostics())); @@ -1019,7 +1019,7 @@ public CosmosPagedFlux readAllClientEncrypt null, ResourceType.ClientEncryptionKey, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -1027,7 +1027,7 @@ public CosmosPagedFlux readAllClientEncrypt pagedFluxOptions.setFeedOperationState(state); return getDocClientWrapper().readClientEncryptionKeys(getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getClientEncryptionKeyPropertiesList(response.getResults()), response .getResponseHeaders(), response.getCosmosDiagnostics())); @@ -1120,7 +1120,7 @@ private CosmosPagedFlux queryClientEncrypti null, ResourceType.ClientEncryptionKey, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -1304,7 +1304,7 @@ private CosmosPagedFlux queryContainersInternal(SqlQu null, ResourceType.DocumentCollection, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -1312,7 +1312,7 @@ private CosmosPagedFlux queryContainersInternal(SqlQu pagedFluxOptions.setFeedOperationState(state); return getDocClientWrapper().queryCollections(getLink(), querySpec, state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosContainerPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -1332,7 +1332,7 @@ private CosmosPagedFlux queryUsersInternal(SqlQuerySpec qu null, ResourceType.User, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -1590,9 +1590,7 @@ private Mono readThroughputInternal(Context context) { null, OperationType.Read, ResourceType.Offer, - ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + queryOptionsAccessor() .toRequestOptions(qryOptions)); } 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..178fcd184e55 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,13 @@ * and Triggers */ public class CosmosAsyncScripts { - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } private final CosmosAsyncContainer container; private final CosmosAsyncDatabase database; @@ -129,7 +131,7 @@ CosmosPagedFlux readAllStoredProcedures(CosmosQ this.container.getId(), ResourceType.StoredProcedure, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -138,7 +140,7 @@ CosmosPagedFlux readAllStoredProcedures(CosmosQ return database.getDocClientWrapper() .readStoredProcedures(container.getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosStoredProcedurePropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -262,7 +264,7 @@ CosmosPagedFlux readAllUserDefinedFunctions this.container.getId(), ResourceType.UserDefinedFunction, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -271,7 +273,7 @@ CosmosPagedFlux readAllUserDefinedFunctions return database.getDocClientWrapper() .readUserDefinedFunctions(container.getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosUserDefinedFunctionPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -394,7 +396,7 @@ CosmosPagedFlux readAllTriggers(CosmosQueryRequestOptio this.container.getId(), ResourceType.Trigger, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -403,7 +405,7 @@ CosmosPagedFlux readAllTriggers(CosmosQueryRequestOptio return database.getDocClientWrapper() .readTriggers(container.getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosTriggerPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -477,7 +479,7 @@ private CosmosPagedFlux queryStoredProceduresIn this.container.getId(), ResourceType.StoredProcedure, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -486,7 +488,7 @@ private CosmosPagedFlux queryStoredProceduresIn return database.getDocClientWrapper() .queryStoredProcedures(container.getLink(), querySpec, state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosStoredProcedurePropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -508,7 +510,7 @@ private CosmosPagedFlux queryUserDefinedFun this.container.getId(), ResourceType.UserDefinedFunction, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -517,7 +519,7 @@ private CosmosPagedFlux queryUserDefinedFun return database.getDocClientWrapper() .queryUserDefinedFunctions(container.getLink(), querySpec, state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosUserDefinedFunctionPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -546,7 +548,7 @@ private CosmosPagedFlux queryTriggersInternal( this.container.getId(), ResourceType.Trigger, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -555,7 +557,7 @@ private CosmosPagedFlux queryTriggersInternal( return database.getDocClientWrapper() .queryTriggers(container.getLink(), querySpec, state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosTriggerPropertiesFromV2Results(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); 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..1efe0215dd2f 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,13 @@ * The type Cosmos async user. */ public class CosmosAsyncUser { - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } private final CosmosAsyncDatabase database; @@ -129,7 +131,6 @@ public Mono upsertPermission( return withContext(context -> upsertPermissionInternal(permission, requestOptions, context)); } - /** * Reads all permissions. *

@@ -168,7 +169,7 @@ CosmosPagedFlux readAllPermissions(CosmosQueryReques null, ResourceType.Permission, OperationType.ReadFeed, - queryOptionsAccessor.getQueryNameOrDefault(nonNullOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(nonNullOptions, spanName), nonNullOptions, pagedFluxOptions ); @@ -177,7 +178,7 @@ CosmosPagedFlux readAllPermissions(CosmosQueryReques return getDatabase().getDocClientWrapper() .readPermissions(getLink(), state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosPermissionPropertiesFromResults(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); @@ -224,7 +225,7 @@ public CosmosPagedFlux queryPermissions(String query null, ResourceType.Permission, OperationType.Query, - queryOptionsAccessor.getQueryNameOrDefault(requestOptions, spanName), + queryOptionsAccessor().getQueryNameOrDefault(requestOptions, spanName), requestOptions, pagedFluxOptions ); @@ -233,7 +234,7 @@ public CosmosPagedFlux queryPermissions(String query return getDatabase().getDocClientWrapper() .queryPermissions(getLink(), query, state) - .map(response -> feedResponseAccessor.createFeedResponse( + .map(response -> feedResponseAccessor().createFeedResponse( ModelBridgeInternal.getCosmosPermissionPropertiesFromResults(response.getResults()), response.getResponseHeaders(), response.getCosmosDiagnostics())); 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..04cb2bbe0604 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,10 @@ * 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 static ImplementationBridgeHelpers.CosmosContainerIdentityHelper.CosmosContainerIdentityAccessor containerIdentityAccessor() { + return ImplementationBridgeHelpers.CosmosContainerIdentityHelper.getCosmosContainerIdentityAccessor(); + } + private final List cosmosContainerIdentities; private final Map containerDirectConnectionMetadataMap; private final int numProactiveConnectionRegions; @@ -105,7 +105,7 @@ public String toString() { .stream() .map(ci -> String.join( ".", - containerIdAccessor.getContainerLink(ci))) + containerIdentityAccessor().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..dc626b41f08e 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 @@ -43,8 +43,9 @@ * by diagnostic handlers */ public final class CosmosDiagnosticsContext { - private final static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } private final static ObjectMapper mapper = Utils.getSimpleObjectMapper(); @@ -336,17 +337,17 @@ void addDiagnostics(CosmosDiagnostics cosmosDiagnostics) { } if (cosmosDiagnostics.getFeedResponseDiagnostics() != null && - !diagAccessor.isDiagnosticsCapturedInPagedFlux(cosmosDiagnostics).get()) { + !diagAccessor().isDiagnosticsCapturedInPagedFlux(cosmosDiagnostics).get()) { return; } synchronized (this.contextId) { if (this.samplingRateSnapshot != null) { - diagAccessor.setSamplingRateSnapshot(cosmosDiagnostics, this.samplingRateSnapshot); + diagAccessor().setSamplingRateSnapshot(cosmosDiagnostics, this.samplingRateSnapshot); } - this.addRequestSize(diagAccessor.getRequestPayloadSizeInBytes(cosmosDiagnostics)); - this.addResponseSize(diagAccessor.getTotalResponsePayloadSizeInBytes(cosmosDiagnostics)); + this.addRequestSize(diagAccessor().getRequestPayloadSizeInBytes(cosmosDiagnostics)); + this.addResponseSize(diagAccessor().getTotalResponsePayloadSizeInBytes(cosmosDiagnostics)); this.diagnostics.add(cosmosDiagnostics); this.cachedRequestDiagnostics = null; this.requestInfo = null; @@ -617,7 +618,7 @@ void setSamplingRateSnapshot(double samplingRate, boolean isSampledOut) { this.samplingRateSnapshot = samplingRate; this.isSampledOut = isSampledOut; for (CosmosDiagnostics d : this.diagnostics) { - diagAccessor.setSamplingRateSnapshot(d, samplingRate); + diagAccessor().setSamplingRateSnapshot(d, samplingRate); } } } @@ -992,12 +993,8 @@ void setRequestOptions( // the following helper/accessor only helps to access this class outside of this package.// /////////////////////////////////////////////////////////////////////////////////////////// static void initialize() { - ImplementationBridgeHelpers - .CosmosDiagnosticsContextHelper - .setCosmosDiagnosticsContextAccessor( - new ImplementationBridgeHelpers - .CosmosDiagnosticsContextHelper - .CosmosDiagnosticsContextAccessor() { + ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.setCosmosDiagnosticsContextAccessor( + new ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor() { @Override public CosmosDiagnosticsContext create(String spanName, String account, String endpoint, @@ -1201,4 +1198,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..a81ed9fa15e2 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,12 +30,21 @@ */ public abstract class CosmosItemSerializer { + static { initialize(); } /** * Gets the default Cosmos item serializer. This serializer is used by default when no custom serializer is * specified on request options or the {@link CosmosClientBuilder} */ - public final static CosmosItemSerializer DEFAULT_SERIALIZER = DefaultCosmosItemSerializer.DEFAULT_SERIALIZER; + public final static CosmosItemSerializer DEFAULT_SERIALIZER = + new DefaultCosmosItemSerializer(Utils.getDocumentObjectMapper(Configs.getItemSerializationInclusionMode())); + + // Moved from DefaultCosmosItemSerializer to eliminate concurrent deadlock + // between parent (CosmosItemSerializer) and child (DefaultCosmosItemSerializer). + // Guaranteed to use serialization inclusion mode "Always". + // Accessed via CosmosItemSerializerAccessor.getInternalDefaultSerializer(). + private static final CosmosItemSerializer INTERNAL_DEFAULT_SERIALIZER = + new DefaultCosmosItemSerializer(Utils.getSimpleObjectMapper()); private boolean shouldWrapSerializationExceptions; @@ -161,8 +170,11 @@ public void setItemObjectMapper(CosmosItemSerializer serializer, ObjectMapper ma public ObjectMapper getItemObjectMapper(CosmosItemSerializer serializer) { return serializer.getItemObjectMapper(); } + + @Override + public CosmosItemSerializer getInternalDefaultSerializer() { + return INTERNAL_DEFAULT_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/ChangeFeedOperationState.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedOperationState.java index 4bd2fa771480..e7be63f03d2d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedOperationState.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ChangeFeedOperationState.java @@ -10,11 +10,10 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; public class ChangeFeedOperationState extends FeedOperationState { - private static final ImplementationBridgeHelpers - .CosmosChangeFeedRequestOptionsHelper - .CosmosChangeFeedRequestOptionsAccessor cfOptAccessor = ImplementationBridgeHelpers - .CosmosChangeFeedRequestOptionsHelper - .getCosmosChangeFeedRequestOptionsAccessor(); + + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } private final CosmosChangeFeedRequestOptions options; @@ -37,17 +36,17 @@ public ChangeFeedOperationState( resourceType, checkNotNull(operationType, "Argument 'operationType' must not be null."), operationId, - clientAccessor.getEffectiveConsistencyLevel( + clientAccessor().getEffectiveConsistencyLevel( cosmosAsyncClient, operationType, null), - clientAccessor.getEffectiveDiagnosticsThresholds( + clientAccessor().getEffectiveDiagnosticsThresholds( cosmosAsyncClient, - cfOptAccessor.getDiagnosticsThresholds( + changeFeedOptionsAccessor().getDiagnosticsThresholds( checkNotNull(changeFeedRequestOptions, "Argument 'changeFeedRequestOptions' must not be null."))), fluxOptions, getEffectiveMaxItemCount(fluxOptions, changeFeedRequestOptions), - cfOptAccessor.getImpl(checkNotNull(changeFeedRequestOptions, "Argument 'changeFeedRequestOptions' must not be null.")) + changeFeedOptionsAccessor().getImpl(checkNotNull(changeFeedRequestOptions, "Argument 'changeFeedRequestOptions' must not be null.")) ); this.options = ModelBridgeInternal 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..c8bca12fcbf4 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,12 +30,13 @@ class ChangeFeedQueryImpl { - private final static - ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } - private final static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedRequestOptionsAccessor = - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } private static final int INITIAL_TOP_VALUE = -1; @@ -89,9 +90,7 @@ public ChangeFeedQueryImpl( this.documentsLink = Utils.joinPath(collectionLink, Paths.DOCUMENTS_PATH_SEGMENT); this.options = requestOptions; this.itemSerializer = client.getEffectiveItemSerializer(requestOptions.getCustomItemSerializer()); - this.operationContextAndListener = ImplementationBridgeHelpers - .CosmosChangeFeedRequestOptionsHelper - .getCosmosChangeFeedRequestOptionsAccessor() + this.operationContextAndListener = changeFeedOptionsAccessor() .getOperationContext(options); this.diagnosticsClientContext = diagnosticsClientContext; @@ -122,13 +121,9 @@ public Flux> executeAsync() { this.options.getMaxPrefetchPageCount(), ModelBridgeInternal.getChangeFeedIsSplitHandlingDisabled(this.options), this.options.isCompleteAfterAllCurrentChangesRetrieved(), - ImplementationBridgeHelpers - .CosmosChangeFeedRequestOptionsHelper - .getCosmosChangeFeedRequestOptionsAccessor() + changeFeedOptionsAccessor() .getEndLSN(this.options), - ImplementationBridgeHelpers - .CosmosChangeFeedRequestOptionsHelper - .getCosmosChangeFeedRequestOptionsAccessor() + changeFeedOptionsAccessor() .getOperationContext(this.options), this.diagnosticsClientContext ); @@ -138,7 +133,7 @@ private RxDocumentServiceRequest createDocumentServiceRequest() { Map headers = new HashMap<>(); Map customOptions = - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor().getHeaders(this.options); + changeFeedOptionsAccessor().getHeaders(this.options); if (customOptions != null) { headers.putAll(customOptions); } @@ -194,7 +189,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 -> feedResponseAccessor().createChangeFeedResponse(rsp, this.itemSerializer, klass, rsp.getCosmosDiagnostics())); } else { final OperationListener listener = operationContextAndListener.getOperationListener(); final OperationContext operationContext = operationContextAndListener.getOperationContext(); @@ -208,7 +203,7 @@ private Mono> executeRequestAsync(RxDocumentServiceRequest reque .map(rsp -> { listener.responseListener(operationContext, rsp); - final FeedResponse feedResponse = feedResponseAccessor.createChangeFeedResponse( + final FeedResponse feedResponse = feedResponseAccessor().createChangeFeedResponse( rsp, this.itemSerializer, klass, rsp.getCosmosDiagnostics()); Map rspHeaders = feedResponse.getResponseHeaders(); @@ -258,8 +253,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()); + changeFeedOptionsAccessor().setPartitionKeyDefinition(options, documentCollectionValueHolder.v.getPartitionKey()); + changeFeedOptionsAccessor().setCollectionRid(options, documentCollectionValueHolder.v.getResourceId()); PartitionKeyRange preResolvedPartitionKeyRangeIfAny = this.client .setPartitionKeyRangeForChangeFeedOperationRequestForPerPartitionAutomaticFailover( diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java index 2d1856fcf8ed..aa1f7974848b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ClientSideRequestStatistics.java @@ -38,6 +38,10 @@ @JsonSerialize(using = ClientSideRequestStatistics.ClientSideRequestStatisticsSerializer.class) public class ClientSideRequestStatistics { + private static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + } + private static final int MAX_SUPPLEMENTAL_REQUESTS_FOR_TO_STRING = 10; private final DiagnosticsClientContext.DiagnosticsClientConfig diagnosticsClientConfig; private String activityId; @@ -1163,15 +1167,12 @@ public static CosmosDiagnosticsSystemUsageSnapshot fetchSystemInformation() { long freeMemory = runtime.freeMemory() / 1024; long maxMemory = runtime.maxMemory() / 1024; - // TODO: other system related info also can be captured using a similar approach String systemCpu = CpuMemoryMonitor .getCpuLoad() .toString(); - return ImplementationBridgeHelpers - .CosmosDiagnosticsContextHelper - .getCosmosDiagnosticsContextAccessor() + return ctxAccessor() .createSystemUsageSnapshot( systemCpu, totalMemory - freeMemory + " KB", 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..b93171e3bdcd 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,17 @@ * Represents the Connection policy associated with a Cosmos client in the Azure Cosmos DB service. */ public final class ConnectionPolicy { + private static ImplementationBridgeHelpers.DirectConnectionConfigHelper.DirectConnectionConfigAccessor directConnectionConfigAccessor() { + return ImplementationBridgeHelpers.DirectConnectionConfigHelper.getDirectConnectionConfigAccessor(); + } + + private static ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor() { + return 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; @@ -93,31 +97,23 @@ private ConnectionPolicy( this.maxRequestsPerConnection = directConnectionConfig.getMaxRequestsPerConnection(); this.tcpNetworkRequestTimeout = directConnectionConfig.getNetworkRequestTimeout(); this.tcpConnectionEndpointRediscoveryEnabled = directConnectionConfig.isConnectionEndpointRediscoveryEnabled(); - this.ioThreadCountPerCoreFactor = ImplementationBridgeHelpers - .DirectConnectionConfigHelper - .getDirectConnectionConfigAccessor() + this.ioThreadCountPerCoreFactor = directConnectionConfigAccessor() .getIoThreadCountPerCoreFactor(directConnectionConfig); - this.ioThreadPriority = ImplementationBridgeHelpers - .DirectConnectionConfigHelper - .getDirectConnectionConfigAccessor() + this.ioThreadPriority = directConnectionConfigAccessor() .getIoThreadPriority(directConnectionConfig); this.idleHttpConnectionTimeout = gatewayConnectionConfig.getIdleConnectionTimeout(); this.maxConnectionPoolSize = gatewayConnectionConfig.getMaxConnectionPoolSize(); this.httpNetworkRequestTimeout = BridgeInternal.getNetworkRequestTimeoutFromGatewayConnectionConfig(gatewayConnectionConfig); this.proxy = gatewayConnectionConfig.getProxy(); this.tcpHealthCheckTimeoutDetectionEnabled = - ImplementationBridgeHelpers - .DirectConnectionConfigHelper - .getDirectConnectionConfigAccessor() + directConnectionConfigAccessor() .isHealthCheckTimeoutDetectionEnabled(directConnectionConfig); this.http2ConnectionConfig = gatewayConnectionConfig.getHttp2ConnectionConfig(); // NOTE: should be compared with COSMOS.MIN_CONNECTION_POOL_SIZE_PER_ENDPOINT // read during client initialization before connections are created for the container this.minConnectionPoolSizePerEndpoint = - Math.max(ImplementationBridgeHelpers - .DirectConnectionConfigHelper - .getDirectConnectionConfigAccessor() + Math.max(directConnectionConfigAccessor() .getMinConnectionPoolSizePerEndpoint(directConnectionConfig), Configs.getMinConnectionPoolSizePerEndpoint()); this.pendingAcquireMaxCount = Configs.getPendingAcquireMaxCount(); @@ -157,7 +153,6 @@ public ConnectionPolicy setTcpConnectionEndpointRediscoveryEnabled(boolean tcpCo return this; } - /** * Gets the default connection policy. * @@ -699,7 +694,7 @@ public String toString() { ", minConnectionPoolSizePerEndpoint=" + minConnectionPoolSizePerEndpoint + ", openConnectionsConcurrency=" + openConnectionsConcurrency + ", aggressiveWarmupConcurrency=" + aggressiveWarmupConcurrency + - ", http2ConnectionConfig=" + httpCfgAccessor.toDiagnosticsString(this.http2ConnectionConfig) + + ", http2ConnectionConfig=" + httpCfgAccessor().toDiagnosticsString(this.http2ConnectionConfig) + ", pendingAcquireMaxCount=" + Objects.toString(this.pendingAcquireMaxCount,"DEFAULT") + '}'; } 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/DefaultCosmosItemSerializer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DefaultCosmosItemSerializer.java index 3c974ba7fdd2..566c3e7167eb 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DefaultCosmosItemSerializer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/DefaultCosmosItemSerializer.java @@ -12,25 +12,9 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; public class DefaultCosmosItemSerializer extends CosmosItemSerializer { - ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor = - ImplementationBridgeHelpers - .CosmosItemSerializerHelper - .getCosmosItemSerializerAccessor(); - private final static ObjectMapper serializationInclusionModeAwareObjectMapper = Utils.getDocumentObjectMapper( - Configs.getItemSerializationInclusionMode() - ); - private final static ObjectMapper defaultSerializationInclusionModeObjectMapper = Utils.getSimpleObjectMapper(); - - /** - * Gets the default Cosmos item serializer. This serializer is used by default when no custom serializer is - * specified on request options or the {@link CosmosClientBuilder} - */ - public final static CosmosItemSerializer DEFAULT_SERIALIZER = - new DefaultCosmosItemSerializer(serializationInclusionModeAwareObjectMapper); - - // guaranteed to sue serialization inclusion mode "Always" - public final static CosmosItemSerializer INTERNAL_DEFAULT_SERIALIZER = - new DefaultCosmosItemSerializer(defaultSerializationInclusionModeObjectMapper); + private static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + } private final ObjectMapper mapper; @@ -38,8 +22,8 @@ public DefaultCosmosItemSerializer(ObjectMapper mapper) { checkNotNull("mapper", "Argument 'mapper' must not be null."); this.mapper = mapper; - itemSerializerAccessor.setItemObjectMapper(this, mapper); - itemSerializerAccessor.setShouldWrapSerializationExceptions(this, false); + itemSerializerAccessor().setItemObjectMapper(this, mapper); + itemSerializerAccessor().setShouldWrapSerializationExceptions(this, false); } /** 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..95a2d0f7fb33 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,25 @@ 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.CosmosBatchResponseHelper.CosmosBatchResponseAccessor batchResponseAccessor() { + return ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } + + 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 +123,6 @@ public final class DiagnosticsProvider { final Supplier samplingRateSnapshotSupplier; - public DiagnosticsProvider( CosmosClientTelemetryConfig clientTelemetryConfig, String clientId, @@ -130,12 +137,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 +161,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 +262,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 +337,7 @@ private void endSpanCore( diagnostics, null, context, - ctxAccessor.isEmptyCompletion(cosmosCtx), + ctxAccessor().isEmptyCompletion(cosmosCtx), isSampledOut); break; case ON_NEXT: @@ -370,7 +377,7 @@ private void endSpanCore( } effectiveDiagnostics = exception.getDiagnostics(); if (effectiveDiagnostics != null) { - diagnosticsAccessor.isDiagnosticsCapturedInPagedFlux(effectiveDiagnostics).set(true); + diagAccessor().isDiagnosticsCapturedInPagedFlux(effectiveDiagnostics).set(true); } } } @@ -474,7 +481,7 @@ private void recordPageCore( Integer actualItemCount, Double requestCharge ) { - ctxAccessor.recordOperation( + ctxAccessor().recordOperation( cosmosCtx, 200, 0, actualItemCount, requestCharge, diagnostics, null); } @@ -575,7 +582,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 +603,7 @@ public > Mono traceEnabledCosmosResponsePublisher (r, samplingRate) -> { CosmosDiagnostics diagnostics = r.getDiagnostics(); if (diagnostics != null) { - diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate); + diagAccessor().setSamplingRateSnapshot(diagnostics, samplingRate); } return diagnostics; @@ -624,7 +631,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 +652,15 @@ public Mono traceEnabledBatchResponsePublishe (r, samplingRate) -> { CosmosDiagnostics diagnostics = r.getDiagnostics(); if (diagnostics != null) { - diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate); + diagAccessor().setSamplingRateSnapshot(diagnostics, samplingRate); } return diagnostics; }, - cosmosBatchResponseAccessor::getOpCountPerEvaluation, - cosmosBatchResponseAccessor::getRetriedOpCountPerEvaluation, - cosmosBatchResponseAccessor::getGlobalOpCount, - cosmosBatchResponseAccessor::getTargetMaxMicroBatchSize, + batchResponseAccessor()::getOpCountPerEvaluation, + batchResponseAccessor()::getRetriedOpCountPerEvaluation, + batchResponseAccessor()::getGlobalOpCount, + batchResponseAccessor()::getTargetMaxMicroBatchSize, requestOptions, null); } @@ -674,7 +681,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 +702,7 @@ public Mono> traceEnabledCosmosItemResponsePublisher( (r, samplingRate) -> { CosmosDiagnostics diagnostics = r.getDiagnostics(); if (diagnostics != null) { - diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate); + diagAccessor().setSamplingRateSnapshot(diagnostics, samplingRate); } return diagnostics; @@ -719,13 +726,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); + diagAccessor().setSamplingRateSnapshot(diagnostics, samplingRateSnapshot); } return r; }); @@ -740,8 +747,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 +757,7 @@ private Mono> wrapReadManyFeedResponseWithTracingIfEnabled( (r, samplingRate) -> { CosmosDiagnostics diagnostics = r.getCosmosDiagnostics(); if (diagnostics != null) { - diagnosticsAccessor.setSamplingRateSnapshot(diagnostics, samplingRate); + diagAccessor().setSamplingRateSnapshot(diagnostics, samplingRate); } return diagnostics; @@ -782,13 +789,13 @@ public static void recordFeedResponse( response.getResults().size() : null; if (diagnostics != null && - diagnosticsAccessor + diagAccessor() .isDiagnosticsCapturedInPagedFlux(diagnostics) .compareAndSet(false, true)) { Double samplingRateSnapshot = samplingRateSnapshotSupplier.get(); if (samplingRateSnapshot != null && samplingRateSnapshot < 1) { - diagnosticsAccessor + diagAccessor() .setSamplingRateSnapshot(diagnostics, samplingRateSnapshot); } @@ -826,7 +833,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 +858,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 +890,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 callDepth = context.getData(COSMOS_CALL_DEPTH); @@ -964,8 +971,8 @@ private Mono publisherWithDiagnostics(Mono resultPublisher, CosmosDiagnosticsContext cosmosCtxFromUpstream) { CosmosDiagnosticsThresholds thresholds = requestOptions != null - ? clientAccessor.getEffectiveDiagnosticsThresholds(client, requestOptions.getDiagnosticsThresholds()) - : clientAccessor.getEffectiveDiagnosticsThresholds(client, null); + ? clientAccessor().getEffectiveDiagnosticsThresholds(client, requestOptions.getDiagnosticsThresholds()) + : clientAccessor().getEffectiveDiagnosticsThresholds(client, null); ReadConsistencyStrategy requestLevelReadConsistencyStrategy = requestOptions != null ? requestOptions.getReadConsistencyStrategy() @@ -973,7 +980,7 @@ private Mono publisherWithDiagnostics(Mono resultPublisher, CosmosDiagnosticsContext cosmosCtx = cosmosCtxFromUpstream != null ? cosmosCtxFromUpstream - : ctxAccessor.create( + : ctxAccessor().create( spanName, accountName, BridgeInternal.getServiceEndpoint(client), @@ -982,13 +989,13 @@ private Mono publisherWithDiagnostics(Mono resultPublisher, resourceType, operationType, null, - clientAccessor.getEffectiveConsistencyLevel(client, operationType, consistencyLevel), - clientAccessor.getEffectiveReadConsistencyStrategy(client, resourceType, operationType, requestLevelReadConsistencyStrategy), + clientAccessor().getEffectiveConsistencyLevel(client, operationType, consistencyLevel), + clientAccessor().getEffectiveReadConsistencyStrategy(client, resourceType, operationType, requestLevelReadConsistencyStrategy), maxItemCount, thresholds, trackingId, - clientAccessor.getConnectionMode(client), - clientAccessor.getUserAgent(client), + clientAccessor().getConnectionMode(client), + clientAccessor().getUserAgent(client), null, null, requestOptions); @@ -1031,7 +1038,7 @@ private void end( checkNotNull(cosmosCtx, "Argument 'cosmosCtx' must not be null."); // endOperation can be called from two places in Reactor - making sure we process completion only once - if (ctxAccessor.endOperation( + if (ctxAccessor().endOperation( cosmosCtx, statusCode, subStatusCode, @@ -1126,11 +1133,10 @@ public Context startSpan(String spanName, CosmosDiagnosticsContext cosmosCtx, Co checkNotNull(spanName, "Argument 'spanName' must not be null."); checkNotNull(cosmosCtx, "Argument 'cosmosCtx' must not be null."); - StartSpanOptions spanOptions = this.startSpanOptions( spanName, cosmosCtx.getDatabaseName(), - ctxAccessor.getEndpoint(cosmosCtx)); + ctxAccessor().getEndpoint(cosmosCtx)); // start the span and return the started span return tracer.start(spanName, spanOptions, context); @@ -1283,7 +1289,6 @@ private void addClientSideRequestStatisticsOnTracerEvent( this.addEvent("RegionContacted", attributes, OffsetDateTime.ofInstant(clientSideRequestStatistics.getRequestStartTimeUTC(), ZoneOffset.UTC), context); - //adding systemInformation attributes = new HashMap<>(); attributes.put(JSON_STRING, @@ -1325,7 +1330,7 @@ private void addDiagnosticsOnTracerEvent(CosmosDiagnostics cosmosDiagnostics, Co Map attributes; FeedResponseDiagnostics feedResponseDiagnostics = - diagnosticsAccessor.getFeedResponseDiagnostics(cosmosDiagnostics); + diagAccessor().getFeedResponseDiagnostics(cosmosDiagnostics); if (feedResponseDiagnostics != null) { QueryInfo.QueryPlanDiagnosticsContext queryPlanDiagnostics = feedResponseDiagnostics .getQueryPlanDiagnosticsContext(); @@ -1402,16 +1407,16 @@ public OpenTelemetryCosmosTracer( this.clientId = clientId; this.userAgent = userAgent; this.connectionMode = connectionMode; - this.namingSchemes = clientTelemetryConfigAccessor.getOtelSpanAttributeNamingSchema(config); + this.namingSchemes = clientTelemetryConfigAccessor().getOtelSpanAttributeNamingSchema(config); } private boolean isTransportLevelTracingEnabled() { - return clientTelemetryConfigAccessor.isTransportLevelTracingEnabled(this.config); + return clientTelemetryConfigAccessor().isTransportLevelTracingEnabled(this.config); } private boolean showQueryStatement() { - if(ShowQueryMode.ALL.equals(clientTelemetryConfigAccessor.showQueryMode(this.config)) - || ShowQueryMode.PARAMETERIZED_ONLY.equals(clientTelemetryConfigAccessor.showQueryMode(this.config))) { + if(ShowQueryMode.ALL.equals(clientTelemetryConfigAccessor().showQueryMode(this.config)) + || ShowQueryMode.PARAMETERIZED_ONLY.equals(clientTelemetryConfigAccessor().showQueryMode(this.config))) { return true; } return false; @@ -1475,7 +1480,7 @@ private StartSpanOptions startSpanOptions(String spanName, CosmosDiagnosticsCont } if (!cosmosCtx.getOperationId().isEmpty() && - !cosmosCtx.getOperationId().equals(ctxAccessor.getSpanName(cosmosCtx))) { + !cosmosCtx.getOperationId().equals(ctxAccessor().getSpanName(cosmosCtx))) { spanOptions = spanOptions .setAttribute(AttributeNamesPreV1.CDB_OPERATION_ID.toString(), cosmosCtx.getOperationId()); @@ -1628,7 +1633,7 @@ public void endSpan(CosmosDiagnosticsContext cosmosCtx, Context context, boolean context); if (cosmosCtx.getEffectiveReadConsistencyStrategy() != null - && ctxAccessor.getOperationType(cosmosCtx).isReadOnlyOperation()) { + && ctxAccessor().getOperationType(cosmosCtx).isReadOnlyOperation()) { tracer.setAttribute( AttributeNamesV1.CDB_READ_CONSISTENCY_STRATEGY.toString(), @@ -1865,7 +1870,7 @@ private void traceTransportLevel(CosmosDiagnosticsContext diagnosticsContext, Co // HTTP calls are automatically captured as well Collection combinedClientSideRequestStatistics = - ctxAccessor.getDistinctCombinedClientSideRequestStatistics(diagnosticsContext); + ctxAccessor().getDistinctCombinedClientSideRequestStatistics(diagnosticsContext); traceTransportLevelRequests( combinedClientSideRequestStatistics, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Document.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Document.java index cad610facb7a..7eb79aa05bcb 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Document.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/Document.java @@ -17,9 +17,11 @@ * can be authorized using the master key or resource keys. */ public class Document extends Resource { + private static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + } + private final static ObjectMapper OBJECT_MAPPER = Utils.getSimpleObjectMapper(); - private final static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor = - ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); /** * Constructor. @@ -71,7 +73,7 @@ public static Document fromObject(Object document, CosmosItemSerializer itemSeri if (document instanceof Document) { typedDocument = (Document) document; } else { - Map jsonTreeMap = itemSerializerAccessor.serializeSafe(itemSerializer, document); + Map jsonTreeMap = itemSerializerAccessor().serializeSafe(itemSerializer, document); ObjectNode objectNode = null; if (jsonTreeMap instanceof ObjectNodeMap) { objectNode = ((ObjectNodeMap)jsonTreeMap).getObjectNode(); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedOperationState.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedOperationState.java index 900d6b2d6768..2b0c9471ee98 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedOperationState.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/FeedOperationState.java @@ -19,17 +19,13 @@ public abstract class FeedOperationState { - protected static final ImplementationBridgeHelpers - .CosmosAsyncClientHelper - .CosmosAsyncClientAccessor clientAccessor = ImplementationBridgeHelpers - .CosmosAsyncClientHelper - .getCosmosAsyncClientAccessor(); - - protected static final ImplementationBridgeHelpers - .CosmosDiagnosticsContextHelper - .CosmosDiagnosticsContextAccessor ctxAccessor = ImplementationBridgeHelpers - .CosmosDiagnosticsContextHelper - .getCosmosDiagnosticsContextAccessor(); + protected static ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor(); + } + + protected static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + } private final CosmosAsyncClient cosmosAsyncClient; private final CosmosDiagnosticsThresholds thresholds; @@ -81,13 +77,13 @@ public FeedOperationState( ? requestOptions.getReadConsistencyStrategy() : null; - ReadConsistencyStrategy effectiveReadConsistencyStrategy = clientAccessor + ReadConsistencyStrategy effectiveReadConsistencyStrategy = clientAccessor() .getEffectiveReadConsistencyStrategy( cosmosAsyncClient, resourceType, operationType, requestLevelReadConsistencyStrategy); - CosmosDiagnosticsContext cosmosCtx = ctxAccessor.create( + CosmosDiagnosticsContext cosmosCtx = ctxAccessor().create( checkNotNull(spanName, "Argument 'spanName' must not be null." ), - clientAccessor.getAccountTagValue(cosmosAsyncClient), + clientAccessor().getAccountTagValue(cosmosAsyncClient), BridgeInternal.getServiceEndpoint(this.cosmosAsyncClient), dbName, containerName, @@ -99,8 +95,8 @@ public FeedOperationState( initialMaxItemCount != null ? initialMaxItemCount : Constants.Properties.DEFAULT_MAX_PAGE_SIZE, this.thresholds, null, - clientAccessor.getConnectionMode(cosmosAsyncClient), - clientAccessor.getUserAgent(cosmosAsyncClient), + clientAccessor().getConnectionMode(cosmosAsyncClient), + clientAccessor().getUserAgent(cosmosAsyncClient), this.sequenceNumberGenerator.incrementAndGet(), fluxOptions != null ? fluxOptions.getQueryText(): null, requestOptions); @@ -120,7 +116,7 @@ public void setSamplingRateSnapshot(double samplingRateSnapshot, boolean isSampl this.samplingRate.set(samplingRateSnapshot); this.isSampledOut.set(isSampledOut); CosmosDiagnosticsContext ctxSnapshot = this.ctxHolder.get(); - ctxAccessor.setSamplingRateSnapshot(ctxSnapshot, samplingRateSnapshot, isSampledOut); + ctxAccessor().setSamplingRateSnapshot(ctxSnapshot, samplingRateSnapshot, isSampledOut); } // Can return null @@ -148,11 +144,11 @@ public void setRequestContinuation(String requestContinuation) { } public DiagnosticsProvider getDiagnosticsProvider() { - return clientAccessor.getDiagnosticsProvider(this.cosmosAsyncClient); + return clientAccessor().getDiagnosticsProvider(this.cosmosAsyncClient); } public String getSpanName() { - return ctxAccessor.getSpanName(this.ctxHolder.get()); + return ctxAccessor().getSpanName(this.ctxHolder.get()); } public CosmosAsyncClient getClient() { @@ -169,14 +165,14 @@ public void resetDiagnosticsContext() { throw new IllegalStateException("CosmosDiagnosticsContext must never be null"); } - final CosmosDiagnosticsContext cosmosCtx = ctxAccessor.create( - ctxAccessor.getSpanName(snapshot), - ctxAccessor.getEndpoint(snapshot), + final CosmosDiagnosticsContext cosmosCtx = ctxAccessor().create( + ctxAccessor().getSpanName(snapshot), + ctxAccessor().getEndpoint(snapshot), BridgeInternal.getServiceEndpoint(this.cosmosAsyncClient), snapshot.getDatabaseName(), snapshot.getContainerName(), - ctxAccessor.getResourceType(snapshot), - ctxAccessor.getOperationType(snapshot), + ctxAccessor().getResourceType(snapshot), + ctxAccessor().getOperationType(snapshot), snapshot.getOperationId(), snapshot.getEffectiveConsistencyLevel(), snapshot.getEffectiveReadConsistencyStrategy(), @@ -187,11 +183,11 @@ public void resetDiagnosticsContext() { snapshot.getUserAgent(), this.sequenceNumberGenerator.incrementAndGet(), fluxOptions.getQueryText(), - ctxAccessor.getRequestOptions(snapshot) + ctxAccessor().getRequestOptions(snapshot) ); Double samplingRateSnapshot = this.samplingRate.get(); if (samplingRateSnapshot != null) { - ctxAccessor.setSamplingRateSnapshot(cosmosCtx, samplingRateSnapshot, this.isSampledOut.get()); + ctxAccessor().setSamplingRateSnapshot(cosmosCtx, samplingRateSnapshot, this.isSampledOut.get()); } this.ctxHolder.set(cosmosCtx); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ImplementationBridgeHelpers.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ImplementationBridgeHelpers.java index c9a61ed0f231..10b1644fd7d2 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ImplementationBridgeHelpers.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/ImplementationBridgeHelpers.java @@ -1547,7 +1547,7 @@ public static void setCosmosDiagnosticsThresholdsAccessor(final CosmosDiagnostic } } - public static CosmosDiagnosticsThresholdsAccessor getCosmosAsyncClientAccessor() { + public static CosmosDiagnosticsThresholdsAccessor getCosmosDiagnosticsThresholdsAccessor() { if (!cosmosDiagnosticsThresholdsClassLoaded.get()) { logger.debug("Initializing CosmosDiagnosticsThresholds..."); initializeAllAccessors(); @@ -1892,6 +1892,7 @@ void setShouldWrapSerializationExceptions( void setItemObjectMapper(CosmosItemSerializer serializer, ObjectMapper mapper); ObjectMapper getItemObjectMapper(CosmosItemSerializer serializer); + CosmosItemSerializer getInternalDefaultSerializer(); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/JsonSerializable.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/JsonSerializable.java index c06d8a6bc1ed..0c6e22a47a22 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/JsonSerializable.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/JsonSerializable.java @@ -55,10 +55,12 @@ * Represents a base resource that can be serialized to JSON in the Azure Cosmos DB database service. */ public class JsonSerializable { + private static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + } + private static final ObjectMapper OBJECT_MAPPER = Utils.getSimpleObjectMapper(); private static final Logger LOGGER = LoggerFactory.getLogger(JsonSerializable.class); - private final static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor = - ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); transient ObjectNode propertyBag = null; private ObjectMapper om; @@ -247,7 +249,7 @@ public void remove(String propertyName) { */ @SuppressWarnings({"unchecked", "rawtypes"}) public void set(String propertyName, T value) { - set(propertyName, value, DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, false); + set(propertyName, value, ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } /** @@ -281,7 +283,7 @@ public void set(String propertyName, T value, CosmosItemSerializer itemSeria } else { // Arrays, POJO, ObjectNode, number (includes int, float, double etc), boolean, // and string - Map jsonTreeMap = itemSerializerAccessor.serializeSafe(itemSerializer, value); + Map jsonTreeMap = itemSerializerAccessor().serializeSafe(itemSerializer, value); if (jsonTreeMap instanceof ObjectNodeMap) { this.propertyBag.set(propertyName, ((ObjectNodeMap) jsonTreeMap).getObjectNode()); } else if (jsonTreeMap instanceof PrimitiveJsonNodeMap) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyHelper.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyHelper.java index 502dd2ff356a..7bd74d3f2e84 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyHelper.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/PartitionKeyHelper.java @@ -16,6 +16,10 @@ * Utility class for partition key extraction */ public class PartitionKeyHelper { + private static ImplementationBridgeHelpers.PartitionKeyHelper.PartitionKeyAccessor partitionKeyAccessor() { + return ImplementationBridgeHelpers.PartitionKeyHelper.getPartitionKeyAccessor(); + } + public static PartitionKeyInternal extractPartitionKeyValueFromDocument( JsonSerializable document, PartitionKeyDefinition partitionKeyDefinition) { @@ -39,14 +43,10 @@ public static PartitionKey extractPartitionKeyFromDocument( } if (value instanceof PartitionKeyInternal) { - return ImplementationBridgeHelpers - .PartitionKeyHelper - .getPartitionKeyAccessor() + return partitionKeyAccessor() .toPartitionKey((PartitionKeyInternal) value); } else { - return ImplementationBridgeHelpers - .PartitionKeyHelper - .getPartitionKeyAccessor() + return partitionKeyAccessor() .toPartitionKey(PartitionKeyInternal.fromObjectArray(Collections.singletonList(value), false)); } } @@ -59,9 +59,7 @@ public static PartitionKey extractPartitionKeyFromDocument( partitionKeyValues[pathIter] = document.getObjectByPath(partitionPathParts); } - return ImplementationBridgeHelpers - .PartitionKeyHelper - .getPartitionKeyAccessor() + return partitionKeyAccessor() .toPartitionKey(PartitionKeyInternal.fromObjectArray(partitionKeyValues, false)); default: diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/QueryFeedOperationState.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/QueryFeedOperationState.java index 1c0988f658ae..8aeec9b073b4 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/QueryFeedOperationState.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/QueryFeedOperationState.java @@ -11,11 +11,9 @@ public final class QueryFeedOperationState extends FeedOperationState { - private static final ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .CosmosQueryRequestOptionsAccessor qryOptAccessor = ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } private final CosmosQueryRequestOptions options; private final RequestOptions requestOptions; @@ -39,21 +37,21 @@ public QueryFeedOperationState( resourceType, checkNotNull(operationType, "Argument 'operationType' must not be null."), operationId, - clientAccessor.getEffectiveConsistencyLevel( + clientAccessor().getEffectiveConsistencyLevel( cosmosAsyncClient, operationType, queryRequestOptions.getConsistencyLevel()), - clientAccessor.getEffectiveDiagnosticsThresholds( + clientAccessor().getEffectiveDiagnosticsThresholds( cosmosAsyncClient, - qryOptAccessor.getImpl( + queryOptionsAccessor().getImpl( checkNotNull(queryRequestOptions, "Argument 'queryRequestOptions' must not be null.") ).getDiagnosticsThresholds()), fluxOptions, getEffectiveMaxItemCount(fluxOptions, queryRequestOptions), - qryOptAccessor.getImpl(checkNotNull(queryRequestOptions, "Argument 'queryRequestOptions' must not be null.")) + queryOptionsAccessor().getImpl(checkNotNull(queryRequestOptions, "Argument 'queryRequestOptions' must not be null.")) ); - String requestOptionsContinuation = qryOptAccessor.getRequestContinuation(queryRequestOptions); + String requestOptionsContinuation = queryOptionsAccessor().getRequestContinuation(queryRequestOptions); if (requestOptionsContinuation != null && (fluxOptions == null || fluxOptions.getRequestContinuation() == null)) { @@ -64,7 +62,7 @@ public QueryFeedOperationState( } } - Integer maxItemCountFromRequestOptions = qryOptAccessor.getMaxItemCount(queryRequestOptions); + Integer maxItemCountFromRequestOptions = queryOptionsAccessor().getMaxItemCount(queryRequestOptions); if (maxItemCountFromRequestOptions != null && (fluxOptions == null || fluxOptions.getMaxItemCount() == null)) { @@ -75,11 +73,11 @@ public QueryFeedOperationState( } } - this.options = qryOptAccessor.clone(queryRequestOptions); + this.options = queryOptionsAccessor().clone(queryRequestOptions); // apply the maxItemCount/continuation to the cloned request options this.setMaxItemCountCore(this.getMaxItemCount()); this.setRequestContinuationCore(this.getRequestContinuation()); - this.requestOptions = qryOptAccessor.toRequestOptions(this.options); + this.requestOptions = queryOptionsAccessor().toRequestOptions(this.options); } public RequestOptions toRequestOptions() { @@ -135,6 +133,6 @@ private static Integer getEffectiveMaxItemCount( return null; } - return qryOptAccessor.getMaxItemCount(queryOptions); + return queryOptionsAccessor().getMaxItemCount(queryOptions); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java index 5555b3da671c..e07ce3c3ecbc 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentClientImpl.java @@ -153,49 +153,53 @@ */ public class RxDocumentClientImpl implements AsyncDocumentClient, IAuthorizationTokenProvider, CpuMemoryListener, DiagnosticsClientContext { + private static ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor() { + return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); + } - private final static List EMPTY_REGION_LIST = Collections.emptyList(); - - private final static List EMPTY_ENDPOINT_LIST = Collections.emptyList(); + private static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private final static - ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor telemetryCfgAccessor = - ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); + private static ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor() { + return ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + private static ImplementationBridgeHelpers.CosmosItemResponseHelper.CosmosItemResponseBuilderAccessor itemResponseAccessor() { + return ImplementationBridgeHelpers.CosmosItemResponseHelper.getCosmosItemResponseBuilderAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosItemResponseHelper.CosmosItemResponseBuilderAccessor itemResponseAccessor = - ImplementationBridgeHelpers.CosmosItemResponseHelper.getCosmosItemResponseBuilderAccessor(); + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor = - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosOperationDetailsHelper.CosmosOperationDetailsAccessor operationDetailsAccessor() { + return ImplementationBridgeHelpers.CosmosOperationDetailsHelper.getCosmosOperationDetailsAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosOperationDetailsHelper.CosmosOperationDetailsAccessor operationDetailsAccessor = - ImplementationBridgeHelpers.CosmosOperationDetailsHelper.getCosmosOperationDetailsAccessor(); + private static ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor() { + return ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + } - private static final ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor = - ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosBulkExecutionOptionsHelper.CosmosBulkExecutionOptionsAccessor bulkExecutionOptionsAccessor = - ImplementationBridgeHelpers.CosmosBulkExecutionOptionsHelper.getCosmosBulkExecutionOptionsAccessor(); + private final static List EMPTY_REGION_LIST= Collections.emptyList(); - private static final ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor = - ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + private final static List EMPTY_ENDPOINT_LIST = Collections.emptyList(); private static final String tempMachineId = "uuid:" + UUIDs.nonBlockingRandomUUID(); private static final AtomicInteger activeClientsCnt = new AtomicInteger(0); @@ -686,9 +690,7 @@ private RxDocumentClientImpl(URI serviceEndpoint, this.useThinClient = Configs.isThinClientEnabled() && this.connectionPolicy.getConnectionMode() == ConnectionMode.GATEWAY && this.connectionPolicy.getHttp2ConnectionConfig() != null - && ImplementationBridgeHelpers - .Http2ConnectionConfigHelper - .getHttp2ConnectionConfigAccessor() + && httpCfgAccessor() .isEffectivelyEnabled( this.connectionPolicy.getHttp2ConnectionConfig() ); @@ -706,8 +708,9 @@ public DiagnosticsClientConfig getConfig() { @Override public CosmosDiagnostics createDiagnostics() { - CosmosDiagnostics diagnostics = - diagnosticsAccessor.create(this, telemetryCfgAccessor.getSamplingRate(this.clientTelemetryConfig)); + double samplingRate = clientTelemetryConfigAccessor() + .getSamplingRate(this.clientTelemetryConfig); + CosmosDiagnostics diagnostics = diagAccessor().create(this, samplingRate); this.mostRecentlyCreatedDiagnostics.set(diagnostics); @@ -1028,7 +1031,6 @@ private void createStoreModel(boolean subscribeRntbdStatus) { this.storeModel = new ServerStoreModel(storeClient); } - @Override public URI getServiceEndpoint() { return this.serviceEndpoint; @@ -1148,7 +1150,7 @@ private Mono> createDatabaseInternal(Database databas Map requestHeaders = this.getRequestHeaders(options, ResourceType.Database, OperationType.Create); Instant serializationStartTimeUTC = Instant.now(); ByteBuffer byteBuffer = database.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), null, false); Instant serializationEndTimeUTC = Instant.now(); @@ -1286,7 +1288,9 @@ private OperationContextAndListenerTuple getOperationContextAndListenerTuple(Cos if (options == null) { return null; } - return qryOptAccessor.getImpl(options).getOperationContextAndListenerTuple(); + return queryOptionsAccessor() + .getImpl(options) + .getOperationContextAndListenerTuple(); } private OperationContextAndListenerTuple getOperationContextAndListenerTuple(RequestOptions options) { @@ -1318,7 +1322,7 @@ private Flux> createQuery( CosmosQueryRequestOptions nonNullQueryOptions = state.getQueryOptions(); - UUID correlationActivityIdOfRequestOptions = qryOptAccessor + UUID correlationActivityIdOfRequestOptions = queryOptionsAccessor() .getImpl(nonNullQueryOptions) .getCorrelationActivityId(); UUID correlationActivityId = correlationActivityIdOfRequestOptions != null ? @@ -1339,8 +1343,8 @@ private Flux> createQuery( this.collectionCache, null, resourceLink, - qryOptAccessor.getProperties(nonNullQueryOptions), - qryOptAccessor.getHeaders(nonNullQueryOptions), + queryOptionsAccessor().getProperties(nonNullQueryOptions), + queryOptionsAccessor().getHeaders(nonNullQueryOptions), this.sessionContainer, diagnosticsFactory, ResourceType.Document @@ -1385,9 +1389,7 @@ private Flux> createQueryInternal( if (options != null) { CosmosEndToEndOperationLatencyPolicyConfig endToEndPolicyConfigFromRequestOptions = getEndToEndOperationLatencyPolicyConfig( - ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + queryOptionsAccessor() .toRequestOptions(options), resourceTypeEnum, OperationType.Query); @@ -1427,9 +1429,7 @@ private Flux> createQueryInternal( return tFeedResponse; }); - RequestOptions requestOptions = options == null? null : ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + RequestOptions requestOptions = options == null? null : queryOptionsAccessor() .toRequestOptions(options); CosmosEndToEndOperationLatencyPolicyConfig endToEndPolicyConfig = @@ -1498,7 +1498,7 @@ private static void applyExceptionToMergedDiagnosticsForQuery( mostRecentlyCreatedDiagnostics); } else { List cancelledRequestDiagnostics = - qryOptAccessor + queryOptionsAccessor() .getCancelledRequestDiagnosticsTracker(requestOptions); // if there is any cancelled requests, collect cosmos diagnostics if (cancelledRequestDiagnostics != null && !cancelledRequestDiagnostics.isEmpty()) { @@ -1508,15 +1508,11 @@ private static void applyExceptionToMergedDiagnosticsForQuery( .stream() .reduce((first, toBeMerged) -> { ClientSideRequestStatistics clientSideRequestStatistics = - ImplementationBridgeHelpers - .CosmosDiagnosticsHelper - .getCosmosDiagnosticsAccessor() + diagAccessor() .getClientSideRequestStatisticsRaw(first); ClientSideRequestStatistics toBeMergedClientSideRequestStatistics = - ImplementationBridgeHelpers - .CosmosDiagnosticsHelper - .getCosmosDiagnosticsAccessor() + diagAccessor() .getClientSideRequestStatisticsRaw(first); if (clientSideRequestStatistics == null) { @@ -1619,7 +1615,6 @@ public Flux> queryDatabases(String query, QueryFeedOperat return queryDatabases(new SqlQuerySpec(query), state); } - @Override public Flux> queryDatabases(SqlQuerySpec querySpec, QueryFeedOperationState state) { return createQuery(Paths.DATABASES_ROOT, querySpec, state, Database.class, ResourceType.Database); @@ -1651,7 +1646,7 @@ private Mono> createCollectionInternal(Stri Instant serializationStartTimeUTC = Instant.now(); ByteBuffer byteBuffer = collection.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), null, false); Instant serializationEndTimeUTC = Instant.now(); @@ -1707,7 +1702,7 @@ private Mono> replaceCollectionInternal(Doc Map requestHeaders = this.getRequestHeaders(options, ResourceType.DocumentCollection, OperationType.Replace); Instant serializationStartTimeUTC = Instant.now(); ByteBuffer byteBuffer = collection.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), null, false); Instant serializationEndTimeUTC = Instant.now(); @@ -4158,8 +4153,8 @@ public Mono> readMany( this.collectionCache, null, collectionLink, - qryOptAccessor.getProperties(state.getQueryOptions()), - qryOptAccessor.getHeaders(state.getQueryOptions()), + queryOptionsAccessor().getProperties(state.getQueryOptions()), + queryOptionsAccessor().getHeaders(state.getQueryOptions()), this.sessionContainer, diagnosticsFactory, ResourceType.Document @@ -4177,6 +4172,7 @@ public Mono> readMany( ConcurrentMap aggregatedQueryMetrics = new ConcurrentHashMap<>(); Collection aggregateRequestStatistics = new DistinctClientSideRequestStatisticsCollection(); double requestCharge = 0; + for (FeedResponse page : feedList) { ConcurrentMap pageQueryMetrics = ModelBridgeInternal.queryMetrics(page); @@ -4187,7 +4183,7 @@ public Mono> readMany( requestCharge += page.getRequestCharge(); finalList.addAll(page.getResults()); - aggregateRequestStatistics.addAll(diagnosticsAccessor.getClientSideRequestStatistics(page.getCosmosDiagnostics())); + aggregateRequestStatistics.addAll(diagAccessor().getClientSideRequestStatistics(page.getCosmosDiagnostics())); } // NOTE: This CosmosDiagnostics instance intentionally isn't captured in the @@ -4198,13 +4194,13 @@ public Mono> readMany( // this artificial CosmosDiagnostics with the aggregated RU/s etc. is simply // to maintain the API contract that a FeedResponse returns one CosmosDiagnostics CosmosDiagnostics aggregatedDiagnostics = BridgeInternal.createCosmosDiagnostics(aggregatedQueryMetrics); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( aggregatedDiagnostics, aggregateRequestStatistics); state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctx = state.getDiagnosticsContextSnapshot(); if (ctx != null) { - ctxAccessor.recordOperation( + ctxAccessor().recordOperation( ctx, 200, 0, @@ -4213,8 +4209,7 @@ public Mono> readMany( aggregatedDiagnostics, null ); - diagnosticsAccessor - .setDiagnosticsContext( + diagAccessor().setDiagnosticsContext( aggregatedDiagnostics, ctx); } @@ -4240,7 +4235,7 @@ public Mono> readMany( state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctx = state.getDiagnosticsContextSnapshot(); if (ctx != null) { - ctxAccessor.recordOperation( + ctxAccessor().recordOperation( ctx, cosmosException.getStatusCode(), cosmosException.getSubStatusCode(), @@ -4249,7 +4244,7 @@ public Mono> readMany( diagnostics, throwable ); - diagnosticsAccessor + diagAccessor() .setDiagnosticsContext( diagnostics, state.getDiagnosticsContextSnapshot()); @@ -4263,7 +4258,6 @@ public Mono> readMany( }); } - private Mono>> readMany( List itemIdentityList, String collectionLink, @@ -4512,9 +4506,7 @@ private Flux> queryForReadMany( Flux> feedResponseFlux = executionContext.flatMap(IDocumentQueryExecutionContext::executeAsync); - RequestOptions requestOptions = options == null? null : ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + RequestOptions requestOptions = options == null? null : queryOptionsAccessor() .toRequestOptions(options); CosmosEndToEndOperationLatencyPolicyConfig endToEndPolicyConfig = @@ -4549,9 +4541,7 @@ private Flux> pointReadsForReadMany( .flatMap(cosmosItemIdentityList -> { if (cosmosItemIdentityList.size() == 1) { CosmosItemIdentity firstIdentity = cosmosItemIdentityList.get(0); - RequestOptions requestOptions = ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + RequestOptions requestOptions = queryOptionsAccessor() .toRequestOptions(queryRequestOptions); requestOptions.setPartitionKey(firstIdentity.getPartitionKey()); return this.readDocument((resourceLink + firstIdentity.getId()), requestOptions, diagnosticsFactory) @@ -4586,19 +4576,20 @@ private Flux> pointReadsForReadMany( if (cosmosException != null) { feedResponse = ModelBridgeInternal.createFeedResponse(new ArrayList<>(), cosmosException.getResponseHeaders()); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( feedResponse.getCosmosDiagnostics(), Collections.singleton( BridgeInternal.getClientSideRequestStatics(cosmosException.getDiagnostics()))); } else { CosmosItemResponse cosmosItemResponse = - itemResponseAccessor.createCosmosItemResponse(resourceResponse, klass, effectiveItemSerializer); + itemResponseAccessor() + .createCosmosItemResponse(resourceResponse, klass, effectiveItemSerializer); feedResponse = ModelBridgeInternal.createFeedResponse( Arrays.asList(cosmosItemResponse.getItem()), cosmosItemResponse.getResponseHeaders()); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( feedResponse.getCosmosDiagnostics(), Collections.singleton( BridgeInternal.getClientSideRequestStatics(cosmosItemResponse.getDiagnostics()))); @@ -4761,7 +4752,8 @@ public Mono addPartitionLevelUnavailableRegionsOnReque if (RxDocumentClientImpl.this.globalPartitionEndpointManagerForPerPartitionCircuitBreaker.isPerPartitionLevelCircuitBreakingApplicable(request) || RxDocumentClientImpl.this.globalPartitionEndpointManagerForPerPartitionAutomaticFailover.isPerPartitionAutomaticFailoverApplicable(request)) { - String collectionRid = RxDocumentClientImpl.qryOptAccessor.getCollectionRid(queryRequestOptions); + String collectionRid = queryOptionsAccessor() + .getCollectionRid(queryRequestOptions); checkNotNull(collectionRid, "Argument 'collectionRid' cannot be null!"); @@ -4833,7 +4825,6 @@ public Flux> queryDocumentChangeFeed( PerPartitionCircuitBreakerInfoHolder perPartitionCircuitBreakerInfoHolder = new PerPartitionCircuitBreakerInfoHolder(); PerPartitionAutomaticFailoverInfoHolder perPartitionAutomaticFailoverInfoHolder = new PerPartitionAutomaticFailoverInfoHolder(); - CrossRegionAvailabilityContextForRxDocumentServiceRequest crossRegionAvailabilityContextForRequest = new CrossRegionAvailabilityContextForRxDocumentServiceRequest( new FeedOperationContextForCircuitBreaker(new ConcurrentHashMap<>(), false, collection.getAltLink()), null, @@ -4870,8 +4861,8 @@ public Flux> queryDocumentChangeFeedFromPagedFlux( this.collectionCache, null, collectionLink, - changeFeedOptionsAccessor.getProperties(state.getChangeFeedOptions()), - changeFeedOptionsAccessor.getHeaders(state.getChangeFeedOptions()), + changeFeedOptionsAccessor().getProperties(state.getChangeFeedOptions()), + changeFeedOptionsAccessor().getHeaders(state.getChangeFeedOptions()), this.sessionContainer, diagnosticsFactory, ResourceType.Document @@ -4905,11 +4896,11 @@ private Flux> queryDocumentChangeFeedFromPagedFluxInternal( throw new IllegalStateException("Collection can not be null"); } - CosmosChangeFeedRequestOptions clonedOptions = changeFeedOptionsAccessor.clone(state.getChangeFeedOptions()); + CosmosChangeFeedRequestOptions clonedOptions = changeFeedOptionsAccessor().clone(state.getChangeFeedOptions()); - CosmosChangeFeedRequestOptionsImpl optionsImpl = changeFeedOptionsAccessor.getImpl(clonedOptions); + CosmosChangeFeedRequestOptionsImpl optionsImpl = changeFeedOptionsAccessor().getImpl(clonedOptions); - CosmosOperationDetails operationDetails = operationDetailsAccessor.create(optionsImpl, state.getDiagnosticsContextSnapshot()); + CosmosOperationDetails operationDetails = operationDetailsAccessor().create(optionsImpl, state.getDiagnosticsContextSnapshot()); this.operationPolicies.forEach(policy -> { try { policy.process(operationDetails); @@ -4923,14 +4914,14 @@ private Flux> queryDocumentChangeFeedFromPagedFluxInternal( ? optionsImpl.getReadConsistencyStrategy() : null; - ReadConsistencyStrategy effectiveReadConsistencyStrategy = readConsistencyStrategyAccessor + ReadConsistencyStrategy effectiveReadConsistencyStrategy = readConsistencyStrategyAccessor() .getEffectiveReadConsistencyStrategy( ResourceType.Document, OperationType.ReadFeed, requestLevelReadConsistencyStrategy, this.readConsistencyStrategy); - ctxAccessor.setRequestOptions( + ctxAccessor().setRequestOptions( state.getDiagnosticsContextSnapshot(), optionsImpl, effectiveReadConsistencyStrategy); @@ -4954,10 +4945,9 @@ public Flux> readAllDocuments( throw new IllegalArgumentException("partitionKey"); } - final CosmosQueryRequestOptions effectiveOptions = - qryOptAccessor.clone(state.getQueryOptions()); + final CosmosQueryRequestOptions effectiveOptions = queryOptionsAccessor().clone(state.getQueryOptions()); - RequestOptions nonNullRequestOptions = qryOptAccessor.toRequestOptions(effectiveOptions); + RequestOptions nonNullRequestOptions = queryOptionsAccessor().toRequestOptions(effectiveOptions); CosmosEndToEndOperationLatencyPolicyConfig endToEndPolicyConfig = nonNullRequestOptions.getCosmosEndToEndLatencyPolicyConfig(); @@ -5017,8 +5007,8 @@ public Flux> readAllDocuments( this.collectionCache, null, resourceLink, - qryOptAccessor.getProperties(effectiveOptions), - qryOptAccessor.getHeaders(effectiveOptions), + queryOptionsAccessor().getProperties(effectiveOptions), + queryOptionsAccessor().getHeaders(effectiveOptions), this.sessionContainer, diagnosticsFactory, ResourceType.Document @@ -5962,7 +5952,6 @@ private Mono> replaceUserInternal(User user, RequestOptio } } - public Mono> deleteUser(String userLink, RequestOptions options) { DocumentClientRetryPolicy retryPolicyInstance = this.resetSessionTokenRetryPolicy.getRequestPolicy(null); return ObservableHelper.inlineIfPossibleAsObs(() -> deleteUserInternal(userLink, options, retryPolicyInstance), retryPolicyInstance); @@ -6445,14 +6434,14 @@ private Flux> nonDocumentReadFeedInternal( return readFeed(request) .map(response -> { if (isChangeFeed) { - return feedResponseAccessor.createChangeFeedResponse( + return feedResponseAccessor().createChangeFeedResponse( response, - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), klass); } else { - return feedResponseAccessor.createFeedResponse( + return feedResponseAccessor().createFeedResponse( response, - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), klass); } }); @@ -7083,7 +7072,10 @@ public void mergeContextInformationIntoDiagnosticsForPointRequest( = crossRegionAvailabilityContextForRequest.getPointOperationContextForCircuitBreaker(); if (pointOperationContextForCircuitBreaker != null) { - diagnosticsAccessor.mergeSerializationDiagnosticContext(request.requestContext.cosmosDiagnostics, pointOperationContextForCircuitBreaker.getSerializationDiagnosticsContext()); + diagAccessor() + .mergeSerializationDiagnosticContext( + request.requestContext.cosmosDiagnostics, + pointOperationContextForCircuitBreaker.getSerializationDiagnosticsContext()); } } } @@ -7133,7 +7125,10 @@ public PartitionKeyRange addPartitionLevelUnavailableRegionsForFeedRequestForPer if (request.getPartitionKeyRangeIdentity() != null) { resolvedPartitionKeyRange = collectionRoutingMap.getRangeByPartitionKeyRangeId(request.getPartitionKeyRangeIdentity().getPartitionKeyRangeId()); } else if (request.getPartitionKeyInternal() != null) { - String effectivePartitionKeyString = PartitionKeyInternalHelper.getEffectivePartitionKeyString(request.getPartitionKeyInternal(), ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor().getPartitionKeyDefinition(options)); + PartitionKeyDefinition pkDef = queryOptionsAccessor() + .getPartitionKeyDefinition(options); + String effectivePartitionKeyString = PartitionKeyInternalHelper + .getEffectivePartitionKeyString(request.getPartitionKeyInternal(), pkDef); resolvedPartitionKeyRange = collectionRoutingMap.getRangeByEffectivePartitionKey(effectivePartitionKeyString); } @@ -7192,7 +7187,10 @@ public PartitionKeyRange setPartitionKeyRangeForFeedRequestForPerPartitionAutoma if (request.getPartitionKeyRangeIdentity() != null) { resolvedPartitionKeyRange = collectionRoutingMap.getRangeByPartitionKeyRangeId(request.getPartitionKeyRangeIdentity().getPartitionKeyRangeId()); } else if (request.getPartitionKeyInternal() != null) { - String effectivePartitionKeyString = PartitionKeyInternalHelper.getEffectivePartitionKeyString(request.getPartitionKeyInternal(), ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor().getPartitionKeyDefinition(options)); + PartitionKeyDefinition pkDef = queryOptionsAccessor() + .getPartitionKeyDefinition(options); + String effectivePartitionKeyString = PartitionKeyInternalHelper + .getEffectivePartitionKeyString(request.getPartitionKeyInternal(), pkDef); resolvedPartitionKeyRange = collectionRoutingMap.getRangeByEffectivePartitionKey(effectivePartitionKeyString); } @@ -7259,7 +7257,7 @@ public void addPartitionLevelUnavailableRegionsForChangeFeedOperationRequestForP if (request.getPartitionKeyRangeIdentity() != null) { resolvedPartitionKeyRange = collectionRoutingMap.getRangeByPartitionKeyRangeId(request.getPartitionKeyRangeIdentity().getPartitionKeyRangeId()); } else if (request.getPartitionKeyInternal() != null) { - String effectivePartitionKeyString = PartitionKeyInternalHelper.getEffectivePartitionKeyString(request.getPartitionKeyInternal(), ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor().getPartitionKeyDefinition(options)); + String effectivePartitionKeyString = PartitionKeyInternalHelper.getEffectivePartitionKeyString(request.getPartitionKeyInternal(), changeFeedOptionsAccessor().getPartitionKeyDefinition(options)); resolvedPartitionKeyRange = collectionRoutingMap.getRangeByEffectivePartitionKey(effectivePartitionKeyString); } @@ -7324,7 +7322,7 @@ public PartitionKeyRange setPartitionKeyRangeForChangeFeedOperationRequestForPer if (request.getPartitionKeyRangeIdentity() != null) { resolvedPartitionKeyRange = collectionRoutingMap.getRangeByPartitionKeyRangeId(request.getPartitionKeyRangeIdentity().getPartitionKeyRangeId()); } else if (request.getPartitionKeyInternal() != null) { - String effectivePartitionKeyString = PartitionKeyInternalHelper.getEffectivePartitionKeyString(request.getPartitionKeyInternal(), ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor().getPartitionKeyDefinition(options)); + String effectivePartitionKeyString = PartitionKeyInternalHelper.getEffectivePartitionKeyString(request.getPartitionKeyInternal(), changeFeedOptionsAccessor().getPartitionKeyDefinition(options)); resolvedPartitionKeyRange = collectionRoutingMap.getRangeByEffectivePartitionKey(effectivePartitionKeyString); } @@ -7405,7 +7403,6 @@ private Mono> wrapPointOperationWithAvailabilityStrat PerPartitionCircuitBreakerInfoHolder perPartitionCircuitBreakerInfoHolder = new PerPartitionCircuitBreakerInfoHolder(); PerPartitionAutomaticFailoverInfoHolder perPartitionAutomaticFailoverInfoHolder = new PerPartitionAutomaticFailoverInfoHolder(); - if (orderedApplicableRegionsForSpeculation.size() < 2) { // There is at most one applicable region - no hedging possible PointOperationContextForCircuitBreaker pointOperationContextForCircuitBreakerForMainRequest = new PointOperationContextForCircuitBreaker( @@ -8063,7 +8060,7 @@ private Mono executeFeedOperationWithAvailabilityStrategy( private void handleLocationCancellationExceptionForPartitionKeyRange(RxDocumentServiceRequest failedRequest) { - RegionalRoutingContext firstContactedLocationEndpoint = diagnosticsAccessor + RegionalRoutingContext firstContactedLocationEndpoint = diagAccessor() .getFirstContactedLocationEndpoint(failedRequest.requestContext.cosmosDiagnostics); if (firstContactedLocationEndpoint != null) { @@ -8106,17 +8103,13 @@ private void addCancelledGatewayModeDiagnosticsIntoCosmosException(CosmosExcepti BridgeInternal.setRequestTimeline(cosmosException, requestTimeline); - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .setFaultInjectionRuleId( cosmosException, request.faultInjectionRequestContext .getFaultInjectionRuleId(transportRequestId)); - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .setFaultInjectionEvaluationResults( cosmosException, request.faultInjectionRequestContext @@ -8373,17 +8366,17 @@ public void merge(CosmosDiagnosticsContext knownCtx) { } for (CosmosDiagnostics diagnostics : this.createdDiagnostics) { - if (diagnostics.getDiagnosticsContext() == null && diagnosticsAccessor.isNotEmpty(diagnostics)) { + if (diagnostics.getDiagnosticsContext() == null && diagAccessor().isNotEmpty(diagnostics)) { if (this.shouldCaptureAllFeedDiagnostics && - diagnosticsAccessor.getFeedResponseDiagnostics(diagnostics) != null) { + diagAccessor().getFeedResponseDiagnostics(diagnostics) != null) { - AtomicBoolean isCaptured = diagnosticsAccessor.isDiagnosticsCapturedInPagedFlux(diagnostics); + AtomicBoolean isCaptured = diagAccessor().isDiagnosticsCapturedInPagedFlux(diagnostics); if (isCaptured != null) { // Diagnostics captured in the ScopedDiagnosticsFactory should always be kept isCaptured.set(true); } } - ctxAccessor.addDiagnostics(ctx, diagnostics); + ctxAccessor().addDiagnostics(ctx, diagnostics); } } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentServiceRequest.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentServiceRequest.java index 3e4cd5547a65..2134d4ba2d84 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentServiceRequest.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxDocumentServiceRequest.java @@ -37,6 +37,10 @@ */ public class RxDocumentServiceRequest implements Cloneable { + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } + private final DiagnosticsClientContext clientContext; public volatile boolean forcePartitionKeyRangeRefresh; public volatile boolean forceCollectionRoutingMapRefresh; @@ -408,7 +412,7 @@ public static RxDocumentServiceRequest create(DiagnosticsClientContext clientCon // only ever used for non Document operations RxDocumentServiceRequest request = new RxDocumentServiceRequest(clientContext, operation, resourceType, relativePath, resource.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), null, resourceType == ResourceType.Document && (operation == OperationType.Create || operation == OperationType.Upsert)), headers, @@ -600,7 +604,7 @@ public static RxDocumentServiceRequest create(DiagnosticsClientContext clientCon Map headers, AuthorizationTokenType authorizationTokenType) { ByteBuffer resourceContent = resource.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, // only used from test code + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), // only used from test code null, resourceType == ResourceType.Document && (operation == OperationType.Create || operation == OperationType.Upsert)); return new RxDocumentServiceRequest(clientContext, operation, resourceType, relativePath, resourceContent, headers, authorizationTokenType); @@ -739,7 +743,7 @@ public static RxDocumentServiceRequest createFromName( String resourceFullName, ResourceType resourceType) { ByteBuffer resourceContent = resource.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, // only used from test code + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), // only used from test code null, resourceType == ResourceType.Document && (operationType == OperationType.Create || operationType == OperationType.Upsert)); return new RxDocumentServiceRequest(clientContext, @@ -1093,9 +1097,7 @@ private static Map getProperties(Object options) { } else if (options instanceof RequestOptions) { return ((RequestOptions) options).getProperties(); } else if (options instanceof CosmosQueryRequestOptions) { - return ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + return queryOptionsAccessor() .getProperties((CosmosQueryRequestOptions) options); } else if (options instanceof CosmosChangeFeedRequestOptions) { return ModelBridgeInternal.getPropertiesFromChangeFeedRequestOptions( diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxGatewayStoreModel.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxGatewayStoreModel.java index 42172026ad5b..81a553f01547 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxGatewayStoreModel.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/RxGatewayStoreModel.java @@ -66,6 +66,10 @@ * Used internally to provide functionality to communicate and process response from GATEWAY in the Azure Cosmos DB database service. */ public class RxGatewayStoreModel implements RxStoreModel, HttpTransportSerializer { + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } + private static final boolean leakDetectionDebuggingEnabled = ResourceLeakDetector.getLevel().ordinal() >= ResourceLeakDetector.Level.ADVANCED.ordinal(); private static final boolean HTTP_CONNECTION_WITHOUT_TLS_ALLOWED = Configs.isHttpConnectionWithoutTLSAllowed(); @@ -616,9 +620,7 @@ private Mono toDocumentServiceResponse(Mono toDocumentServiceResponse(Mono toDocumentServiceResponse(Mono toDocumentServiceResponse(Mono resolvePartitionKeyRangeByPkRangeIdCore( ) .flatMap(collectionRoutingMapValueHolder -> { - PartitionKeyRange range = collectionRoutingMapValueHolder.v.getRangeByPartitionKeyRangeId(pkRangeId.getPartitionKeyRangeId()); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/SessionTokenMismatchRetryPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/SessionTokenMismatchRetryPolicy.java index 2ced438b3e11..d75c9e15e6b3 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/SessionTokenMismatchRetryPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/SessionTokenMismatchRetryPolicy.java @@ -16,10 +16,10 @@ public class SessionTokenMismatchRetryPolicy implements IRetryPolicy { - private final static ImplementationBridgeHelpers.CosmosSessionRetryOptionsHelper.CosmosSessionRetryOptionsAccessor - sessionRetryOptionsAccessor = ImplementationBridgeHelpers - .CosmosSessionRetryOptionsHelper - .getCosmosSessionRetryOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosSessionRetryOptionsHelper.CosmosSessionRetryOptionsAccessor sessionRetryAccessor() { + return ImplementationBridgeHelpers.CosmosSessionRetryOptionsHelper.getCosmosSessionRetryOptionsAccessor(); + } + private final static Logger LOGGER = LoggerFactory.getLogger(SessionTokenMismatchRetryPolicy.class); private static final int BACKOFF_MULTIPLIER = 5; private final Duration maximumBackoff; @@ -43,9 +43,9 @@ public SessionTokenMismatchRetryPolicy( this.currentBackoff = Duration.ofMillis(Configs.getSessionTokenMismatchInitialBackoffTimeInMs()); if (sessionRetryOptions != null) { this.maxRetryAttemptsInCurrentRegion = - new AtomicInteger(sessionRetryOptionsAccessor.getMaxInRegionRetryCount(sessionRetryOptions)); - this.regionSwitchHint = sessionRetryOptionsAccessor.getRegionSwitchHint(sessionRetryOptions); - this.minInRegionRetryTime = sessionRetryOptionsAccessor.getMinInRegionRetryTime(sessionRetryOptions); + new AtomicInteger(sessionRetryAccessor().getMaxInRegionRetryCount(sessionRetryOptions)); + this.regionSwitchHint = sessionRetryAccessor().getRegionSwitchHint(sessionRetryOptions); + this.minInRegionRetryTime = sessionRetryAccessor().getMinInRegionRetryTime(sessionRetryOptions); } else { this.maxRetryAttemptsInCurrentRegion = null; this.regionSwitchHint = CosmosRegionSwitchHint.LOCAL_REGION_PREFERRED; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StaleResourceRetryPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StaleResourceRetryPolicy.java index 14b05436f3a0..b3e8d0274a91 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StaleResourceRetryPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/StaleResourceRetryPolicy.java @@ -24,9 +24,6 @@ public class StaleResourceRetryPolicy extends DocumentClientRetryPolicy { private final static Logger logger = LoggerFactory.getLogger(StaleResourceRetryPolicy.class); - private final static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor = - ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); - private final RxCollectionCache clientCollectionCache; private final DocumentClientRetryPolicy nextPolicy; private final String collectionLink; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/BulkExecutor.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/BulkExecutor.java index 53614ef4ddde..dd08fb6bec39 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/BulkExecutor.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/BulkExecutor.java @@ -81,13 +81,28 @@ * For our use case, Sinks.many().unicast() will work. */ public final class BulkExecutor implements Disposable { + private static ImplementationBridgeHelpers.CosmosBulkExecutionThresholdsStateHelper.CosmosBulkExecutionThresholdsStateAccessor bulkExecutionThresholdsAccessor() { + return ImplementationBridgeHelpers.CosmosBulkExecutionThresholdsStateHelper.getBulkExecutionThresholdsAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosAsyncContainerHelper.CosmosAsyncContainerAccessor containerAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncContainerHelper.getCosmosAsyncContainerAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosAsyncDatabaseHelper.CosmosAsyncDatabaseAccessor databaseAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncDatabaseHelper.getCosmosAsyncDatabaseAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosBatchResponseHelper.CosmosBatchResponseAccessor cosmosBatchResponseAccessor() { + return ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor(); + } private final static Logger logger = LoggerFactory.getLogger(BulkExecutor.class); private final static AtomicLong instanceCount = new AtomicLong(0); - private static final ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor = - ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor(); - private static final ImplementationBridgeHelpers.CosmosBatchResponseHelper.CosmosBatchResponseAccessor cosmosBatchResponseAccessor = - ImplementationBridgeHelpers.CosmosBatchResponseHelper.getCosmosBatchResponseAccessor(); private final CosmosAsyncContainer container; private final int maxMicroBatchPayloadSizeInBytes; @@ -137,9 +152,7 @@ public BulkExecutor(CosmosAsyncContainer container, this.bulkSpanName = "nonTransactionalBatch." + this.container.getId(); this.inputOperations = inputOperations; this.docClientWrapper = CosmosBridgeInternal.getAsyncDocumentClient(container.getDatabase()); - this.cosmosClient = ImplementationBridgeHelpers - .CosmosAsyncDatabaseHelper - .getCosmosAsyncDatabaseAccessor() + this.cosmosClient = databaseAccessor() .getCosmosAsyncClient(container.getDatabase()); this.effectiveItemSerializer = this.docClientWrapper.getEffectiveItemSerializer(cosmosBulkOptions.getCustomItemSerializer()); @@ -149,8 +162,7 @@ public BulkExecutor(CosmosAsyncContainer container, // different values when a new group is created. maxMicroBatchIntervalInMs = cosmosBulkExecutionOptions.getMaxMicroBatchInterval().toMillis(); batchContext = (TContext) cosmosBulkExecutionOptions.getLegacyBatchScopedContext(); - this.partitionScopeThresholds = ImplementationBridgeHelpers.CosmosBulkExecutionThresholdsStateHelper - .getBulkExecutionThresholdsAccessor() + this.partitionScopeThresholds = bulkExecutionThresholdsAccessor() .getPartitionScopeThresholds(cosmosBulkExecutionOptions.getThresholdsState()); operationListener = cosmosBulkExecutionOptions.getOperationContextAndListenerTuple(); if (operationListener != null && @@ -312,9 +324,7 @@ private Flux> executeCore() { Integer nullableMaxConcurrentCosmosPartitions = cosmosBulkExecutionOptions.getMaxConcurrentCosmosPartitions(); Mono maxConcurrentCosmosPartitionsMono = nullableMaxConcurrentCosmosPartitions != null ? Mono.just(Math.max(256, nullableMaxConcurrentCosmosPartitions)) : - ImplementationBridgeHelpers - .CosmosAsyncContainerHelper - .getCosmosAsyncContainerAccessor() + containerAccessor() .getFeedRanges(this.container, false).map(ranges -> Math.max(256, ranges.size() * 2)); return @@ -918,23 +928,23 @@ private Mono executeBatchRequest( true) .flatMap(cosmosBatchResponse -> { - cosmosBatchResponseAccessor.setGlobalOpCount( + cosmosBatchResponseAccessor().setGlobalOpCount( cosmosBatchResponse, partitionScopeThresholds.getTotalOperationCountSnapshot()); PartitionScopeThresholds.CurrentIntervalThresholds currentIntervalThresholdsSnapshot = partitionScopeThresholds.getCurrentThresholds(); - cosmosBatchResponseAccessor.setOpCountPerEvaluation( + cosmosBatchResponseAccessor().setOpCountPerEvaluation( cosmosBatchResponse, currentIntervalThresholdsSnapshot.currentOperationCount.get()); - cosmosBatchResponseAccessor.setRetriedOpCountPerEvaluation( + cosmosBatchResponseAccessor().setRetriedOpCountPerEvaluation( cosmosBatchResponse, currentIntervalThresholdsSnapshot.currentRetriedOperationCount.get()); - cosmosBatchResponseAccessor.setTargetMaxMicroBatchSize( + cosmosBatchResponseAccessor().setTargetMaxMicroBatchSize( cosmosBatchResponse, partitionScopeThresholds.getTargetMicroBatchSizeSnapshot()); return Mono.just(cosmosBatchResponse); }); - return clientAccessor.getDiagnosticsProvider(this.cosmosClient) + return clientAccessor().getDiagnosticsProvider(this.cosmosClient) .traceEnabledBatchResponsePublisher( responseMono, context, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/ItemBulkOperation.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/ItemBulkOperation.java index 41f6c586ef3b..465d1bb9dc80 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/ItemBulkOperation.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/ItemBulkOperation.java @@ -5,9 +5,12 @@ import com.azure.cosmos.CosmosItemSerializer; import com.azure.cosmos.implementation.DefaultCosmosItemSerializer; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.JsonSerializable; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.RequestOptions; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.apachecommons.lang.StringUtils; import com.azure.cosmos.implementation.patch.PatchUtil; import com.azure.cosmos.models.CosmosItemOperationType; @@ -77,14 +80,14 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_OPERATION_TYPE, ModelBridgeInternal.getOperationValueForCosmosItemOperationType(this.getOperationType()), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); if (StringUtils.isNotEmpty(this.getPartitionKeyJson())) { jsonSerializable.set( BatchRequestResponseConstants.FIELD_PARTITION_KEY, this.getPartitionKeyJson(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } @@ -92,7 +95,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_ID, this.getId(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } @@ -103,7 +106,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt PatchUtil.serializableBatchPatchOperation( (CosmosPatchOperations) this.getItemInternal(), this.getRequestOptions()), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } else { jsonSerializable.set( @@ -121,7 +124,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_IF_MATCH, requestOptions.getIfMatchETag(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } @@ -129,7 +132,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_IF_NONE_MATCH, requestOptions.getIfNoneMatchETag(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } @@ -140,7 +143,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_MINIMAL_RETURN_PREFERENCE, true, - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), false); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/TransactionalBulkExecutor.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/TransactionalBulkExecutor.java index cc56debf3d59..4883abdae5be 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/TransactionalBulkExecutor.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/batch/TransactionalBulkExecutor.java @@ -66,13 +66,17 @@ * **/ public final class TransactionalBulkExecutor implements Disposable { + private static ImplementationBridgeHelpers.CosmosAsyncContainerHelper.CosmosAsyncContainerAccessor containerAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncContainerHelper.getCosmosAsyncContainerAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.CosmosBatchRequestOptionsAccessor cosmosBatchRequestOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.getCosmosBatchRequestOptionsAccessor(); + } private final static Logger logger = LoggerFactory.getLogger(TransactionalBulkExecutor.class); private final static AtomicLong instanceCount = new AtomicLong(0); - private static final ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.CosmosBatchRequestOptionsAccessor cosmosBatchRequestOptionsAccessor = - ImplementationBridgeHelpers.CosmosBatchRequestOptionsHelper.getCosmosBatchRequestOptionsAccessor(); - private final CosmosAsyncContainer container; private final AsyncDocumentClient docClientWrapper; private final String operationContextText; @@ -285,9 +289,7 @@ private Flux executeCore() { Integer nullableMaxConcurrentCosmosPartitions = transactionalBulkExecutionOptionsImpl.getMaxConcurrentCosmosPartitions(); Mono maxConcurrentCosmosPartitionsMono = nullableMaxConcurrentCosmosPartitions != null ? Mono.just(Math.max(256, nullableMaxConcurrentCosmosPartitions)) : - ImplementationBridgeHelpers - .CosmosAsyncContainerHelper - .getCosmosAsyncContainerAccessor() + containerAccessor() .getFeedRanges(this.container, false).map(ranges -> Math.max(256, ranges.size() * 2)); return @@ -835,7 +837,7 @@ private CosmosBatchRequestOptions getBatchRequestOptions() { CosmosBatchRequestOptions batchRequestOptions = new CosmosBatchRequestOptions(); batchRequestOptions.setExcludedRegions(transactionalBulkExecutionOptionsImpl.getExcludedRegions()); batchRequestOptions.setKeywordIdentifiers(transactionalBulkExecutionOptionsImpl.getKeywordIdentifiers()); - cosmosBatchRequestOptionsAccessor + cosmosBatchRequestOptionsAccessor() .setThroughputControlGroupName( batchRequestOptions, transactionalBulkExecutionOptionsImpl.getThroughputControlGroupName()); @@ -843,7 +845,7 @@ private CosmosBatchRequestOptions getBatchRequestOptions() { CosmosEndToEndOperationLatencyPolicyConfig e2eLatencyPolicySnapshot = transactionalBulkExecutionOptionsImpl.getCosmosEndToEndLatencyPolicyConfig(); if (e2eLatencyPolicySnapshot != null) { - cosmosBatchRequestOptionsAccessor + cosmosBatchRequestOptionsAccessor() .setEndToEndOperationLatencyPolicyConfig( batchRequestOptions, e2eLatencyPolicySnapshot); @@ -852,16 +854,16 @@ private CosmosBatchRequestOptions getBatchRequestOptions() { Map customOptions = transactionalBulkExecutionOptionsImpl.getHeaders(); if (customOptions != null && !customOptions.isEmpty()) { for(Map.Entry entry : customOptions.entrySet()) { - cosmosBatchRequestOptionsAccessor + cosmosBatchRequestOptionsAccessor() .setHeader(batchRequestOptions, entry.getKey(), entry.getValue()); } } - cosmosBatchRequestOptionsAccessor + cosmosBatchRequestOptionsAccessor() .setOperationContextAndListenerTuple(batchRequestOptions, operationListener); batchRequestOptions.setCustomItemSerializer(this.effectiveItemSerializer); - cosmosBatchRequestOptionsAccessor.setDisableRetryForThrottledBatchRequest(batchRequestOptions, true); + cosmosBatchRequestOptionsAccessor().setDisableRetryForThrottledBatchRequest(batchRequestOptions, true); return batchRequestOptions; } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java index 714ae1422cbb..dc5545c7db64 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/caches/RxCollectionCache.java @@ -30,8 +30,9 @@ */ public abstract class RxCollectionCache { - private final static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor = - ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } private final AsyncCache collectionInfoByNameCache; private final AsyncCache collectionInfoByIdCache; @@ -201,7 +202,7 @@ public Mono resolveByNameAsync( com.azure.cosmos.implementation.Exceptions.isNotFound(cosmosException) && com.azure.cosmos.implementation.Exceptions.isSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.UNKNOWN)) { - cosmosExceptionAccessor.setSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.OWNER_RESOURCE_NOT_EXISTS); + cosmosExceptionAccessor().setSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.OWNER_RESOURCE_NOT_EXISTS); return cosmosException; } @@ -279,7 +280,7 @@ private static Throwable transformThrowableIfRequired(Throwable throwable, RxDoc if (!ResourceType.DocumentCollection.equals(request.getResourceType()) && com.azure.cosmos.implementation.Exceptions.isNotFound(cosmosException) && com.azure.cosmos.implementation.Exceptions.isSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.UNKNOWN)) { - cosmosExceptionAccessor.setSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.OWNER_RESOURCE_NOT_EXISTS); + cosmosExceptionAccessor().setSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.OWNER_RESOURCE_NOT_EXISTS); } return cosmosException; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/common/ChangeFeedContextClientImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/common/ChangeFeedContextClientImpl.java index 29f6175fb441..887c3f550b2c 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/common/ChangeFeedContextClientImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/common/ChangeFeedContextClientImpl.java @@ -45,6 +45,10 @@ * Implementation for ChangeFeedDocumentClient. */ public class ChangeFeedContextClientImpl implements ChangeFeedContextClient { + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } + private static final Logger logger = LoggerFactory.getLogger(ChangeFeedContextClientImpl.class); private final AsyncDocumentClient documentClient; @@ -139,9 +143,7 @@ public Flux> createDocumentChangeFeedQuery(CosmosAsyncConta // PKRange cache will run into 410/1002s (PartitionKeyRangeGone) if disable split handling is true // in getCurrentState and getEstimatedLag scenarios therefore disable split handling should explicitly be set to false if (isSplitHandlingDisabled) { - ImplementationBridgeHelpers - .CosmosChangeFeedRequestOptionsHelper - .getCosmosChangeFeedRequestOptionsAccessor() + changeFeedOptionsAccessor() .disableSplitHandling(changeFeedRequestOptions); } return collectionLink diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/epkversion/PartitionProcessorHelper.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/epkversion/PartitionProcessorHelper.java index 50800a81070c..200406cb93f8 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/epkversion/PartitionProcessorHelper.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/epkversion/PartitionProcessorHelper.java @@ -16,6 +16,10 @@ import com.azure.cosmos.models.ModelBridgeInternal; public class PartitionProcessorHelper { + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } + public static ChangeFeedStartFromInternal getStartFromSettings( FeedRangeInternal feedRange, ChangeFeedProcessorOptions processorOptions, @@ -89,7 +93,7 @@ public static CosmosChangeFeedRequestOptions createChangeFeedRequestOptionsForCh .setMaxItemCount(maxItemCount); // in epk version change feed processor, we are going to use new wire format to be consistent with full fidelity - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor() + changeFeedOptionsAccessor() .setHeader( changeFeedRequestOptions, HttpConstants.HttpHeaders.CHANGE_FEED_WIRE_FORMAT_VERSION, @@ -102,7 +106,7 @@ private static CosmosChangeFeedRequestOptions createForProcessingFromContinuatio CosmosChangeFeedRequestOptions changeFeedRequestOptions = CosmosChangeFeedRequestOptions.createForProcessingFromContinuation(continuationToken); // in epk version change feed processor, we are going to use new wire format to be consistent with full fidelity - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor() + changeFeedOptionsAccessor() .setHeader( changeFeedRequestOptions, HttpConstants.HttpHeaders.CHANGE_FEED_WIRE_FORMAT_VERSION, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/pkversion/PartitionProcessorImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/pkversion/PartitionProcessorImpl.java index db5b4f4a87df..fe1609c3a852 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/pkversion/PartitionProcessorImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/changefeed/pkversion/PartitionProcessorImpl.java @@ -45,6 +45,10 @@ * Implementation for {@link PartitionProcessor}. */ class PartitionProcessorImpl implements PartitionProcessor { + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } + private static final Logger logger = LoggerFactory.getLogger(PartitionProcessorImpl.class); private final ProcessorSettings settings; @@ -78,7 +82,7 @@ public PartitionProcessorImpl(ChangeFeedObserver observer, this.options = ModelBridgeInternal.createChangeFeedRequestOptionsForChangeFeedState(state); this.options.setMaxItemCount(settings.getMaxItemCount()); // For pk version, merge is not support, exclude it from the capabilities header - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor() + changeFeedOptionsAccessor() .setHeader( this.options, HttpConstants.HttpHeaders.SDK_SUPPORTED_CAPABILITIES, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientMetricsDiagnosticsHandler.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientMetricsDiagnosticsHandler.java index 1634d8d86b3d..52e139e7f442 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientMetricsDiagnosticsHandler.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientMetricsDiagnosticsHandler.java @@ -14,8 +14,6 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; public final class ClientMetricsDiagnosticsHandler implements CosmosDiagnosticsHandler { - private static final ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor = - ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); private final WeakReference clientRef; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java index e18228012533..f5f4f5797689 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetry.java @@ -37,6 +37,10 @@ * first metadata fetch and disposed immediately after; no long-lived HTTP client is kept.

*/ public class ClientTelemetry { + private static ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor() { + return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); + } + public final static String VM_ID_PREFIX = "vmId_"; public final static boolean DEFAULT_CLIENT_TELEMETRY_ENABLED = false; private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @@ -91,12 +95,8 @@ public ClientTelemetry(DiagnosticsClientContext diagnosticsClientContext, checkNotNull(clientTelemetryConfig, "Argument 'clientTelemetryConfig' cannot be null"); this.clientTelemetryConfig = clientTelemetryConfig; - ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor - clientTelemetryAccessor = ImplementationBridgeHelpers - .CosmosClientTelemetryConfigHelper - .getCosmosClientTelemetryConfigAccessor(); - assert(clientTelemetryAccessor != null); - this.clientMetricsEnabled = clientTelemetryAccessor + assert(clientTelemetryConfigAccessor() != null); + this.clientMetricsEnabled = clientTelemetryConfigAccessor() .isClientMetricsEnabled(clientTelemetryConfig); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetryMetrics.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetryMetrics.java index be4b0e499b51..250f8097926f 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetryMetrics.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/clienttelemetry/ClientTelemetryMetrics.java @@ -54,15 +54,19 @@ import java.util.concurrent.atomic.AtomicLong; public final class ClientTelemetryMetrics { + private static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor(); + } + private static final Logger logger = LoggerFactory.getLogger(ClientTelemetryMetrics.class); - private static final ImplementationBridgeHelpers.CosmosAsyncClientHelper.CosmosAsyncClientAccessor clientAccessor = - ImplementationBridgeHelpers.CosmosAsyncClientHelper.getCosmosAsyncClientAccessor(); - private static final - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); - private static final - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor diagnosticsCtxAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); private static final PercentEscaper PERCENT_ESCAPER = new PercentEscaper("_-/.", false); @@ -158,10 +162,10 @@ public static void recordOperation( diagnosticsContext.getOperationId(), diagnosticsContext.getTotalRequestCharge(), diagnosticsContext.getDuration(), - diagnosticsCtxAccessor.getOpCountPerEvaluation(diagnosticsContext), - diagnosticsCtxAccessor.getRetriedOpCountPerEvaluation(diagnosticsContext), - diagnosticsCtxAccessor.getGlobalOpCount(diagnosticsContext), - diagnosticsCtxAccessor.getTargetMaxMicroBatchSize(diagnosticsContext) + ctxAccessor().getOpCountPerEvaluation(diagnosticsContext), + ctxAccessor().getRetriedOpCountPerEvaluation(diagnosticsContext), + ctxAccessor().getGlobalOpCount(diagnosticsContext), + ctxAccessor().getTargetMaxMicroBatchSize(diagnosticsContext) ); } @@ -229,17 +233,17 @@ private static void recordOperation( Long globalOpCount, Integer targetMaxMicroBatchSize) { - boolean isClientTelemetryMetricsEnabled = clientAccessor.shouldEnableEmptyPageDiagnostics(client); + boolean isClientTelemetryMetricsEnabled = clientAccessor().shouldEnableEmptyPageDiagnostics(client); if (!hasAnyActualMeterRegistry() || !isClientTelemetryMetricsEnabled) { return; } - Tag clientCorrelationTag = clientAccessor.getClientCorrelationTag(client); - String accountTagValue = clientAccessor.getAccountTagValue(client); + Tag clientCorrelationTag = clientAccessor().getClientCorrelationTag(client); + String accountTagValue = clientAccessor().getAccountTagValue(client); - EnumSet metricTagNames = clientAccessor.getMetricTagNames(client); - EnumSet metricCategories = clientAccessor.getMetricCategories(client); + EnumSet metricTagNames = clientAccessor().getMetricTagNames(client); + EnumSet metricCategories = clientAccessor().getMetricCategories(client); Set contactedRegions = Collections.emptySet(); if (metricCategories.contains(MetricCategory.OperationDetails)) { @@ -445,7 +449,7 @@ public void recordOperation( CosmosDiagnosticsContext diagnosticsContext, Set contactedRegions) { - CosmosMeterOptions callsOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions callsOptions = clientAccessor().getMeterOptions( cosmosAsyncClient, CosmosMetricName.OPERATION_SUMMARY_CALLS); @@ -459,7 +463,7 @@ public void recordOperation( operationsCounter.increment(); } - CosmosMeterOptions requestChargeOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions requestChargeOptions = clientAccessor().getMeterOptions( cosmosAsyncClient, CosmosMetricName.OPERATION_SUMMARY_REQUEST_CHARGE); if (requestChargeOptions.isEnabled()) { @@ -476,7 +480,7 @@ public void recordOperation( } if (this.metricCategories.contains(MetricCategory.OperationDetails)) { - CosmosMeterOptions regionsOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions regionsOptions = clientAccessor().getMeterOptions( cosmosAsyncClient, CosmosMetricName.OPERATION_DETAILS_REGIONS_CONTACTED); if (regionsOptions.isEnabled()) { @@ -497,7 +501,7 @@ public void recordOperation( this.recordItemCounts(cosmosAsyncClient, maxItemCount, actualItemCount); } - CosmosMeterOptions latencyOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions latencyOptions = clientAccessor().getMeterOptions( cosmosAsyncClient, CosmosMetricName.OPERATION_SUMMARY_LATENCY); if (latencyOptions.isEnabled()) { @@ -514,7 +518,7 @@ public void recordOperation( for (CosmosDiagnostics diagnostics: diagnosticsContext.getDiagnostics()) { Collection clientSideRequestStatistics = - diagnosticsAccessor.getClientSideRequestStatistics(diagnostics); + diagAccessor().getClientSideRequestStatistics(diagnostics); if (clientSideRequestStatistics != null) { for (ClientSideRequestStatistics requestStatistics : clientSideRequestStatistics) { @@ -558,7 +562,7 @@ public void recordOperation( } } - FeedResponseDiagnostics feedDiagnostics = diagnosticsAccessor + FeedResponseDiagnostics feedDiagnostics = diagAccessor() .getFeedResponseDiagnostics(diagnostics); if (feedDiagnostics == null) { @@ -585,7 +589,7 @@ private void recordQueryPlanDiagnostics( createQueryPlanTags(metricTagNames) ); - CosmosMeterOptions requestsOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions requestsOptions = clientAccessor().getMeterOptions( cosmosAsyncClient, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_REQUESTS); if (requestsOptions.isEnabled() && @@ -602,7 +606,7 @@ private void recordQueryPlanDiagnostics( Duration latency = queryPlanDiagnostics.getDuration(); if (latency != null) { - CosmosMeterOptions latencyOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions latencyOptions = clientAccessor().getMeterOptions( cosmosAsyncClient, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_LATENCY); if (latencyOptions.isEnabled() && @@ -632,7 +636,7 @@ private void recordRequestPayloadSizes( int requestPayloadSizeInBytes, int responsePayloadSizeInBytes ) { - CosmosMeterOptions reqSizeOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions reqSizeOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_SIZE_REQUEST); if (reqSizeOptions.isEnabled() && @@ -649,7 +653,7 @@ private void recordRequestPayloadSizes( requestPayloadSizeMeter.record(requestPayloadSizeInBytes); } - CosmosMeterOptions rspSizeOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions rspSizeOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_SIZE_RESPONSE); if (rspSizeOptions.isEnabled() && @@ -674,7 +678,7 @@ private void recordItemCounts( ) { if (maxItemCount > 0 && this.metricCategories.contains(MetricCategory.OperationDetails)) { - CosmosMeterOptions maxItemCountOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions maxItemCountOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.OPERATION_DETAILS_MAX_ITEM_COUNT); if (maxItemCountOptions.isEnabled()) { @@ -690,7 +694,7 @@ private void recordItemCounts( maxItemCountMeter.record(Math.max(0, Math.min(maxItemCount, 100_000d))); } - CosmosMeterOptions actualItemCountOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions actualItemCountOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.OPERATION_DETAILS_ACTUAL_ITEM_COUNT); if (actualItemCountOptions.isEnabled()) { @@ -841,7 +845,7 @@ private void recordRntbdEndpointStatistics( return; } - CosmosMeterOptions acquiredOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions acquiredOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.LEGACY_DIRECT_ENDPOINT_STATISTICS_ACQUIRED); if (acquiredOptions.isEnabled()) { @@ -858,7 +862,7 @@ private void recordRntbdEndpointStatistics( acquiredChannelsMeter.record(endpointStatistics.getAcquiredChannels()); } - CosmosMeterOptions availableOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions availableOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.LEGACY_DIRECT_ENDPOINT_STATISTICS_AVAILABLE); if (availableOptions.isEnabled()) { @@ -874,7 +878,7 @@ private void recordRntbdEndpointStatistics( availableChannelsMeter.record(endpointStatistics.getAvailableChannels()); } - CosmosMeterOptions inflightOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions inflightOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.LEGACY_DIRECT_ENDPOINT_STATISTICS_INFLIGHT); if (inflightOptions.isEnabled()) { @@ -902,7 +906,7 @@ private void recordRequestTimeline( return; } - CosmosMeterOptions timelineOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions timelineOptions = clientAccessor().getMeterOptions( client, name); if (!timelineOptions.isEnabled() || @@ -963,7 +967,7 @@ private void recordStoreResponseStatistics( if (backendLatency != null) { - CosmosMeterOptions beLatencyOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions beLatencyOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_BACKEND_LATENCY); if (beLatencyOptions.isEnabled() && @@ -981,7 +985,7 @@ private void recordStoreResponseStatistics( } } - CosmosMeterOptions ruOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions ruOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_REQUEST_CHARGE); if (ruOptions.isEnabled() && @@ -999,7 +1003,7 @@ private void recordStoreResponseStatistics( requestChargeMeter.record(Math.min(requestCharge, 100_000d)); } - CosmosMeterOptions latencyOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions latencyOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_LATENCY); if (latencyOptions.isEnabled() && @@ -1018,7 +1022,7 @@ private void recordStoreResponseStatistics( } } - CosmosMeterOptions reqOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions reqOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_REQUESTS); if (reqOptions.isEnabled() && @@ -1032,7 +1036,7 @@ private void recordStoreResponseStatistics( requestCounter.increment(); } - CosmosMeterOptions actualItemCountOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions actualItemCountOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_ACTUAL_ITEM_COUNT); @@ -1050,7 +1054,7 @@ private void recordStoreResponseStatistics( actualItemCountMeter.record(Math.max(0, Math.min(actualItemCount, 100_000d))); } - CosmosMeterOptions opCountPerEvaluationOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions opCountPerEvaluationOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_BULK_OP_COUNT_PER_EVALUATION ); @@ -1069,7 +1073,7 @@ private void recordStoreResponseStatistics( opCountPerEvaluationMeter.record(Math.max(0, Math.min(opCountPerEvaluation, Double.MAX_VALUE))); } - CosmosMeterOptions opRetriedCountPerEvaluationOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions opRetriedCountPerEvaluationOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_BULK_OP_RETRIED_COUNT_PER_EVALUATION ); @@ -1088,7 +1092,7 @@ private void recordStoreResponseStatistics( opRetriedCountPerEvaluationMeter.record(Math.max(0, Math.min(opRetriedCountPerEvaluation, Double.MAX_VALUE))); } - CosmosMeterOptions globalOpCountOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions globalOpCountOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_BULK_GLOBAL_OP_COUNT ); @@ -1107,8 +1111,7 @@ private void recordStoreResponseStatistics( globalOpCountMeter.record(Math.max(0, Math.min(globalOpCount, Double.MAX_VALUE))); } - - CosmosMeterOptions targetMaxMicroBatchSizeOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions targetMaxMicroBatchSizeOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_DIRECT_BULK_TARGET_MAX_MICRO_BATCH_SIZE ); @@ -1195,7 +1198,7 @@ private void recordGatewayStatistics( gatewayStats.getResponsePayloadSizeInBytes() ); - CosmosMeterOptions reqOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions reqOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_REQUESTS); if (reqOptions.isEnabled() && @@ -1209,7 +1212,7 @@ private void recordGatewayStatistics( requestCounter.increment(); } - CosmosMeterOptions ruOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions ruOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_REQUEST_CHARGE); if (ruOptions.isEnabled() && @@ -1228,7 +1231,7 @@ private void recordGatewayStatistics( } if (latency != null) { - CosmosMeterOptions latencyOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions latencyOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_LATENCY); if (latencyOptions.isEnabled() && @@ -1245,7 +1248,7 @@ private void recordGatewayStatistics( } } - CosmosMeterOptions actualItemCountOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions actualItemCountOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_ACTUAL_ITEM_COUNT); @@ -1263,7 +1266,7 @@ private void recordGatewayStatistics( actualItemCountMeter.record(Math.max(0, Math.min(actualItemCount, 100_000d))); } - CosmosMeterOptions opCountPerEvaluationOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions opCountPerEvaluationOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_BULK_OP_COUNT_PER_EVALUATION ); @@ -1282,7 +1285,7 @@ private void recordGatewayStatistics( opCountPerEvaluationMeter.record(Math.max(0, Math.min(opCountPerEvaluation, Double.MAX_VALUE))); } - CosmosMeterOptions opRetriedCountPerEvaluationOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions opRetriedCountPerEvaluationOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_BULK_OP_RETRIED_COUNT_PER_EVALUATION ); @@ -1301,7 +1304,7 @@ private void recordGatewayStatistics( opRetriedCountPerEvaluationMeter.record(Math.max(0, Math.min(opRetriedCountPerEvaluation, Double.MAX_VALUE))); } - CosmosMeterOptions globalOpCountOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions globalOpCountOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_BULK_GLOBAL_OP_COUNT ); @@ -1320,7 +1323,7 @@ private void recordGatewayStatistics( globalOpCountMeter.record(Math.max(0, Math.min(globalOpCount, Double.MAX_VALUE))); } - CosmosMeterOptions targetMaxMicroBatchSizeOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions targetMaxMicroBatchSizeOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.REQUEST_SUMMARY_GATEWAY_BULK_TARGET_MAX_MICRO_BATCH_SIZE ); @@ -1384,7 +1387,7 @@ private void recordAddressResolutionStatistics( addressResolutionStatistics.getStartTimeUTC(), addressResolutionStatistics.getEndTimeUTC()); - CosmosMeterOptions latencyOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions latencyOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.DIRECT_ADDRESS_RESOLUTION_LATENCY); if (latencyOptions.isEnabled() && @@ -1400,7 +1403,7 @@ private void recordAddressResolutionStatistics( addressResolutionLatencyMeter.record(latency); } - CosmosMeterOptions reqOptions = clientAccessor.getMeterOptions( + CosmosMeterOptions reqOptions = clientAccessor().getMeterOptions( client, CosmosMetricName.DIRECT_ADDRESS_RESOLUTION_REQUESTS); if (reqOptions.isEnabled() && diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java index e62d7b8c6ca4..7e168bac4437 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GatewayAddressCache.java @@ -77,6 +77,10 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; public class GatewayAddressCache implements IAddressCache { + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } + private static Duration minDurationBeforeEnforcingCollectionRoutingMapRefresh = Duration.ofSeconds(30); private final static Logger logger = LoggerFactory.getLogger(GatewayAddressCache.class); @@ -1220,9 +1224,7 @@ private static void logAddressResolutionEnd( String errorMessage, long transportRequestId) { if (request.requestContext.cosmosDiagnostics != null) { - ImplementationBridgeHelpers - .CosmosDiagnosticsHelper - .getCosmosDiagnosticsAccessor() + diagAccessor() .recordAddressResolutionEnd(request, identifier, errorMessage, transportRequestId); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java index 00905682b4d1..e6fe9db42ff4 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GlobalAddressResolver.java @@ -43,6 +43,14 @@ import java.util.stream.Collectors; public class GlobalAddressResolver implements IAddressResolver { + private static ImplementationBridgeHelpers.CosmosContainerIdentityHelper.CosmosContainerIdentityAccessor containerIdentityAccessor() { + return ImplementationBridgeHelpers.CosmosContainerIdentityHelper.getCosmosContainerIdentityAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosContainerProactiveInitConfigHelper.CosmosContainerProactiveInitConfigAccessor proactiveInitConfigAccessor() { + return ImplementationBridgeHelpers.CosmosContainerProactiveInitConfigHelper.getCosmosContainerProactiveInitConfigAccessor(); + } + private static final Logger logger = LoggerFactory.getLogger(GlobalAddressResolver.class); private final static int MaxBackupReadRegions = 3; @@ -113,9 +121,7 @@ public Flux submitOpenConnectionTasksAndInitCaches(CosmosContainerProactiv .collectionCache .resolveByNameAsync( null, - ImplementationBridgeHelpers - .CosmosContainerIdentityHelper - .getCosmosContainerIdentityAccessor() + containerIdentityAccessor() .getContainerLink(cosmosContainerIdentity), null) .flatMapMany(collection -> { @@ -132,9 +138,7 @@ public Flux submitOpenConnectionTasksAndInitCaches(CosmosContainerProactiv null) .flatMap(valueHolder -> { - String containerLink = ImplementationBridgeHelpers - .CosmosContainerIdentityHelper - .getCosmosContainerIdentityAccessor() + String containerLink = containerIdentityAccessor() .getContainerLink(cosmosContainerIdentity); if (valueHolder == null || valueHolder.v == null || valueHolder.v.isEmpty()) { @@ -168,9 +172,7 @@ public Flux submitOpenConnectionTasksAndInitCaches(CosmosContainerProactiv AddressInformation addressInformation = collectionToAddresses.right; - Map containerPropertiesMap = ImplementationBridgeHelpers - .CosmosContainerProactiveInitConfigHelper - .getCosmosContainerProactiveInitConfigAccessor() + Map containerPropertiesMap = proactiveInitConfigAccessor() .getContainerPropertiesMap(proactiveContainerInitConfig); ContainerDirectConnectionMetadata containerDirectConnectionMetadata = containerPropertiesMap diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GoneAndRetryWithRetryPolicy.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GoneAndRetryWithRetryPolicy.java index 04ba424975e3..5bfe3d8078dd 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GoneAndRetryWithRetryPolicy.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/GoneAndRetryWithRetryPolicy.java @@ -34,6 +34,10 @@ public class GoneAndRetryWithRetryPolicy implements IRetryPolicy { + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } + private final static Logger logger = LoggerFactory.getLogger(GoneAndRetryWithRetryPolicy.class); private final GoneRetryPolicy goneRetryPolicy; private final RetryWithRetryPolicy retryWithRetryPolicy; @@ -44,9 +48,6 @@ public class GoneAndRetryWithRetryPolicy implements IRetryPolicy { private RetryContext retryContext; private static final ThreadLocalRandom random = ThreadLocalRandom.current(); - private static final ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionsAccessor - = ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); - public GoneAndRetryWithRetryPolicy(RxDocumentServiceRequest request, Integer waitTimeInSeconds) { this.retryContext = BridgeInternal.getRetryContext(request.requestContext.cosmosDiagnostics); this.goneRetryPolicy = new GoneRetryPolicy( @@ -212,7 +213,7 @@ public Mono shouldRetry(Exception exception) { // wrapping this is as a 408 doesn't affect retry semantics in ClientRetryPolicy layer for writes // this will also allow PPAF to mark such a partitionKeyRange as unavailable for that region - exceptionToThrow = cosmosExceptionsAccessor.createCosmosException(HttpConstants.StatusCodes.REQUEST_TIMEOUT, exception); + exceptionToThrow = cosmosExceptionAccessor().createCosmosException(HttpConstants.StatusCodes.REQUEST_TIMEOUT, exception); GoneException goneException = Utils.as(exception, GoneException.class); BridgeInternal.setSubStatusCode(exceptionToThrow, goneException.getSubStatusCode()); @@ -221,7 +222,7 @@ public Mono shouldRetry(Exception exception) { Quadruple.with(true, true, Duration.ofMillis(0), this.attemptCount.get()))); } else if (exception instanceof LeaseNotFoundException) { - exceptionToThrow = cosmosExceptionsAccessor.createCosmosException(HttpConstants.StatusCodes.SERVICE_UNAVAILABLE, exception); + exceptionToThrow = cosmosExceptionAccessor().createCosmosException(HttpConstants.StatusCodes.SERVICE_UNAVAILABLE, exception); LeaseNotFoundException leaseNotFoundException = Utils.as(exception, LeaseNotFoundException.class); BridgeInternal.setSubStatusCode(exceptionToThrow, leaseNotFoundException.getSubStatusCode()); @@ -323,7 +324,6 @@ class RetryWithRetryPolicy implements IRetryPolicy { private final int waitTimeInSeconds; private final RetryContext retryContext; - public RetryWithRetryPolicy(Integer waitTimeInSeconds, RetryContext retryContext) { this.waitTimeInSeconds = waitTimeInSeconds != null ? waitTimeInSeconds : DEFAULT_WAIT_TIME_IN_SECONDS; this.retryContext = retryContext; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RequestHelper.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RequestHelper.java index ec5a6e46476d..973a0ce11a1a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RequestHelper.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RequestHelper.java @@ -19,6 +19,10 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; public class RequestHelper { + private static ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor() { + return ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + } + public static ReadConsistencyStrategy getReadConsistencyStrategyToUse( GatewayServiceConfigurationReader serviceConfigReader, RxDocumentServiceRequest request) { @@ -52,9 +56,7 @@ public static ReadConsistencyStrategy getReadConsistencyStrategyToUse( if (!Strings.isNullOrEmpty(requestReadConsistencyStrategyHeaderValue)) { requestLevelReadConsistencyStrategy = - ImplementationBridgeHelpers - .ReadConsistencyStrategyHelper - .getReadConsistencyStrategyAccessor() + readConsistencyStrategyAccessor() .createFromServiceSerializedFormat(requestReadConsistencyStrategyHeaderValue); if (requestLevelReadConsistencyStrategy == null) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java index d6f568c9f3d9..fda814a82c3b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/RntbdTransportClient.java @@ -73,6 +73,14 @@ @JsonSerialize(using = RntbdTransportClient.JsonSerializer.class) public class RntbdTransportClient extends TransportClient { + private static ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor clientTelemetryConfigAccessor() { + return ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } + // region Fields private static final String TAG_NAME = RntbdTransportClient.class.getSimpleName(); @@ -376,9 +384,7 @@ public Mono invokeStoreAsync(final Uri addressUri, final RxDocume OperationCancelledException operationCancelledException = new OperationCancelledException(record.toString(), record.args().physicalAddressUri().getURI()); - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .setRequestUri(operationCancelledException, addressUri); this.populateExceptionWithRequestDetails(operationCancelledException, record); @@ -430,21 +436,15 @@ private void throwIfClosed() { public EnumSet getMetricCategories() { return this.metricConfig != null ? - ImplementationBridgeHelpers - .CosmosClientTelemetryConfigHelper - .getCosmosClientTelemetryConfigAccessor() + clientTelemetryConfigAccessor() .getMetricCategories(this.metricConfig) : MetricCategory.DEFAULT_CATEGORIES; } public CosmosMeterOptions getMeterOptions(CosmosMetricName name) { return this.metricConfig != null ? - ImplementationBridgeHelpers - .CosmosClientTelemetryConfigHelper - .getCosmosClientTelemetryConfigAccessor() + clientTelemetryConfigAccessor() .getMeterOptions(this.metricConfig, name) : - ImplementationBridgeHelpers - .CosmosClientTelemetryConfigHelper - .getCosmosClientTelemetryConfigAccessor() + clientTelemetryConfigAccessor() .createDisabledMeterOptions(name); } @@ -452,9 +452,7 @@ private void populateExceptionWithRequestDetails(CosmosException cosmosException RxDocumentServiceRequest request = record.args().serviceRequest(); BridgeInternal.setServiceEndpointStatistics(cosmosException, record.serviceEndpointStatistics()); - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .setRntbdChannelStatistics(cosmosException, record.channelStatistics()); BridgeInternal.setRntbdRequestLength(cosmosException, record.requestLength()); BridgeInternal.setRntbdResponseLength(cosmosException, record.responseLength()); @@ -463,16 +461,12 @@ private void populateExceptionWithRequestDetails(CosmosException cosmosException RequestTimeline requestTimeline = record.takeTimelineSnapshot(); BridgeInternal.setRequestTimeline(cosmosException, requestTimeline); BridgeInternal.setSendingRequestStarted(cosmosException, record.hasSendingRequestStarted()); - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .setFaultInjectionRuleId( cosmosException, request.faultInjectionRequestContext.getFaultInjectionRuleId(record.transportRequestId())); - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .setFaultInjectionEvaluationResults( cosmosException, request.faultInjectionRequestContext.getFaultInjectionRuleEvaluationResults(record.transportRequestId())); @@ -582,7 +576,6 @@ public static final class Options { @JsonProperty() private final boolean timeoutDetectionEnabled; - /** * Used during Rntbd health check flow. * Transit timeout can be a normal symptom under high CPU load. diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/ServerStoreModel.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/ServerStoreModel.java index 07a32cb53fc4..96649ed151a9 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/ServerStoreModel.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/ServerStoreModel.java @@ -3,7 +3,6 @@ package com.azure.cosmos.implementation.directconnectivity; - import com.azure.cosmos.BridgeInternal; import com.azure.cosmos.ConsistencyLevel; import com.azure.cosmos.CosmosContainerProactiveInitConfig; @@ -27,6 +26,10 @@ import java.util.List; public class ServerStoreModel implements RxStoreModel { + private static ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor() { + return ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + } + private final StoreClient storeClient; public ServerStoreModel(StoreClient storeClient) { @@ -57,9 +60,7 @@ public Mono processMessage(RxDocumentServiceRequest r if (!Strings.isNullOrEmpty(requestReadConsistencyStrategyHeaderValue)) { ReadConsistencyStrategy requestReadConsistencyStrategy; - if ((requestReadConsistencyStrategy = ImplementationBridgeHelpers - .ReadConsistencyStrategyHelper - .getReadConsistencyStrategyAccessor() + if ((requestReadConsistencyStrategy = readConsistencyStrategyAccessor() .createFromServiceSerializedFormat(requestReadConsistencyStrategyHeaderValue)) == null) { return Mono.error(new BadRequestException( diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreReader.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreReader.java index e5373f1d0ef7..78491e1c85d6 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreReader.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreReader.java @@ -50,6 +50,10 @@ import static com.azure.cosmos.implementation.Exceptions.isSubStatusCode; public class StoreReader { + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } + private final Logger logger = LoggerFactory.getLogger(StoreReader.class); private final TransportClient transportClient; private final AddressSelector addressSelector; @@ -259,7 +263,6 @@ private Flux> readFromReplicas(List resultCollect replicasToRead.set(readStoreTasks.size() >= replicasToRead.get() ? 0 : replicasToRead.get() - readStoreTasks.size()); - List> storeResult = readStoreTasks .stream() .map(item -> toStoreResult(entity, item, readMode, requiresValidLsn, replicaStatusList)) @@ -365,9 +368,7 @@ void createAndRecordStoreResultForCancelledRequest( // record the diagnostics for in-progress requests for (CosmosException cosmosException : request.requestContext.rntbdCancelledRequestMap.values()) { Uri storePhysicalAddress = - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .getRequestUri(cosmosException); this.createAndRecordStoreResult( @@ -779,7 +780,6 @@ private Pair, Uri> readFromStoreAsync( } } - private static Mono completeActivity(Mono task, Object activity) { // TODO: client statistics // https://msdata.visualstudio.com/CosmosDB/_workitems/edit/258624 @@ -951,9 +951,7 @@ StoreResult createStoreResult(StoreResponse storeResponse, long globalNRegionCommittedLSN = -1; if (replicaStatusList != null) { - ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor() + cosmosExceptionAccessor() .getReplicaStatusList(cosmosException) .putAll(replicaStatusList); } @@ -1050,7 +1048,7 @@ StoreResult createStoreResult(StoreResponse storeResponse, && lsn >= 0), // TODO: verify where exception.RequestURI is supposed to be set in .Net /* storePhysicalAddress: */ storePhysicalAddress == null - ? ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor().getRequestUri(cosmosException) + ? cosmosExceptionAccessor().getRequestUri(cosmosException) : storePhysicalAddress, /* globalCommittedLSN: */ globalCommittedLSN, /* globalNRegionCommittedLSN: */ globalNRegionCommittedLSN, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreResponseDiagnostics.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreResponseDiagnostics.java index 936913f98cb9..6029191be23a 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreResponseDiagnostics.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/StoreResponseDiagnostics.java @@ -24,12 +24,11 @@ * This represents diagnostics from store response OR from cosmos exception */ public class StoreResponseDiagnostics { + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } + final static Logger logger = LoggerFactory.getLogger(StoreResponseDiagnostics.class); - private final static ImplementationBridgeHelpers - .CosmosExceptionHelper - .CosmosExceptionAccessor cosmosExceptionAccessor = ImplementationBridgeHelpers - .CosmosExceptionHelper - .getCosmosExceptionAccessor(); private final String partitionKeyRangeId; private final String sessionTokenAsString; @@ -113,15 +112,15 @@ private StoreResponseDiagnostics(CosmosException e, RxDocumentServiceRequest rxD this.requestTimeline = BridgeInternal.getRequestTimeline(e); this.channelAcquisitionTimeline = BridgeInternal.getChannelAcqusitionTimeline(e); this.rntbdEndpointStatistics = BridgeInternal.getServiceEndpointStatistics(e); - this.rntbdChannelStatistics = cosmosExceptionAccessor.getRntbdChannelStatistics(e); + this.rntbdChannelStatistics = cosmosExceptionAccessor().getRntbdChannelStatistics(e); this.rntbdRequestLength = BridgeInternal.getRntbdRequestLength(e); this.rntbdResponseLength = BridgeInternal.getRntbdResponseLength(e); this.exceptionMessage = BridgeInternal.getInnerErrorMessage(e); this.exceptionResponseHeaders = e.getResponseHeaders() != null ? e.getResponseHeaders().toString() : null; - this.replicaStatusList = cosmosExceptionAccessor.getReplicaStatusList(e); - this.faultInjectionRuleId = cosmosExceptionAccessor.getFaultInjectionRuleId(e); - this.faultInjectionEvaluationResults = cosmosExceptionAccessor.getFaultInjectionEvaluationResults(e); - Uri requestUri = cosmosExceptionAccessor.getRequestUri(e); + this.replicaStatusList = cosmosExceptionAccessor().getReplicaStatusList(e); + this.faultInjectionRuleId = cosmosExceptionAccessor().getFaultInjectionRuleId(e); + this.faultInjectionEvaluationResults = cosmosExceptionAccessor().getFaultInjectionEvaluationResults(e); + Uri requestUri = cosmosExceptionAccessor().getRequestUri(e); if (requestUri != null) { this.endpoint = requestUri.getURIAsString(); } else { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/ProactiveOpenConnectionsProcessor.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/ProactiveOpenConnectionsProcessor.java index a1740a127c30..7e26ad1e3828 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/ProactiveOpenConnectionsProcessor.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/directconnectivity/rntbd/ProactiveOpenConnectionsProcessor.java @@ -37,6 +37,10 @@ public final class ProactiveOpenConnectionsProcessor implements Closeable { + private static ImplementationBridgeHelpers.CosmosContainerIdentityHelper.CosmosContainerIdentityAccessor containerIdentityAccessor() { + return ImplementationBridgeHelpers.CosmosContainerIdentityHelper.getCosmosContainerIdentityAccessor(); + } + private static final Logger logger = LoggerFactory.getLogger(ProactiveOpenConnectionsProcessor.class); private Sinks.Many openConnectionsTaskSink; private final ConcurrentHashMap> endpointsUnderMonitorMap; @@ -167,9 +171,7 @@ public void recordOpenConnectionsAndInitCachesCompleted(List { + private static ImplementationBridgeHelpers.PriorityLevelHelper.PriorityLevelAccessor priorityLevelAccessor() { + return ImplementationBridgeHelpers.PriorityLevelHelper.getPriorityLevelAccessor(); + } + // region Fields private static final String URL_TRIM = "/"; @@ -793,9 +797,7 @@ private void addPriorityLevel(final Map headers) } this.getPriorityLevel().setValue( - ImplementationBridgeHelpers - .PriorityLevelHelper - .getPriorityLevelAccessor() + priorityLevelAccessor() .getPriorityValue(priorityLevel) ); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java index 7fa6ba8d3315..15527c4e2c89 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/HttpClientConfig.java @@ -14,8 +14,10 @@ * Helper class internally used for instantiating reactor netty http client. */ public class HttpClientConfig { - private static final ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor = - ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor(); + private static ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor() { + return ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor(); + } + private final Configs configs; private Duration connectionAcquireTimeout = Configs.getConnectionAcquireTimeout(); private int maxPoolSize = Configs.getDefaultHttpPoolSize(); @@ -199,6 +201,6 @@ public String toDiagnosticsString() { connectionAcquireTimeout, gwV2Cto, proxy != null, - http2ConnectionConfig == null ? null : httpCfgAccessor.toDiagnosticsString(http2ConnectionConfig)); + http2ConnectionConfig == null ? null : httpCfgAccessor().toDiagnosticsString(http2ConnectionConfig)); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java index 04ee87d22594..7a51e5d805ff 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/http/ReactorNettyClient.java @@ -43,6 +43,10 @@ * HttpClient that is implemented using reactor-netty. */ public class ReactorNettyClient implements HttpClient { + private static ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor() { + return ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor(); + } + private static final boolean leakDetectionDebuggingEnabled = ResourceLeakDetector.getLevel().ordinal() >= ResourceLeakDetector.Level.ADVANCED.ordinal(); private static final String REACTOR_NETTY_REQUEST_RECORD_KEY = "reactorNettyRequestRecordKey"; @@ -136,10 +140,8 @@ private void configureChannelPipelineHandlers() { .maxChunkSize(this.httpClientConfig.getMaxChunkSize()) .validateHeaders(true)); - ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor http2CfgAccessor = - ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor(); Http2ConnectionConfig http2Cfg = httpClientConfig.getHttp2ConnectionConfig(); - if (http2CfgAccessor.isEffectivelyEnabled(http2Cfg)) { + if (httpCfgAccessor().isEffectivelyEnabled(http2Cfg)) { this.httpClient = this.httpClient .secure(sslContextSpec -> sslContextSpec.sslContext( @@ -151,7 +153,7 @@ private void configureChannelPipelineHandlers() { .http2Settings(settings -> settings .initialWindowSize(1024 * 1024) // 1MB initial window size .maxFrameSize(64 * 1024) // 64KB max frame size - .maxConcurrentStreams(http2CfgAccessor.getEffectiveMaxConcurrentStreams(http2Cfg)) // Increased from default 30 + .maxConcurrentStreams(httpCfgAccessor().getEffectiveMaxConcurrentStreams(http2Cfg)) // Increased from default 30 ) .doOnConnected((connection -> { // The response header clean up pipeline is being added due to an error getting when calling gateway: diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/AggregateDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/AggregateDocumentQueryExecutionContext.java index 69f8af7c16cc..8592ab2d26ab 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/AggregateDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/AggregateDocumentQueryExecutionContext.java @@ -26,13 +26,14 @@ public class AggregateDocumentQueryExecutionContext implements IDocumentQueryExecutionComponent{ + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); public static final String PAYLOAD_PROPERTY_NAME = "payload"; private final boolean isValueAggregateQuery; private final IDocumentQueryExecutionComponent component; @@ -71,13 +72,13 @@ public Flux> drainAsync(int maxPageSize) { for(FeedResponse page : superList) { diagnosticsList.addAll( - diagnosticsAccessor.getClientSideRequestStatisticsForQueryPipelineAggregations(page.getCosmosDiagnostics())); + diagAccessor().getClientSideRequestStatisticsForQueryPipelineAggregations(page.getCosmosDiagnostics())); if (page.getResults().size() == 0) { headers.put(HttpConstants.HttpHeaders.REQUEST_CHARGE, Double.toString(requestCharge)); - FeedResponse frp = feedResponseAccessor.createFeedResponse( + FeedResponse frp = feedResponseAccessor().createFeedResponse( aggregateResults, headers, null); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), diagnosticsList); return frp; } @@ -100,14 +101,14 @@ public Flux> drainAsync(int maxPageSize) { } headers.put(HttpConstants.HttpHeaders.REQUEST_CHARGE, Double.toString(requestCharge)); - FeedResponse frp = feedResponseAccessor.createFeedResponse( + FeedResponse frp = feedResponseAccessor().createFeedResponse( aggregateResults, headers, null); if(!queryMetricsMap.isEmpty()) { for(Map.Entry entry: queryMetricsMap.entrySet()) { BridgeInternal.putQueryMetricsIntoMap(frp, entry.getKey(), entry.getValue()); } } - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), diagnosticsList); return frp; }).flux(); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ChangeFeedFetcher.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ChangeFeedFetcher.java index ed94c7232a6a..d39f5dfc059c 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ChangeFeedFetcher.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ChangeFeedFetcher.java @@ -37,8 +37,10 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; class ChangeFeedFetcher extends Fetcher { - private final static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } + private final ChangeFeedState changeFeedState; private final Supplier createRequestFunc; private final Supplier feedRangeContinuationRetryPolicySupplier; @@ -160,7 +162,7 @@ protected String applyServerResponseContinuation( RxDocumentServiceRequest request, FeedResponse response) { - boolean isNoChanges = feedResponseAccessor.getNoChanges(response); + boolean isNoChanges = feedResponseAccessor().getNoChanges(response); boolean shouldMoveToNextTokenOnETagReplace = !isNoChanges && !this.completeAfterAllCurrentChangesRetrieved && this.endLSN == null; return this.changeFeedState.applyServerResponseContinuation( serverContinuationToken, request, shouldMoveToNextTokenOnETagReplace); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DCountDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DCountDocumentQueryExecutionContext.java index cce4826b3ec2..a1e0788ab9ab 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DCountDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DCountDocumentQueryExecutionContext.java @@ -29,9 +29,9 @@ public class DCountDocumentQueryExecutionContext implements IDocumentQueryExecutionComponent { - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } private final IDocumentQueryExecutionComponent component; private final QueryInfo info; @@ -75,7 +75,7 @@ public Flux> drainAsync(int maxPageSize) { for (FeedResponse page : superList) { diagnostics.addAll( - diagnosticsAccessor.getClientSideRequestStatisticsForQueryPipelineAggregations(page.getCosmosDiagnostics())); + diagAccessor().getClientSideRequestStatisticsForQueryPipelineAggregations(page.getCosmosDiagnostics())); count += page.getResults().size(); requestCharge += page.getRequestCharge(); QueryMetrics.mergeQueryMetricsMap(queryMetricsMap, @@ -99,7 +99,7 @@ public Flux> drainAsync(int maxPageSize) { queryMetricsMap, null, false, false, null); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), diagnostics); return BridgeInternal .createFeedResponseWithQueryMetrics(Collections diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java index 16aa143d8f2f..b820e204e1d9 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DefaultDocumentQueryExecutionContext.java @@ -56,13 +56,15 @@ * This is meant to be internally used only by our sdk. */ public class DefaultDocumentQueryExecutionContext extends DocumentQueryExecutionContextBase { + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryRequestOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } private final AtomicInteger retries = new AtomicInteger(-1); private final SchedulingStopwatch fetchSchedulingMetrics; private final FetchExecutionRangeAccumulator fetchExecutionRangeAccumulator; private static final String DEFAULT_PARTITION_RANGE = "00-FF"; - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryRequestOptionsAccessor = ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); private final CosmosItemSerializer itemSerializer; public DefaultDocumentQueryExecutionContext(DiagnosticsClientContext diagnosticsClientContext, IDocumentQueryClient client, ResourceType resourceTypeEnum, @@ -92,7 +94,7 @@ protected PartitionKeyInternal getPartitionKeyInternal() { } protected PartitionKeyDefinition getPartitionKeyDefinition() { - return queryRequestOptionsAccessor.getPartitionKeyDefinition(this.cosmosQueryRequestOptions); + return queryRequestOptionsAccessor().getPartitionKeyDefinition(this.cosmosQueryRequestOptions); } @Override @@ -102,9 +104,7 @@ public Flux> executeAsync() { cosmosQueryRequestOptions = new CosmosQueryRequestOptions(); } - CosmosQueryRequestOptions newCosmosQueryRequestOptions = ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + CosmosQueryRequestOptions newCosmosQueryRequestOptions = queryRequestOptionsAccessor() .clone(cosmosQueryRequestOptions); // We can not go to backend with the composite continuation token, @@ -168,7 +168,7 @@ private DocumentClientRetryPolicy createClientRetryPolicyInstance() { partitionKeyRangeCache, PathsHelper.getCollectionPath(super.resourceLink), retryPolicyInstance, - queryRequestOptionsAccessor.getProperties(this.cosmosQueryRequestOptions)); + queryRequestOptionsAccessor().getProperties(this.cosmosQueryRequestOptions)); } return retryPolicyInstance; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java index 5cbd3d908e10..ce72ad82dc8b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentProducer.java @@ -50,9 +50,9 @@ * This is meant to be internally used only by our sdk. */ class DocumentProducer { - - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptionsAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } private static final Logger logger = LoggerFactory.getLogger(DocumentProducer.class); private int retries; @@ -164,7 +164,7 @@ public DocumentProducer( this.correlatedActivityId = correlatedActivityId; this.cosmosQueryRequestOptions = cosmosQueryRequestOptions != null - ? qryOptionsAccessor.clone(cosmosQueryRequestOptions) + ? qryOptionsAccessor().clone(cosmosQueryRequestOptions) : new CosmosQueryRequestOptions(); ModelBridgeInternal.setQueryRequestOptionsContinuationToken(this.cosmosQueryRequestOptions, initialContinuationToken); @@ -208,8 +208,8 @@ public Flux produceAsync() { top, pageSize, Paginator.getPreFetchCount(cosmosQueryRequestOptions, top, pageSize), - qryOptionsAccessor.getImpl(cosmosQueryRequestOptions).getOperationContextAndListenerTuple(), - qryOptionsAccessor.getCancelledRequestDiagnosticsTracker(cosmosQueryRequestOptions), + qryOptionsAccessor().getImpl(cosmosQueryRequestOptions).getOperationContextAndListenerTuple(), + qryOptionsAccessor().getCancelledRequestDiagnosticsTracker(cosmosQueryRequestOptions), client.getGlobalEndpointManager(), client.getGlobalPartitionEndpointManagerForCircuitBreaker() ) @@ -332,7 +332,7 @@ private Mono>> getReplacementRanges(Ra collectionRid, range, true, - qryOptionsAccessor.getProperties(cosmosQueryRequestOptions)); + qryOptionsAccessor().getProperties(cosmosQueryRequestOptions)); } private boolean isSplitOrMerge(CosmosException e) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextBase.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextBase.java index 493a83b930ba..519dfaecebaf 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextBase.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/DocumentQueryExecutionContextBase.java @@ -44,12 +44,13 @@ */ public abstract class DocumentQueryExecutionContextBase implements IDocumentQueryExecutionContext { + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); - - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } protected final DiagnosticsClientContext diagnosticsClientContext; protected ResourceType resourceTypeEnum; @@ -79,7 +80,7 @@ protected DocumentQueryExecutionContextBase(DiagnosticsClientContext diagnostics this.resourceLink = resourceLink; this.correlatedActivityId = correlatedActivityId; this.diagnosticsClientContext = diagnosticsClientContext; - this.operationContext = qryOptAccessor + this.operationContext = qryOptAccessor() .getImpl(cosmosQueryRequestOptions) .getOperationContextAndListenerTuple(); this.isQueryCancelledOnTimeout = isQueryCancelledOnTimeout; @@ -123,7 +124,7 @@ protected RxDocumentServiceRequest createDocumentServiceRequestWithFeedRange(Map : this.createReadFeedDocumentServiceRequest(requestHeaders); request.requestContext.resolvedCollectionRid = collectionRid; - qryOptAccessor.setCollectionRid(cosmosQueryRequestOptions, collectionRid); + qryOptAccessor().setCollectionRid(cosmosQueryRequestOptions, collectionRid); request.setResourceId(collectionRid); request.throughputControlGroupName = throughputControlGroupName; @@ -133,7 +134,7 @@ protected RxDocumentServiceRequest createDocumentServiceRequestWithFeedRange(Map } request.applyFeedRangeFilter(FeedRangeInternal.convert(feedRange)); - CosmosEndToEndOperationLatencyPolicyConfig endToEndOperationLatencyConfig = qryOptAccessor + CosmosEndToEndOperationLatencyPolicyConfig endToEndOperationLatencyConfig = qryOptAccessor() .getImpl(cosmosQueryRequestOptions) .getCosmosEndToEndLatencyPolicyConfig(); @@ -141,9 +142,9 @@ protected RxDocumentServiceRequest createDocumentServiceRequestWithFeedRange(Map request.requestContext.setEndToEndOperationLatencyPolicyConfig(endToEndOperationLatencyConfig); } request.requestContext.setExcludeRegions( - qryOptAccessor.getImpl(cosmosQueryRequestOptions).getExcludedRegions()); + qryOptAccessor().getImpl(cosmosQueryRequestOptions).getExcludedRegions()); request.requestContext.setKeywordIdentifiers( - qryOptAccessor.getImpl(cosmosQueryRequestOptions).getKeywordIdentifiers()); + qryOptAccessor().getImpl(cosmosQueryRequestOptions).getKeywordIdentifiers()); request.requestContext.setIsRequestCancelledOnTimeout(this.isQueryCancelledOnTimeout); return request; @@ -175,12 +176,12 @@ protected Mono> getFeedResponse( CosmosItemSerializer itemSerializer, Mono response) { - return response.map(resp -> feedResponseAccessor.createFeedResponse(resp, itemSerializer, resourceType)); + return response.map(resp -> feedResponseAccessor().createFeedResponse(resp, itemSerializer, resourceType)); } public CosmosQueryRequestOptions getFeedOptions(String continuationToken, Integer maxPageSize) { CosmosQueryRequestOptions options = - qryOptAccessor.clone(this.cosmosQueryRequestOptions); + qryOptAccessor().clone(this.cosmosQueryRequestOptions); ModelBridgeInternal.setQueryRequestOptionsContinuationTokenAndMaxItemCount(options, continuationToken, maxPageSize); return options; } @@ -236,14 +237,14 @@ public Map createCommonHeadersAsync(CosmosQueryRequestOptions co } } - Map customOptions = qryOptAccessor + Map customOptions = qryOptAccessor() .getImpl(cosmosQueryRequestOptions) .getHeaders(); if(customOptions != null) { requestHeaders.putAll(customOptions); } - UUID correlationActivityId = qryOptAccessor + UUID correlationActivityId = qryOptAccessor() .getImpl(cosmosQueryRequestOptions) .getCorrelationActivityId(); if (correlationActivityId != null) { @@ -372,15 +373,15 @@ private RxDocumentServiceRequest createQueryDocumentServiceRequest(Map> resolveCollection(DiagnosticsClientContext diagnosticsClientContext, IDocumentQueryClient client, @@ -113,9 +109,7 @@ private static Mono getPartitionKeyRangesAn Instant startTime = Instant.now(); Mono queryExecutionInfoMono; - if (ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + if (queryRequestOptionsAccessor() .isQueryPlanRetrievalDisallowed(cosmosQueryRequestOptions)) { Instant endTime = Instant.now(); // endTime for query plan diagnostics @@ -362,8 +356,8 @@ public static Flux> createDocume return collectionObs.single().flatMap(collectionValueHolder -> { - queryRequestOptionsAccessor.setPartitionKeyDefinition(cosmosQueryRequestOptions, collectionValueHolder.v.getPartitionKey()); - queryRequestOptionsAccessor.setCollectionRid(cosmosQueryRequestOptions, collectionValueHolder.v.getResourceId()); + queryRequestOptionsAccessor().setPartitionKeyDefinition(cosmosQueryRequestOptions, collectionValueHolder.v.getPartitionKey()); + queryRequestOptionsAccessor().setCollectionRid(cosmosQueryRequestOptions, collectionValueHolder.v.getResourceId()); Mono queryPlanTask = getPartitionKeyRangesAndQueryInfo(diagnosticsClientContext, @@ -443,7 +437,7 @@ public static Flux> createSpecia int pageSize = hybridSearchQueryInfo.hasSkip() ? hybridSearchQueryInfo.getTake() + hybridSearchQueryInfo.getSkip() : hybridSearchQueryInfo.getTake(); int maxitemSizeForFullTextSearch = Math.max(Configs.getMaxItemCountForHybridSearchSearch(), - qryOptAccessor.getMaxItemCountForHybridSearch(cosmosQueryRequestOptions)); + queryRequestOptionsAccessor().getMaxItemCountForHybridSearch(cosmosQueryRequestOptions)); if (pageSize > maxitemSizeForFullTextSearch) { throw new HybridSearchBadRequestException(HttpConstants.StatusCodes.BADREQUEST, @@ -467,7 +461,7 @@ public static Flux> createSpecia int maxLimit = Math.max(queryInfo.hasTop() ? queryInfo.getTop() : 0, queryInfo.hasLimit() ? queryInfo.getLimit() : 0); int maxItemSizeForVectorSearch = Math.max(Configs.getMaxItemCountForVectorSearch(), - qryOptAccessor.getMaxItemCountForVectorSearch(cosmosQueryRequestOptions)); + queryRequestOptionsAccessor().getMaxItemCountForVectorSearch(cosmosQueryRequestOptions)); if (maxLimit > maxItemSizeForVectorSearch) { throw new NonStreamingOrderByBadRequestException(HttpConstants.StatusCodes.BADREQUEST, "Executing a vector search query with TOP or LIMIT larger than the maxItemSizeForVectorSearch " + diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Fetcher.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Fetcher.java index 7089f50d0a8b..80fa744de8fa 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Fetcher.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Fetcher.java @@ -29,11 +29,11 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; abstract class Fetcher { - private final static Logger logger = LoggerFactory.getLogger(Fetcher.class); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private final static Logger logger = LoggerFactory.getLogger(Fetcher.class); private final Function>> executeFunc; private final boolean isChangeFeed; @@ -238,7 +238,7 @@ private Mono> nextPage(RxDocumentServiceRequest request) { } private void handleCancellationExceptionForPartitionKeyRange(RxDocumentServiceRequest failedRequest) { - RegionalRoutingContext firstContactedLocationEndpoint = diagnosticsAccessor.getFirstContactedLocationEndpoint(failedRequest.requestContext.cosmosDiagnostics); + RegionalRoutingContext firstContactedLocationEndpoint = diagAccessor().getFirstContactedLocationEndpoint(failedRequest.requestContext.cosmosDiagnostics); if (firstContactedLocationEndpoint != null) { this.globalPartitionEndpointManagerForPerPartitionCircuitBreaker diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/GroupByDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/GroupByDocumentQueryExecutionContext.java index cbfb27067ef3..0ce3191700e8 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/GroupByDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/GroupByDocumentQueryExecutionContext.java @@ -33,9 +33,10 @@ public final class GroupByDocumentQueryExecutionContext implements IDocumentQueryExecutionComponent { - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } + public static final String CONTINUATION_TOKEN_NOT_SUPPORTED_WITH_GROUP_BY = "Continuation token is not supported " + "for queries with GROUP BY." + "Do not use continuation token" + @@ -93,7 +94,7 @@ public Flux> drainAsync(int maxPageSize) { requestCharge += page.getRequestCharge(); QueryMetrics.mergeQueryMetricsMap(queryMetrics, BridgeInternal.queryMetricsFromFeedResponse(page)); diagnosticsList.addAll( - diagnosticsAccessor.getClientSideRequestStatisticsForQueryPipelineAggregations(page.getCosmosDiagnostics())); + diagAccessor().getClientSideRequestStatisticsForQueryPipelineAggregations(page.getCosmosDiagnostics())); } this.aggregateGroupings(documentList); @@ -141,7 +142,7 @@ private FeedResponse createFeedResponseFromGroupingTable( FeedResponse frp = BridgeInternal.createFeedResponseWithQueryMetrics(groupByResults, headers, queryMetrics, null, false, false, null); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), diagnostics); return frp; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/HybridSearchDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/HybridSearchDocumentQueryExecutionContext.java index e44f3b2a77d8..8dd42f5aa32c 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/HybridSearchDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/HybridSearchDocumentQueryExecutionContext.java @@ -52,15 +52,15 @@ import java.util.stream.Collectors; public class HybridSearchDocumentQueryExecutionContext extends ParallelDocumentQueryExecutionContextBase { + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private static final Logger logger = LoggerFactory.getLogger(HybridSearchDocumentQueryExecutionContext.class); - - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static final Logger logger = LoggerFactory.getLogger(HybridSearchDocumentQueryExecutionContext.class); private static final String FORMATTABLE_TOTAL_DOCUMENT_COUNT = "{documentdb-formattablehybridsearchquery-totaldocumentcount}"; private static final String FORMATTABLE_TOTAL_WORD_COUNT = "{documentdb-formattablehybridsearchquery-totalwordcount-%d}"; @@ -243,7 +243,6 @@ protected HybridSearchDocumentProducer createDocumentProducer( this.hybridSearchSchedulingStopwatch); } - @Override public Flux> drainAsync(int maxPageSize) { return this.hybridObservable.transformDeferred(new HybridSearchQueryResultToPageTransformer(tracker, @@ -285,7 +284,7 @@ public Flux> apply(Flux .window(maxPageSize).map(Flux::collectList) .flatMap(resultListObs -> resultListObs, 1) .map(hybridSearchQueryResults -> { - FeedResponse> feedResponse = feedResponseAccessor.createFeedResponse( + FeedResponse> feedResponse = feedResponseAccessor().createFeedResponse( hybridSearchQueryResults, headerResponse(tracker.getAndResetCharge()), null @@ -311,7 +310,7 @@ public Flux> apply(Flux false, false, feedOfHybridSearchQueryResults.getCosmosDiagnostics()); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( feedResponse.getCosmosDiagnostics(), clientSideRequestStatistics); return feedResponse; }).switchIfEmpty(Flux.defer(() -> { @@ -323,7 +322,7 @@ public Flux> apply(Flux false, false, null); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), clientSideRequestStatistics); return Flux.just(frp); })); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByDocumentQueryExecutionContext.java index 568ed0e85f36..b5f6a626fa7d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByDocumentQueryExecutionContext.java @@ -42,13 +42,13 @@ public class NonStreamingOrderByDocumentQueryExecutionContext extends ParallelDocumentQueryExecutionContextBase { + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); - - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } private final static String FormatPlaceHolder = "{documentdb-formattableorderbyquery-filter}"; private final static String True = "true"; @@ -218,7 +218,7 @@ public Flux> apply(Flux> sourc .flatMap(resultListObs -> resultListObs, 1) .map(orderByRowResults -> { // construct a page from result with request charge - FeedResponse> feedResponse = feedResponseAccessor.createFeedResponse( + FeedResponse> feedResponse = feedResponseAccessor().createFeedResponse( orderByRowResults, headerResponse(tracker.getAndResetCharge()), null); @@ -242,7 +242,7 @@ public Flux> apply(Flux> sourc ModelBridgeInternal.getQueryPlanDiagnosticsContext(feedOfOrderByRowResults), false, false, feedOfOrderByRowResults.getCosmosDiagnostics()); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( feedResponse.getCosmosDiagnostics(), clientSideRequestStatistics); return feedResponse; }).switchIfEmpty(Flux.defer(() -> { @@ -255,7 +255,7 @@ public Flux> apply(Flux> sourc false, false, null); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), clientSideRequestStatistics); return Flux.just(frp); })); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByUtils.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByUtils.java index 54170761f765..c42dcb591ac4 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByUtils.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/NonStreamingOrderByUtils.java @@ -21,9 +21,10 @@ import java.util.function.Function; public class NonStreamingOrderByUtils { - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } public static Flux> nonStreamingOrderedMerge(OrderbyRowComparer consumeComparer, RequestChargeTracker tracker, @@ -80,7 +81,7 @@ public Flux> apply(Flux.Do PriorityBlockingQueue> priorityQueue = new PriorityBlockingQueue<>(initialPageSize + 1, consumeComparer); return source.flatMap(documentProducerFeedResponse -> { clientSideRequestStatistics.addAll( - diagnosticsAccessor.getClientSideRequestStatisticsForQueryPipelineAggregations(documentProducerFeedResponse + diagAccessor().getClientSideRequestStatisticsForQueryPipelineAggregations(documentProducerFeedResponse .pageResult.getCosmosDiagnostics())); QueryMetrics.mergeQueryMetricsMap(queryMetricsMap, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentProducer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentProducer.java index bce5e35e654c..5a308014d17d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentProducer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentProducer.java @@ -30,9 +30,10 @@ import java.util.function.Supplier; class OrderByDocumentProducer extends DocumentProducer { + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); private final OrderbyRowComparer consumeComparer; private final Map targetRangeToOrderByContinuationTokenMap; @@ -74,7 +75,7 @@ protected Flux produceOnFeedRangeGone(Flux row) { double requestCharge = tracker.getAndResetCharge(); Map headers = Utils.immutableMapOf(HttpConstants.HttpHeaders.REQUEST_CHARGE, String.valueOf(requestCharge)); - FeedResponse fr = feedResponseAccessor.createFeedResponse( + FeedResponse fr = feedResponseAccessor().createFeedResponse( Collections.singletonList(row), headers, null); return new DocumentProducerFeedResponse(fr, row.getSourceRange()); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentQueryExecutionContext.java index f94731115d4d..8705edfea16d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByDocumentQueryExecutionContext.java @@ -57,13 +57,13 @@ */ public class OrderByDocumentQueryExecutionContext extends ParallelDocumentQueryExecutionContextBase { + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); - - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } private final static String FormatPlaceHolder = "{documentdb-formattableorderbyquery-filter}"; private final static String True = "true"; @@ -633,7 +633,7 @@ public Flux> apply(Flux> sourc // Observable>>> .map(orderByRowResults -> { // construct a page from result with request charge - FeedResponse> feedResponse = feedResponseAccessor.createFeedResponse( + FeedResponse> feedResponse = feedResponseAccessor().createFeedResponse( orderByRowResults, headerResponse(tracker.getAndResetCharge()), null); @@ -649,7 +649,7 @@ public Flux> apply(Flux> sourc // Emit an empty page so the downstream observables know when there are no more // results. .concatWith(Flux.defer(() -> { - return Flux.just(feedResponseAccessor.createFeedResponse(Utils.immutableListOf(), + return Flux.just(feedResponseAccessor().createFeedResponse(Utils.immutableListOf(), null, null)); })) // CREATE pairs from the stream to allow the observables downstream to "peek" @@ -701,7 +701,7 @@ public Flux> apply(Flux> sourc ModelBridgeInternal.getQueryPlanDiagnosticsContext(feedOfOrderByRowResults), false, false, feedOfOrderByRowResults.getCosmosDiagnostics()); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( feedResponse.getCosmosDiagnostics(), clientSideRequestStatistics); return feedResponse; }).switchIfEmpty(Flux.defer(() -> { @@ -714,7 +714,7 @@ public Flux> apply(Flux> sourc false, false, null); - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( frp.getCosmosDiagnostics(), clientSideRequestStatistics); return Flux.just(frp); })); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByUtils.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByUtils.java index f60ef1e8aee8..b590bb67dd8f 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByUtils.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/OrderByUtils.java @@ -29,9 +29,10 @@ import java.util.stream.Collectors; class OrderByUtils { - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } public static Flux> orderedMerge(OrderbyRowComparer consumeComparer, RequestChargeTracker tracker, @@ -88,7 +89,7 @@ public PageToItemTransformer( public Flux> apply(Flux.DocumentProducerFeedResponse> source) { return source.flatMap(documentProducerFeedResponse -> { clientSideRequestStatistics.addAll( - diagnosticsAccessor.getClientSideRequestStatisticsForQueryPipelineAggregations(documentProducerFeedResponse + diagAccessor().getClientSideRequestStatisticsForQueryPipelineAggregations(documentProducerFeedResponse .pageResult.getCosmosDiagnostics())); QueryMetrics.mergeQueryMetricsMap(queryMetricsMap, BridgeInternal.queryMetricsFromFeedResponse(documentProducerFeedResponse.pageResult)); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Paginator.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Paginator.java index dc27ecf968dd..cbd3ec9fba90 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Paginator.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/Paginator.java @@ -32,13 +32,11 @@ */ public class Paginator { - private final static Logger logger = LoggerFactory.getLogger(Paginator.class); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private static final ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .CosmosQueryRequestOptionsAccessor qryOptAccessor = ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor(); + private final static Logger logger = LoggerFactory.getLogger(Paginator.class); public static Flux> getPaginatedQueryResultAsObservable( CosmosQueryRequestOptions cosmosQueryRequestOptions, @@ -56,8 +54,8 @@ public static Flux> getPaginatedQueryResultAsObservable( top, maxPageSize, getPreFetchCount(cosmosQueryRequestOptions, top, maxPageSize), - qryOptAccessor.getImpl(cosmosQueryRequestOptions).getOperationContextAndListenerTuple(), - qryOptAccessor.getCancelledRequestDiagnosticsTracker(cosmosQueryRequestOptions), + queryOptionsAccessor().getImpl(cosmosQueryRequestOptions).getOperationContextAndListenerTuple(), + queryOptionsAccessor().getCancelledRequestDiagnosticsTracker(cosmosQueryRequestOptions), globalEndpointManager, globalPartitionEndpointManagerForPerPartitionCircuitBreaker); } @@ -169,8 +167,8 @@ public static Flux> getPaginatedNonDocumentReadFeedResultAsO isChangeFeed, -1, maxPageSize, - qryOptAccessor.getImpl(cosmosQueryRequestOptions).getOperationContextAndListenerTuple(), - qryOptAccessor.getCancelledRequestDiagnosticsTracker(cosmosQueryRequestOptions), + queryOptionsAccessor().getImpl(cosmosQueryRequestOptions).getOperationContextAndListenerTuple(), + queryOptionsAccessor().getCancelledRequestDiagnosticsTracker(cosmosQueryRequestOptions), globalEndpointManager, globalPartitionEndpointManagerForPerPartitionCircuitBreaker), preFetchCount); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContext.java index d51f50c39b56..e6d157ca1aac 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContext.java @@ -53,15 +53,15 @@ */ public class ParallelDocumentQueryExecutionContext extends ParallelDocumentQueryExecutionContextBase { - private static final Logger logger = LoggerFactory.getLogger(ParallelDocumentQueryExecutionContext.class); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor(); - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } + + private static final Logger logger = LoggerFactory.getLogger(ParallelDocumentQueryExecutionContext.class); private final CosmosQueryRequestOptions cosmosQueryRequestOptions; private final Map partitionKeyRangeToContinuationTokenMap; @@ -292,7 +292,7 @@ private void mergeAndResetSkippedRequestStats(CosmosDiagnostics diagnostics) { if (!skippedClientSideRequestStatistics.isEmpty()) { if (diagnostics != null) { - FeedResponseDiagnostics feedResponseDiagnostics = diagnosticsAccessor + FeedResponseDiagnostics feedResponseDiagnostics = diagAccessor() .getFeedResponseDiagnostics(diagnostics); feedResponseDiagnostics.addClientSideRequestStatistics(skippedClientSideRequestStatistics); } @@ -316,7 +316,7 @@ public Flux> apply(Flux.DocumentProducerFeed // results. return source.filter(documentProducerFeedResponse -> { if (documentProducerFeedResponse.pageResult.getResults().isEmpty() - && !qryOptAccessor.getAllowEmptyPages(this.cosmosQueryRequestOptions)) { + && !qryOptAccessor().getAllowEmptyPages(this.cosmosQueryRequestOptions)) { // filter empty pages and accumulate charge tracker.addCharge(documentProducerFeedResponse.pageResult.getRequestCharge()); ConcurrentMap currentQueryMetrics = @@ -326,12 +326,12 @@ public Flux> apply(Flux.DocumentProducerFeed // keep a reference of the request statistics for the skipped FeedResponses Collection skippedRequestStatsForPage = - diagnosticsAccessor.getClientSideRequestStatistics(cosmosDiagnostics); + diagAccessor().getClientSideRequestStatistics(cosmosDiagnostics); if (skippedRequestStatsForPage != null && !skippedRequestStatsForPage.isEmpty()) { skippedClientSideRequestStatistics.addAll(skippedRequestStatsForPage); } - if (qryOptAccessor + if (qryOptAccessor() .isEmptyPageDiagnosticsEnabled(cosmosQueryRequestOptions)) { logEmptyPageDiagnostics( @@ -432,7 +432,7 @@ static void logEmptyPageDiagnostics( String activityId, Supplier operationContextTextProvider) { Collection requestStatistics = - diagnosticsAccessor.getClientSideRequestStatisticsForQueryPipelineAggregations(cosmosDiagnostics); + diagAccessor().getClientSideRequestStatisticsForQueryPipelineAggregations(cosmosDiagnostics); try { if (logger.isInfoEnabled()) { diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContextBase.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContextBase.java index 2f25c348fa42..5774a9dde4fe 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContextBase.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ParallelDocumentQueryExecutionContextBase.java @@ -38,6 +38,10 @@ public abstract class ParallelDocumentQueryExecutionContextBase extends DocumentQueryExecutionContextBase implements IDocumentQueryExecutionComponent { + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } + protected List> documentProducers; protected final SqlQuerySpec querySpec; protected int top = -1; @@ -87,8 +91,8 @@ protected void initialize( } } - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor().setPartitionKeyDefinition(cosmosQueryRequestOptions, collection.getPartitionKey()); - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor().setCollectionRid(cosmosQueryRequestOptions, collection.getResourceId()); + queryOptionsAccessor().setPartitionKeyDefinition(cosmosQueryRequestOptions, collection.getPartitionKey()); + queryOptionsAccessor().setCollectionRid(cosmosQueryRequestOptions, collection.getResourceId()); return this.createDocumentServiceRequestWithFeedRange(headers, querySpecForInit, partitionKeyInternal, feedRange, collection.getResourceId(), cosmosQueryRequestOptions.getThroughputControlGroupName()); }; @@ -157,8 +161,8 @@ protected void initializeReadMany( headers.put(HttpConstants.HttpHeaders.CONTINUATION, continuationToken); headers.put(HttpConstants.HttpHeaders.PAGE_SIZE, Strings.toString(pageSize)); - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor().setPartitionKeyDefinition(cosmosQueryRequestOptions, collection.getPartitionKey()); - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor().setCollectionRid(cosmosQueryRequestOptions, collection.getResourceId()); + queryOptionsAccessor().setPartitionKeyDefinition(cosmosQueryRequestOptions, collection.getPartitionKey()); + queryOptionsAccessor().setCollectionRid(cosmosQueryRequestOptions, collection.getResourceId()); return this.createDocumentServiceRequestWithFeedRange(headers, querySpec, null, diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedDocumentQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedDocumentQueryExecutionContext.java index 4850c047d6f8..ef434447d376 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedDocumentQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedDocumentQueryExecutionContext.java @@ -23,12 +23,17 @@ */ public class PipelinedDocumentQueryExecutionContext extends PipelinedQueryExecutionContextBase { + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + } - private final static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor = - ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } private final IDocumentQueryExecutionComponent component; @@ -58,19 +63,19 @@ private static BiFunction, Flux { CosmosQueryRequestOptions orderByCosmosQueryRequestOptions = - qryOptAccessor.clone(requestOptions); + qryOptAccessor().clone(requestOptions); if (queryInfo.hasNonStreamingOrderBy()) { if (continuationToken != null) { throw new NonStreamingOrderByBadRequestException( HttpConstants.StatusCodes.BADREQUEST, "Can not use a continuation token for a vector search query"); } - qryOptAccessor.getImpl(orderByCosmosQueryRequestOptions).setCustomItemSerializer(null); + qryOptAccessor().getImpl(orderByCosmosQueryRequestOptions).setCustomItemSerializer(null); documentQueryParams.setCosmosQueryRequestOptions(orderByCosmosQueryRequestOptions); return NonStreamingOrderByDocumentQueryExecutionContext.createAsync(diagnosticsClientContext, client, documentQueryParams, collection); } else { ModelBridgeInternal.setQueryRequestOptionsContinuationToken(orderByCosmosQueryRequestOptions, continuationToken); - qryOptAccessor.getImpl(orderByCosmosQueryRequestOptions).setCustomItemSerializer(null); + qryOptAccessor().getImpl(orderByCosmosQueryRequestOptions).setCustomItemSerializer(null); documentQueryParams.setCosmosQueryRequestOptions(orderByCosmosQueryRequestOptions); return OrderByDocumentQueryExecutionContext.createAsync(diagnosticsClientContext, client, documentQueryParams, collection); } @@ -79,8 +84,8 @@ private static BiFunction, Flux { CosmosQueryRequestOptions parallelCosmosQueryRequestOptions = - qryOptAccessor.clone(requestOptions); - qryOptAccessor.getImpl(parallelCosmosQueryRequestOptions).setCustomItemSerializer(null); + qryOptAccessor().clone(requestOptions); + qryOptAccessor().getImpl(parallelCosmosQueryRequestOptions).setCustomItemSerializer(null); ModelBridgeInternal.setQueryRequestOptionsContinuationToken(parallelCosmosQueryRequestOptions, continuationToken); documentQueryParams.setCosmosQueryRequestOptions(parallelCosmosQueryRequestOptions); @@ -117,7 +122,7 @@ private static BiFunction, Flux { CosmosQueryRequestOptions orderByCosmosQueryRequestOptions = - qryOptAccessor.clone(requestOptions); + qryOptAccessor().clone(requestOptions); documentQueryParams.setCosmosQueryRequestOptions(orderByCosmosQueryRequestOptions); return HybridSearchDocumentQueryExecutionContext.createAsync(diagnosticsClientContext, client, documentQueryParams, collection); @@ -125,7 +130,6 @@ private static BiFunction, Flux, Flux>> createDistinctPipelineComponentFunction( @@ -260,11 +264,9 @@ public Flux> executeAsync() { return this .component .drainAsync(this.actualPageSize) - .map(documentFeedResponse -> ImplementationBridgeHelpers - .FeedResponseHelper - .getFeedResponseAccessor().convertGenericType( + .map(documentFeedResponse -> feedResponseAccessor().convertGenericType( documentFeedResponse, - (document) -> itemSerializerAccessor.deserializeSafe( + (document) -> itemSerializerAccessor().deserializeSafe( this.itemSerializer, new ObjectNodeMap(document.getPropertyBag()), this.classOfT) diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedQueryExecutionContext.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedQueryExecutionContext.java index 7d6a14e9cd5f..1a9075eac8d6 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedQueryExecutionContext.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/PipelinedQueryExecutionContext.java @@ -21,9 +21,9 @@ import java.util.function.BiFunction; public final class PipelinedQueryExecutionContext extends PipelinedQueryExecutionContextBase { - - private static final ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } private final IDocumentQueryExecutionComponent component; @@ -47,7 +47,7 @@ private static BiFunction, Flux { - CosmosQueryRequestOptions parallelCosmosQueryRequestOptions = qryOptAccessor.clone(requestOptions); + CosmosQueryRequestOptions parallelCosmosQueryRequestOptions = qryOptAccessor().clone(requestOptions); ModelBridgeInternal.setQueryRequestOptionsContinuationToken(parallelCosmosQueryRequestOptions, continuationToken); initParams.setCosmosQueryRequestOptions(parallelCosmosQueryRequestOptions); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/QueryPlanRetriever.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/QueryPlanRetriever.java index c4620ec459b8..2b8a6216d6dc 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/QueryPlanRetriever.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/QueryPlanRetriever.java @@ -33,13 +33,14 @@ import java.util.function.Supplier; class QueryPlanRetriever { - private final static - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); - private final static - ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor = - ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } + + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } private static final String TRUE = "True"; @@ -86,7 +87,6 @@ static Mono getQueryPlanThroughGatewayAsync(Diagn PartitionKey partitionKey = nonNullRequestOptions.getPartitionKey(); - final Map requestHeaders = new HashMap<>(); requestHeaders.put(HttpConstants.HttpHeaders.CONTENT_TYPE, RuntimeConstants.MediaTypes.JSON); requestHeaders.put(HttpConstants.HttpHeaders.IS_QUERY_PLAN_REQUEST, TRUE); @@ -107,11 +107,11 @@ static Mono getQueryPlanThroughGatewayAsync(Diagn queryPlanRequest.useGatewayMode = true; queryPlanRequest.setByteBuffer(ModelBridgeInternal.serializeJsonToByteBuffer(sqlQuerySpec)); - CosmosEndToEndOperationLatencyPolicyConfig end2EndConfig = qryOptAccessor + CosmosEndToEndOperationLatencyPolicyConfig end2EndConfig = queryOptionsAccessor() .getImpl(nonNullRequestOptions) .getCosmosEndToEndLatencyPolicyConfig(); - List excludeRegions = qryOptAccessor + List excludeRegions = queryOptionsAccessor() .getImpl(nonNullRequestOptions) .getExcludedRegions(); @@ -153,7 +153,7 @@ static Mono getQueryPlanThroughGatewayAsync(Diagn CosmosException cosmosException = Utils.as(throwable, CosmosException.class); if (HttpConstants.StatusCodes.NOTFOUND == (cosmosException.getStatusCode()) && HttpConstants.SubStatusCodes.UNKNOWN == (cosmosException.getSubStatusCode())) { - cosmosExceptionAccessor.setSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.OWNER_RESOURCE_NOT_EXISTS); + cosmosExceptionAccessor().setSubStatusCode(cosmosException, HttpConstants.SubStatusCodes.OWNER_RESOURCE_NOT_EXISTS); } return cosmosException; diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ValueUnwrapCosmosItemSerializer.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ValueUnwrapCosmosItemSerializer.java index 9adf9997b707..b3a163dfab9e 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ValueUnwrapCosmosItemSerializer.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/query/ValueUnwrapCosmosItemSerializer.java @@ -12,6 +12,10 @@ import java.util.Map; public final class ValueUnwrapCosmosItemSerializer extends CosmosItemSerializer { + private static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + } + private static ValueUnwrapCosmosItemSerializer EnableUnwrapSingletonInstance = new ValueUnwrapCosmosItemSerializer(true); private static ValueUnwrapCosmosItemSerializer DisableUnwrapSingletonInstance = new ValueUnwrapCosmosItemSerializer(false); @@ -23,12 +27,9 @@ public static CosmosItemSerializer create(boolean shouldUnwrapValue) { return DisableUnwrapSingletonInstance; } - private final boolean shouldUnwrapValue; private ValueUnwrapCosmosItemSerializer(boolean shouldUnwrapValue) { - ImplementationBridgeHelpers - .CosmosItemSerializerHelper - .getCosmosItemSerializerAccessor() + itemSerializerAccessor() .setShouldWrapSerializationExceptions(this, false); this.shouldUnwrapValue = shouldUnwrapValue; } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/throughputControl/sdk/controller/container/SDKThroughputContainerController.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/throughputControl/sdk/controller/container/SDKThroughputContainerController.java index eb688dd297ec..f4a8a5b279fc 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/throughputControl/sdk/controller/container/SDKThroughputContainerController.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/implementation/throughputControl/sdk/controller/container/SDKThroughputContainerController.java @@ -55,6 +55,10 @@ * 3. Start throughput refresh task if necessary */ public class SDKThroughputContainerController implements IThroughputContainerController { + private static ImplementationBridgeHelpers.CosmosAsyncDatabaseHelper.CosmosAsyncDatabaseAccessor databaseAccessor() { + return ImplementationBridgeHelpers.CosmosAsyncDatabaseHelper.getCosmosAsyncDatabaseAccessor(); + } + private static final Logger logger = LoggerFactory.getLogger(SDKThroughputContainerController.class); private static final Duration DEFAULT_THROUGHPUT_REFRESH_INTERVAL = Duration.ofMinutes(15); @@ -236,7 +240,7 @@ private Mono resolveThroughputByResourceId(String resourceId // use https://github.com/Azure/azure-sdk-for-java/issues/18776 to keep track for possible future work. checkArgument(StringUtils.isNotEmpty(resourceId), "ResourceId can not be null or empty"); QueryFeedOperationState state = new QueryFeedOperationState( - ImplementationBridgeHelpers.CosmosAsyncDatabaseHelper.getCosmosAsyncDatabaseAccessor().getCosmosAsyncClient(this.targetContainer.getDatabase()), + databaseAccessor().getCosmosAsyncClient(this.targetContainer.getDatabase()), "resolveThroughputByResourceId", this.targetContainer.getDatabase().getId(), this.targetContainer.getId(), diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBatchOperationResult.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBatchOperationResult.java index aa9baff39fde..3c3fcc097c6d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBatchOperationResult.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBatchOperationResult.java @@ -91,7 +91,7 @@ public T getItem(final Class type) { if (this.getResourceObject() != null) { if (effectiveItemSerializer == CosmosItemSerializer.DEFAULT_SERIALIZER - || effectiveItemSerializer == DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER) { + || effectiveItemSerializer == ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer()) { item = new JsonSerializable(this.getResourceObject()).toObject(type); } else { item = Utils.parse(this.getResourceObject(), type, effectiveItemSerializer); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBulkItemResponse.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBulkItemResponse.java index 3e99ea32e644..6833924ba39e 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBulkItemResponse.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosBulkItemResponse.java @@ -107,7 +107,7 @@ public T getItem(final Class type) { if (this.getResourceObject() != null) { if (effectiveItemSerializer == CosmosItemSerializer.DEFAULT_SERIALIZER - || effectiveItemSerializer == DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER) { + || effectiveItemSerializer == ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer()) { item = new JsonSerializable(this.getResourceObject()).toObject(type); } else { item = Utils.parse(this.getResourceObject(), type, effectiveItemSerializer); diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosItemRequestOptions.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosItemRequestOptions.java index 72eb108a6428..4fa664444460 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosItemRequestOptions.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosItemRequestOptions.java @@ -27,8 +27,10 @@ * Encapsulates options that can be specified for a request issued to cosmos Item. */ public class CosmosItemRequestOptions { - private final static ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.CosmosDiagnosticsThresholdsAccessor thresholdsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.getCosmosAsyncClientAccessor(); + + private static ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.CosmosDiagnosticsThresholdsAccessor diagThresholdsAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsThresholdsHelper.getCosmosDiagnosticsThresholdsAccessor(); + } private ConsistencyLevel consistencyLevel; private ReadConsistencyStrategy readConsistencyStrategy; @@ -81,7 +83,6 @@ public class CosmosItemRequestOptions { } } - /** * Constructor */ @@ -543,7 +544,7 @@ public Duration getThresholdForDiagnosticsOnTracer() { return Duration.ofMillis(100); } - return thresholdsAccessor.getPointReadLatencyThreshold(this.thresholds); + return diagThresholdsAccessor().getPointReadLatencyThreshold(this.thresholds); } /** diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosOperationDetails.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosOperationDetails.java index 818625f32d2f..87159901c46d 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosOperationDetails.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/CosmosOperationDetails.java @@ -13,6 +13,10 @@ */ public final class CosmosOperationDetails { + private static ImplementationBridgeHelpers.CosmosRequestContextHelper.CosmosRequestContextAccessor requestContextAccessor() { + return ImplementationBridgeHelpers.CosmosRequestContextHelper.getCosmosRequestContextAccessor(); + } + private final OverridableRequestOptions requestOptions; private final CosmosDiagnosticsContext cosmosDiagnosticsContext; @@ -36,7 +40,7 @@ public void setRequestOptions(CosmosRequestOptions cosmosRequestOptions) { * @return the request context. */ public CosmosRequestContext getRequestContext() { - return ImplementationBridgeHelpers.CosmosRequestContextHelper.getCosmosRequestContextAccessor().create(requestOptions); + return requestContextAccessor().create(requestOptions); } /** @@ -52,8 +56,9 @@ public CosmosDiagnosticsContext getDiagnosticsContext() { // the following helper/accessor only helps to access this class outside of this package.// /////////////////////////////////////////////////////////////////////////////////////////// static void initialize() { - ImplementationBridgeHelpers.CosmosOperationDetailsHelper - .setCosmosOperationDetailsAccessor( + ImplementationBridgeHelpers.CosmosOperationDetailsHelper.setCosmosOperationDetailsAccessor( CosmosOperationDetails::new); } + + static { initialize(); } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/FeedResponse.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/FeedResponse.java index 1af8d89d8a49..fed27eb48945 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/FeedResponse.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/FeedResponse.java @@ -38,9 +38,9 @@ */ public class FeedResponse implements ContinuablePage { - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagnosticsAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + private static ImplementationBridgeHelpers.CosmosDiagnosticsHelper.CosmosDiagnosticsAccessor diagAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsHelper.getCosmosDiagnosticsAccessor(); + } private static final Pattern DELIMITER_CHARS_PATTERN = Pattern.compile(Constants.Quota.DELIMITER_CHARS); private final List results; @@ -91,14 +91,14 @@ public class FeedResponse implements ContinuablePage { if (diagnostics != null) { ClientSideRequestStatistics requestStatistics = - diagnosticsAccessor.getClientSideRequestStatisticsRaw(diagnostics); + diagAccessor().getClientSideRequestStatisticsRaw(diagnostics); if (requestStatistics != null) { - diagnosticsAccessor.addClientSideDiagnosticsToFeed(cosmosDiagnostics, + diagAccessor().addClientSideDiagnosticsToFeed(cosmosDiagnostics, Collections.singletonList(requestStatistics)); } else { - diagnosticsAccessor.addClientSideDiagnosticsToFeed( + diagAccessor().addClientSideDiagnosticsToFeed( cosmosDiagnostics, - diagnosticsAccessor.getClientSideRequestStatistics(diagnostics)); + diagAccessor().getClientSideRequestStatistics(diagnostics)); } } } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/ModelBridgeInternal.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/ModelBridgeInternal.java index e698e0664c41..8d262dac023b 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/ModelBridgeInternal.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/ModelBridgeInternal.java @@ -6,32 +6,60 @@ import com.azure.cosmos.ConsistencyLevel; import com.azure.cosmos.CosmosDiagnostics; import com.azure.cosmos.implementation.ClientEncryptionKey; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Conflict; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.CosmosPagedFluxOptions; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.CosmosResourceType; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Database; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.DatabaseAccount; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; +import com.azure.cosmos.CosmosItemSerializer; import com.azure.cosmos.implementation.DefaultCosmosItemSerializer; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.DocumentCollection; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.HttpConstants; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Index; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.InternalObjectNode; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.JsonSerializable; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Offer; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Permission; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.QueryMetrics; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.RequestOptions; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.RequestVerb; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Resource; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.ResourceResponse; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.RxDocumentServiceResponse; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.StoredProcedure; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.StoredProcedureResponse; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Trigger; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.User; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.UserDefinedFunction; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Utils; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.Warning; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.implementation.changefeed.common.ChangeFeedMode; import com.azure.cosmos.implementation.changefeed.common.ChangeFeedStartFromInternal; import com.azure.cosmos.implementation.changefeed.common.ChangeFeedState; @@ -405,7 +433,7 @@ public static ByteBuffer serializeJsonToByteBuffer(SqlQuerySpec sqlQuerySpec) { return sqlQuerySpec .getJsonSerializable() .serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), null, false); } diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxDefaultImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxDefaultImpl.java index 4314964cfb10..977b3069bddd 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxDefaultImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxDefaultImpl.java @@ -39,9 +39,11 @@ * @see FeedResponse */ final class CosmosPagedFluxDefaultImpl extends CosmosPagedFlux { + private static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + } + private static final Logger LOGGER = LoggerFactory.getLogger(CosmosPagedFluxStaticListImpl.class); - private static final ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); private final Function>> optionsFluxFunction; private final AtomicReference>> feedResponseConsumer; @@ -206,7 +208,7 @@ private Flux> wrapWithTracingIfEnabled(CosmosPagedFluxOptions p CosmosDiagnosticsContext ctxSnapshot = state.getDiagnosticsContextSnapshot(); - ctxAccessor + ctxAccessor() .setSamplingRateSnapshot(ctxSnapshot, samplingRateSnapshot, isSampledOut); tracerProvider.recordFeedResponseConsumerLatency( @@ -214,7 +216,7 @@ private Flux> wrapWithTracingIfEnabled(CosmosPagedFluxOptions p ctxSnapshot, Duration.ofNanos(feedResponseConsumerLatencyInNanos.get())); - tracerProvider.endSpan(ctxSnapshot, traceCtx, ctxAccessor.isEmptyCompletion(ctxSnapshot), isSampledOut); + tracerProvider.endSpan(ctxSnapshot, traceCtx, ctxAccessor().isEmptyCompletion(ctxSnapshot), isSampledOut); break; case ON_NEXT: @@ -227,7 +229,7 @@ private Flux> wrapWithTracingIfEnabled(CosmosPagedFluxOptions p feedResponseConsumerLatencyInNanos); state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctxSnapshotOnNext = state.getDiagnosticsContextSnapshot(); - ctxAccessor + ctxAccessor() .setSamplingRateSnapshot(ctxSnapshotOnNext, samplingRateSnapshot, isSampledOut); tracerProvider.endSpan(ctxSnapshotOnNext, traceCtx, false, isSampledOut); state.resetDiagnosticsContext(); @@ -243,7 +245,7 @@ private Flux> wrapWithTracingIfEnabled(CosmosPagedFluxOptions p case ON_ERROR: state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctxSnapshotOnError = state.getDiagnosticsContextSnapshot(); - ctxAccessor + ctxAccessor() .setSamplingRateSnapshot(ctxSnapshotOnError, samplingRateSnapshot, isSampledOut); tracerProvider.recordFeedResponseConsumerLatency( signal, @@ -274,7 +276,7 @@ private Flux> wrapWithTracingIfEnabled(CosmosPagedFluxOptions p state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctxSnapshot = state.getDiagnosticsContextSnapshot(); - ctxAccessor + ctxAccessor() .setSamplingRateSnapshot(ctxSnapshot, samplingRateSnapshot, isSampledOut); tracerProvider.endSpan(ctxSnapshot, traceCtx, false, isSampledOut); @@ -286,9 +288,9 @@ private Flux> wrapWithTracingIfEnabled(CosmosPagedFluxOptions p state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctxSnapshot = state.getDiagnosticsContextSnapshot(); - ctxAccessor + ctxAccessor() .setSamplingRateSnapshot(ctxSnapshot, samplingRateSnapshot, isSampledOut); - tracerProvider.endSpan(ctxSnapshot, traceCtx, ctxAccessor.isEmptyCompletion(ctxSnapshot), isSampledOut); + tracerProvider.endSpan(ctxSnapshot, traceCtx, ctxAccessor().isEmptyCompletion(ctxSnapshot), isSampledOut); } })) .contextWrite(DiagnosticsProvider.setContextInReactor( diff --git a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxStaticListImpl.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxStaticListImpl.java index dd0ca3ebbd5c..b32027935aad 100644 --- a/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxStaticListImpl.java +++ b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/util/CosmosPagedFluxStaticListImpl.java @@ -18,9 +18,11 @@ import static com.azure.cosmos.implementation.guava25.base.Preconditions.checkNotNull; final class CosmosPagedFluxStaticListImpl extends CosmosPagedFlux { + private static ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseHlp() { + return ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + } + private static final Logger LOGGER = LoggerFactory.getLogger(CosmosPagedFluxStaticListImpl.class); - private static final ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseHlp = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); private static final int DEFAULT_PAGE_SIZE = 100; @@ -75,12 +77,12 @@ public Flux> byPage(String continuation, int pageSize) { List> pages = new ArrayList<>(); if (i >= this.items.size()) { if (!this.isChangeFeed) { - pages.add(feedResponseHlp.createNonServiceFeedResponse( + pages.add(feedResponseHlp().createNonServiceFeedResponse( new ArrayList<>(), false, false)); } else { - pages.add(feedResponseHlp.createNonServiceFeedResponse( + pages.add(feedResponseHlp().createNonServiceFeedResponse( new ArrayList<>(), true, true)); @@ -97,14 +99,14 @@ public Flux> byPage(String continuation, int pageSize) { itemsForPage.add(this.items.get(i)); } - pages.add(feedResponseHlp.createNonServiceFeedResponse( + pages.add(feedResponseHlp().createNonServiceFeedResponse( new ArrayList<>(), this.isChangeFeed, false)); } if (this.isChangeFeed) { - pages.add(feedResponseHlp.createNonServiceFeedResponse( + pages.add(feedResponseHlp().createNonServiceFeedResponse( new ArrayList<>(), true, true)); diff --git a/sdk/spring/azure-spring-data-cosmos/README.md b/sdk/spring/azure-spring-data-cosmos/README.md index acf2ecaef58a..ca39fb42bf49 100644 --- a/sdk/spring/azure-spring-data-cosmos/README.md +++ b/sdk/spring/azure-spring-data-cosmos/README.md @@ -1169,3 +1169,4 @@ or contact [opencode@microsoft.com][coc_contact] with any additional questions o [azure_cosmos_db_java_sdk_samples]: https://github.com/Azure-Samples/azure-cosmos-java-sql-api-samples +