From a7608b436009b1124896bbf5b31f58ce0bb18252 Mon Sep 17 00:00:00 2001 From: Abhijeet Mohanty Date: Fri, 10 Apr 2026 09:12:53 -0400 Subject: [PATCH 1/4] Fix JVM deadlock and CosmosItemSerializer.DEFAULT_SERIALIZER null MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #48622, #48585 Replace all static final accessor fields and inline ImplementationBridgeHelpers calls with uniform private static getter methods. This eliminates -time class loading that caused permanent deadlocks under concurrent class initialization (JLS 12.4.2). Fix CosmosItemSerializer.DEFAULT_SERIALIZER circular — create instance directly and move INTERNAL_DEFAULT_SERIALIZER to parent class to prevent concurrent between parent and child. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../models/SqlQuerySpecWithEncryption.java | 5 +- .../ImplementationBridgeHelpersTest.java | 502 ++++++++++++++++++ sdk/cosmos/azure-cosmos/CHANGELOG.md | 2 + .../com/azure/cosmos/CosmosAsyncClient.java | 69 ++- .../azure/cosmos/CosmosAsyncContainer.java | 188 ++++--- .../com/azure/cosmos/CosmosAsyncDatabase.java | 38 +- .../com/azure/cosmos/CosmosAsyncScripts.java | 34 +- .../com/azure/cosmos/CosmosAsyncUser.java | 19 +- .../CosmosContainerProactiveInitConfig.java | 10 +- .../cosmos/CosmosDiagnosticsContext.java | 25 +- .../azure/cosmos/CosmosItemSerializer.java | 18 +- .../azure/cosmos/CosmosRequestContext.java | 2 + .../ChangeFeedOperationState.java | 17 +- .../implementation/ChangeFeedQueryImpl.java | 33 +- .../ClientSideRequestStatistics.java | 9 +- .../implementation/ConnectionPolicy.java | 29 +- .../CosmosQueryRequestOptionsBase.java | 8 +- .../CosmosQueryRequestOptionsImpl.java | 2 - .../DefaultCosmosItemSerializer.java | 28 +- .../implementation/DiagnosticsProvider.java | 125 ++--- .../azure/cosmos/implementation/Document.java | 8 +- .../implementation/FeedOperationState.java | 48 +- .../ImplementationBridgeHelpers.java | 3 +- .../implementation/JsonSerializable.java | 16 +- .../implementation/PartitionKeyHelper.java | 16 +- .../QueryFeedOperationState.java | 26 +- .../implementation/RxDocumentClientImpl.java | 221 ++++---- .../RxDocumentServiceRequest.java | 18 +- .../implementation/RxGatewayStoreModel.java | 29 +- .../SessionTokenMismatchRetryPolicy.java | 14 +- .../StaleResourceRetryPolicy.java | 3 - .../implementation/batch/BulkExecutor.java | 44 +- .../batch/ItemBulkOperation.java | 21 +- .../batch/TransactionalBulkExecutor.java | 24 +- .../caches/RxCollectionCache.java | 9 +- .../common/ChangeFeedContextClientImpl.java | 8 +- .../epkversion/PartitionProcessorHelper.java | 8 +- .../pkversion/PartitionProcessorImpl.java | 6 +- .../ClientMetricsDiagnosticsHandler.java | 2 - .../clienttelemetry/ClientTelemetry.java | 12 +- .../ClientTelemetryMetrics.java | 109 ++-- .../GatewayAddressCache.java | 8 +- .../GlobalAddressResolver.java | 20 +- .../GoneAndRetryWithRetryPolicy.java | 12 +- .../directconnectivity/RequestHelper.java | 8 +- .../RntbdTransportClient.java | 37 +- .../directconnectivity/ServerStoreModel.java | 9 +- .../directconnectivity/StoreReader.java | 16 +- .../StoreResponseDiagnostics.java | 19 +- .../ProactiveOpenConnectionsProcessor.java | 12 +- .../rntbd/RntbdRequestHeaders.java | 8 +- .../implementation/http/HttpClientConfig.java | 8 +- .../http/ReactorNettyClient.java | 10 +- ...ggregateDocumentQueryExecutionContext.java | 21 +- .../query/ChangeFeedFetcher.java | 8 +- .../DCountDocumentQueryExecutionContext.java | 10 +- .../DefaultDocumentQueryExecutionContext.java | 12 +- .../query/DocumentProducer.java | 14 +- .../DocumentQueryExecutionContextBase.java | 35 +- .../DocumentQueryExecutionContextFactory.java | 22 +- .../cosmos/implementation/query/Fetcher.java | 10 +- .../GroupByDocumentQueryExecutionContext.java | 11 +- ...idSearchDocumentQueryExecutionContext.java | 21 +- ...gOrderByDocumentQueryExecutionContext.java | 18 +- .../query/NonStreamingOrderByUtils.java | 9 +- .../query/OrderByDocumentProducer.java | 7 +- .../OrderByDocumentQueryExecutionContext.java | 20 +- .../implementation/query/OrderByUtils.java | 9 +- .../implementation/query/Paginator.java | 18 +- ...ParallelDocumentQueryExecutionContext.java | 26 +- ...llelDocumentQueryExecutionContextBase.java | 12 +- ...ipelinedDocumentQueryExecutionContext.java | 32 +- .../query/PipelinedQueryExecutionContext.java | 8 +- .../query/QueryPlanRetriever.java | 20 +- .../ValueUnwrapCosmosItemSerializer.java | 9 +- .../SDKThroughputContainerController.java | 6 +- .../models/CosmosBatchOperationResult.java | 6 +- .../cosmos/models/CosmosBulkItemResponse.java | 6 +- .../models/CosmosItemRequestOptions.java | 9 +- .../cosmos/models/CosmosOperationDetails.java | 11 +- .../com/azure/cosmos/models/FeedResponse.java | 14 +- .../cosmos/models/ModelBridgeInternal.java | 34 +- .../util/CosmosPagedFluxDefaultImpl.java | 20 +- .../util/CosmosPagedFluxStaticListImpl.java | 14 +- sdk/spring/azure-spring-data-cosmos/README.md | 1 + 85 files changed, 1528 insertions(+), 920 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java b/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java index 7c2dbb1cc791..05a54cff2d80 100644 --- a/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java +++ b/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java @@ -7,6 +7,7 @@ import com.azure.cosmos.encryption.CosmosEncryptionAsyncContainer; import com.azure.cosmos.encryption.implementation.Constants; import com.azure.cosmos.encryption.implementation.EncryptionImplementationBridgeHelpers; +import com.azure.cosmos.implementation.ImplementationBridgeHelpers; import com.azure.cosmos.encryption.implementation.EncryptionProcessor; import com.azure.cosmos.encryption.implementation.EncryptionUtils; import com.azure.cosmos.encryption.implementation.mdesrc.cryptography.EncryptionType; @@ -86,10 +87,10 @@ Mono addEncryptionParameterAsync(String path, SqlParameter sqlParameter, } byte[] valueByte = EncryptionUtils.serializeJsonToByteArray( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), sqlParameter.getValue(Object.class)); JsonNode itemJObj = Utils.parse( - valueByte, JsonNode.class, DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER); + valueByte, JsonNode.class, ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer()); Pair typeMarkerPair = EncryptionProcessor.toByteArray(itemJObj); byte[] cipherText = 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..7323fe2d056b 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,497 @@ 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 + // Resolve azure-cosmos source root. Search upward from user.dir for the sdk/cosmos layout. + java.nio.file.Path userDir = java.nio.file.Paths.get(System.getProperty("user.dir")); + java.nio.file.Path cosmosRoot = null; + + // Try standard Maven layout: user.dir is azure-cosmos-tests, sibling is azure-cosmos + java.nio.file.Path candidate = userDir.getParent().resolve("azure-cosmos") + .resolve("src").resolve("main").resolve("java"); + if (java.nio.file.Files.exists(candidate)) { + cosmosRoot = candidate; + } + + // Try repo root: user.dir is the repo root + if (cosmosRoot == null) { + candidate = userDir.resolve("sdk").resolve("cosmos").resolve("azure-cosmos") + .resolve("src").resolve("main").resolve("java"); + if (java.nio.file.Files.exists(candidate)) { + cosmosRoot = candidate; + } + } + + // Walk up from user.dir looking for sdk/cosmos/azure-cosmos + if (cosmosRoot == null) { + java.nio.file.Path dir = userDir; + while (dir != null) { + candidate = dir.resolve("sdk").resolve("cosmos").resolve("azure-cosmos") + .resolve("src").resolve("main").resolve("java"); + if (java.nio.file.Files.exists(candidate)) { + cosmosRoot = candidate; + break; + } + dir = dir.getParent(); + } + } + + assertThat(cosmosRoot) + .as("Could not find azure-cosmos source root from user.dir: " + userDir) + .isNotNull(); + 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<>(); + + try (java.util.stream.Stream walker = java.nio.file.Files.walk(cosmosRoot)) { + walker + .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 2d71505c4b3a..28dca7976f58 100644 --- a/sdk/cosmos/azure-cosmos/CHANGELOG.md +++ b/sdk/cosmos/azure-cosmos/CHANGELOG.md @@ -8,6 +8,8 @@ #### Bugs Fixed * Fixed an issue where change feed with `startFrom` point-in-time returned `400` on merged partitions by enabling the `CHANGE_FEED_WITH_START_TIME_POST_MERGE` SDK capability. +* 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..39ced27f3199 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,8 +29,9 @@ * in the Azure Cosmos DB database service. */ public abstract class CosmosQueryRequestOptionsBase> implements OverridableRequestOptions { - 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; @@ -373,7 +374,8 @@ public Duration getThresholdForDiagnosticsOnTracer() { return CosmosDiagnosticsThresholds.DEFAULT_NON_POINT_OPERATION_LATENCY_THRESHOLD; } - return thresholdsAccessor.getNonPointReadLatencyThreshold(this.thresholds); + return diagThresholdsAccessor() + .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..8437ef2cc287 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,34 +12,18 @@ 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; public DefaultCosmosItemSerializer(ObjectMapper mapper) { - checkNotNull("mapper", "Argument 'mapper' must not be null."); + 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..c1ec176b8299 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,16 @@ * Represents a base resource that can be serialized to JSON in the Azure Cosmos DB database service. */ public class JsonSerializable { - private static final ObjectMapper OBJECT_MAPPER = Utils.getSimpleObjectMapper(); + private static ImplementationBridgeHelpers.CosmosItemSerializerHelper.CosmosItemSerializerAccessor itemSerializerAccessor() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor(); + } + + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + + 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 +253,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, internalDefaultSerializer(), false); } /** @@ -281,7 +287,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..11121bca033e 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,57 @@ */ 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 static ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor() { + return ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + } - private final static List EMPTY_ENDPOINT_LIST = Collections.emptyList(); + 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 final static - ImplementationBridgeHelpers.FeedResponseHelper.FeedResponseAccessor feedResponseAccessor = - ImplementationBridgeHelpers.FeedResponseHelper.getFeedResponseAccessor(); + private static ImplementationBridgeHelpers.Http2ConnectionConfigHelper.Http2ConnectionConfigAccessor httpCfgAccessor() { + return ImplementationBridgeHelpers.Http2ConnectionConfigHelper.getHttp2ConnectionConfigAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.CosmosClientTelemetryConfigAccessor telemetryCfgAccessor = - ImplementationBridgeHelpers.CosmosClientTelemetryConfigHelper.getCosmosClientTelemetryConfigAccessor(); + private static ImplementationBridgeHelpers.CosmosItemResponseHelper.CosmosItemResponseBuilderAccessor itemResponseAccessor() { + return ImplementationBridgeHelpers.CosmosItemResponseHelper.getCosmosItemResponseBuilderAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.CosmosDiagnosticsContextAccessor ctxAccessor = - ImplementationBridgeHelpers.CosmosDiagnosticsContextHelper.getCosmosDiagnosticsContextAccessor(); + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor qryOptAccessor = - ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + } - private final static - ImplementationBridgeHelpers.CosmosItemResponseHelper.CosmosItemResponseBuilderAccessor itemResponseAccessor = - ImplementationBridgeHelpers.CosmosItemResponseHelper.getCosmosItemResponseBuilderAccessor(); + private static ImplementationBridgeHelpers.CosmosOperationDetailsHelper.CosmosOperationDetailsAccessor operationDetailsAccessor() { + return ImplementationBridgeHelpers.CosmosOperationDetailsHelper.getCosmosOperationDetailsAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.CosmosChangeFeedRequestOptionsAccessor changeFeedOptionsAccessor = - ImplementationBridgeHelpers.CosmosChangeFeedRequestOptionsHelper.getCosmosChangeFeedRequestOptionsAccessor(); + private static ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor() { + return ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + } - private static final ImplementationBridgeHelpers.CosmosOperationDetailsHelper.CosmosOperationDetailsAccessor operationDetailsAccessor = - ImplementationBridgeHelpers.CosmosOperationDetailsHelper.getCosmosOperationDetailsAccessor(); + private static ImplementationBridgeHelpers.CosmosExceptionHelper.CosmosExceptionAccessor cosmosExceptionAccessor() { + return ImplementationBridgeHelpers.CosmosExceptionHelper.getCosmosExceptionAccessor(); + } - private static final ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.ReadConsistencyStrategyAccessor readConsistencyStrategyAccessor = - ImplementationBridgeHelpers.ReadConsistencyStrategyHelper.getReadConsistencyStrategyAccessor(); + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } - 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 +694,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 +712,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 +1035,6 @@ private void createStoreModel(boolean subscribeRntbdStatus) { this.storeModel = new ServerStoreModel(storeClient); } - @Override public URI getServiceEndpoint() { return this.serviceEndpoint; @@ -1148,7 +1154,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, + internalDefaultSerializer(), null, false); Instant serializationEndTimeUTC = Instant.now(); @@ -1286,7 +1292,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 +1326,7 @@ private Flux> createQuery( CosmosQueryRequestOptions nonNullQueryOptions = state.getQueryOptions(); - UUID correlationActivityIdOfRequestOptions = qryOptAccessor + UUID correlationActivityIdOfRequestOptions = queryOptionsAccessor() .getImpl(nonNullQueryOptions) .getCorrelationActivityId(); UUID correlationActivityId = correlationActivityIdOfRequestOptions != null ? @@ -1339,8 +1347,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 +1393,7 @@ private Flux> createQueryInternal( if (options != null) { CosmosEndToEndOperationLatencyPolicyConfig endToEndPolicyConfigFromRequestOptions = getEndToEndOperationLatencyPolicyConfig( - ImplementationBridgeHelpers - .CosmosQueryRequestOptionsHelper - .getCosmosQueryRequestOptionsAccessor() + queryOptionsAccessor() .toRequestOptions(options), resourceTypeEnum, OperationType.Query); @@ -1427,9 +1433,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 +1502,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 +1512,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 +1619,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 +1650,7 @@ private Mono> createCollectionInternal(Stri Instant serializationStartTimeUTC = Instant.now(); ByteBuffer byteBuffer = collection.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), null, false); Instant serializationEndTimeUTC = Instant.now(); @@ -1707,7 +1706,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, + internalDefaultSerializer(), null, false); Instant serializationEndTimeUTC = Instant.now(); @@ -4158,8 +4157,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 +4176,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 +4187,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 +4198,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 +4213,7 @@ public Mono> readMany( aggregatedDiagnostics, null ); - diagnosticsAccessor - .setDiagnosticsContext( + diagAccessor().setDiagnosticsContext( aggregatedDiagnostics, ctx); } @@ -4240,7 +4239,7 @@ public Mono> readMany( state.mergeDiagnosticsContext(); CosmosDiagnosticsContext ctx = state.getDiagnosticsContextSnapshot(); if (ctx != null) { - ctxAccessor.recordOperation( + ctxAccessor().recordOperation( ctx, cosmosException.getStatusCode(), cosmosException.getSubStatusCode(), @@ -4249,7 +4248,7 @@ public Mono> readMany( diagnostics, throwable ); - diagnosticsAccessor + diagAccessor() .setDiagnosticsContext( diagnostics, state.getDiagnosticsContextSnapshot()); @@ -4263,7 +4262,6 @@ public Mono> readMany( }); } - private Mono>> readMany( List itemIdentityList, String collectionLink, @@ -4512,9 +4510,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 +4545,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 +4580,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 +4756,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 +4829,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 +4865,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 +4900,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 +4918,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 +4949,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 +5011,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 +5956,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 +6438,14 @@ private Flux> nonDocumentReadFeedInternal( return readFeed(request) .map(response -> { if (isChangeFeed) { - return feedResponseAccessor.createChangeFeedResponse( + return feedResponseAccessor().createChangeFeedResponse( response, - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), klass); } else { - return feedResponseAccessor.createFeedResponse( + return feedResponseAccessor().createFeedResponse( response, - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), klass); } }); @@ -7083,7 +7076,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 +7129,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 +7191,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 +7261,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 +7326,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 +7407,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 +8064,7 @@ private Mono executeFeedOperationWithAvailabilityStrategy( private void handleLocationCancellationExceptionForPartitionKeyRange(RxDocumentServiceRequest failedRequest) { - RegionalRoutingContext firstContactedLocationEndpoint = diagnosticsAccessor + RegionalRoutingContext firstContactedLocationEndpoint = diagAccessor() .getFirstContactedLocationEndpoint(failedRequest.requestContext.cosmosDiagnostics); if (firstContactedLocationEndpoint != null) { @@ -8106,17 +8107,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 +8370,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..58e838d482b8 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,14 @@ */ public class RxDocumentServiceRequest implements Cloneable { + private static ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.CosmosQueryRequestOptionsAccessor queryOptionsAccessor() { + return ImplementationBridgeHelpers.CosmosQueryRequestOptionsHelper.getCosmosQueryRequestOptionsAccessor(); + } + + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + private final DiagnosticsClientContext clientContext; public volatile boolean forcePartitionKeyRangeRefresh; public volatile boolean forceCollectionRoutingMapRefresh; @@ -408,7 +416,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, + internalDefaultSerializer(), null, resourceType == ResourceType.Document && (operation == OperationType.Create || operation == OperationType.Upsert)), headers, @@ -600,7 +608,7 @@ public static RxDocumentServiceRequest create(DiagnosticsClientContext clientCon Map headers, AuthorizationTokenType authorizationTokenType) { ByteBuffer resourceContent = resource.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, // only used from test code + internalDefaultSerializer(), // 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 +747,7 @@ public static RxDocumentServiceRequest createFromName( String resourceFullName, ResourceType resourceType) { ByteBuffer resourceContent = resource.serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, // only used from test code + internalDefaultSerializer(), // only used from test code null, resourceType == ResourceType.Document && (operationType == OperationType.Create || operationType == OperationType.Upsert)); return new RxDocumentServiceRequest(clientContext, @@ -1093,9 +1101,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..366be3ee60b6 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; @@ -25,6 +28,10 @@ */ public final class ItemBulkOperation extends CosmosItemOperationBase { + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + private final TInternal item; private final TContext context; private final String id; @@ -77,14 +84,14 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_OPERATION_TYPE, ModelBridgeInternal.getOperationValueForCosmosItemOperationType(this.getOperationType()), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), false); if (StringUtils.isNotEmpty(this.getPartitionKeyJson())) { jsonSerializable.set( BatchRequestResponseConstants.FIELD_PARTITION_KEY, this.getPartitionKeyJson(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), false); } @@ -92,7 +99,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_ID, this.getId(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), false); } @@ -103,7 +110,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt PatchUtil.serializableBatchPatchOperation( (CosmosPatchOperations) this.getItemInternal(), this.getRequestOptions()), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), false); } else { jsonSerializable.set( @@ -121,7 +128,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_IF_MATCH, requestOptions.getIfMatchETag(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), false); } @@ -129,7 +136,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_IF_NONE_MATCH, requestOptions.getIfNoneMatchETag(), - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), false); } @@ -140,7 +147,7 @@ JsonSerializable getSerializedOperationInternal(CosmosItemSerializer effectiveIt jsonSerializable.set( BatchRequestResponseConstants.FIELD_MINIMAL_RETURN_PREFERENCE, true, - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), 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..1435d1c1b4d2 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 @@ -20,6 +20,10 @@ */ public final class CosmosBatchOperationResult { + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + private final String eTag; private final double requestCharge; private final int statusCode; @@ -91,7 +95,7 @@ public T getItem(final Class type) { if (this.getResourceObject() != null) { if (effectiveItemSerializer == CosmosItemSerializer.DEFAULT_SERIALIZER - || effectiveItemSerializer == DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER) { + || effectiveItemSerializer == internalDefaultSerializer()) { 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..f7ce9273384d 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 @@ -26,6 +26,10 @@ */ public final class CosmosBulkItemResponse { + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + private final String eTag; private final double requestCharge; private ObjectNode resourceObject; @@ -107,7 +111,7 @@ public T getItem(final Class type) { if (this.getResourceObject() != null) { if (effectiveItemSerializer == CosmosItemSerializer.DEFAULT_SERIALIZER - || effectiveItemSerializer == DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER) { + || effectiveItemSerializer == internalDefaultSerializer()) { 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..18828b9330e4 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; @@ -60,6 +88,10 @@ public final class ModelBridgeInternal { private ModelBridgeInternal() {} + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + @Warning(value = INTERNAL_USE_ONLY_WARNING) public static CosmosConflictResponse createCosmosConflictResponse(ResourceResponse response) { return new CosmosConflictResponse(response); @@ -405,7 +437,7 @@ public static ByteBuffer serializeJsonToByteBuffer(SqlQuerySpec sqlQuerySpec) { return sqlQuerySpec .getJsonSerializable() .serializeJsonToByteBuffer( - DefaultCosmosItemSerializer.INTERNAL_DEFAULT_SERIALIZER, + internalDefaultSerializer(), 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 + From 2faa462aed1384f41506610873583999155150f4 Mon Sep 17 00:00:00 2001 From: Abhijeet Mohanty Date: Sat, 11 Apr 2026 17:15:51 -0400 Subject: [PATCH 2/4] Fix review comments: remove duplicate imports, add getter pattern - ModelBridgeInternal.java: Remove 26 duplicate ImplementationBridgeHelpers imports - ItemBulkOperation.java: Remove 2 duplicate ImplementationBridgeHelpers imports - SqlQuerySpecWithEncryption.java: Add private static internalDefaultSerializer() getter (matching uniform pattern), replace inline accessor calls, remove unused DefaultCosmosItemSerializer import Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../models/SqlQuerySpecWithEncryption.java | 10 +++++-- .../batch/ItemBulkOperation.java | 3 -- .../cosmos/models/ModelBridgeInternal.java | 28 +------------------ 3 files changed, 8 insertions(+), 33 deletions(-) diff --git a/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java b/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java index 05a54cff2d80..263bbad6f180 100644 --- a/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java +++ b/sdk/cosmos/azure-cosmos-encryption/src/main/java/com/azure/cosmos/encryption/models/SqlQuerySpecWithEncryption.java @@ -12,7 +12,6 @@ import com.azure.cosmos.encryption.implementation.EncryptionUtils; import com.azure.cosmos.encryption.implementation.mdesrc.cryptography.EncryptionType; import com.azure.cosmos.encryption.implementation.mdesrc.cryptography.MicrosoftDataEncryptionException; -import com.azure.cosmos.implementation.DefaultCosmosItemSerializer; import com.azure.cosmos.implementation.Utils; import com.azure.cosmos.implementation.apachecommons.lang.StringUtils; import com.azure.cosmos.implementation.apachecommons.lang.tuple.Pair; @@ -34,6 +33,11 @@ public final class SqlQuerySpecWithEncryption { private final HashMap encryptionParamMap = new HashMap<>(); private final EncryptionImplementationBridgeHelpers.CosmosEncryptionAsyncContainerHelper.CosmosEncryptionAsyncContainerAccessor cosmosEncryptionAsyncContainerAccessor = EncryptionImplementationBridgeHelpers.CosmosEncryptionAsyncContainerHelper.getCosmosEncryptionAsyncContainerAccessor(); + private static CosmosItemSerializer internalDefaultSerializer() { + return ImplementationBridgeHelpers.CosmosItemSerializerHelper + .getCosmosItemSerializerAccessor().getInternalDefaultSerializer(); + } + /** * Creates a new instance of SQL query spec with encryption. * @@ -87,10 +91,10 @@ Mono addEncryptionParameterAsync(String path, SqlParameter sqlParameter, } byte[] valueByte = EncryptionUtils.serializeJsonToByteArray( - ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer(), + internalDefaultSerializer(), sqlParameter.getValue(Object.class)); JsonNode itemJObj = Utils.parse( - valueByte, JsonNode.class, ImplementationBridgeHelpers.CosmosItemSerializerHelper.getCosmosItemSerializerAccessor().getInternalDefaultSerializer()); + valueByte, JsonNode.class, internalDefaultSerializer()); Pair typeMarkerPair = EncryptionProcessor.toByteArray(itemJObj); byte[] cipherText = 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 366be3ee60b6..66b31d4464c4 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 @@ -6,11 +6,8 @@ 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; 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 18828b9330e4..9330c34cd7a3 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 @@ -5,61 +5,35 @@ import com.azure.cosmos.ConsistencyLevel; import com.azure.cosmos.CosmosDiagnostics; +import com.azure.cosmos.CosmosItemSerializer; 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; From 9929dd28025aed3bdb216286901a71e153ad111d Mon Sep 17 00:00:00 2001 From: Abhijeet Mohanty Date: Mon, 13 Apr 2026 12:23:31 -0400 Subject: [PATCH 3/4] Fix misleading JavaDoc on allAccessorClassesMustHaveStaticInitializerBlock test Clarify that the test verifies accessor resolvability (via or initializeAllAccessors fallback), not that each class independently registers its accessor. Structural enforcement is done by the companion noStaticOrInstanceAccessorFieldsInConsumingClasses test. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --- .../ImplementationBridgeHelpersTest.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) 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 7323fe2d056b..e084e6dd2743 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 @@ -286,15 +286,19 @@ public static void main(String[] args) { } /** - * Enforces that every {@code *Helper} inner class in - * {@link ImplementationBridgeHelpers} registers its accessor during {@code } - * (i.e., has a {@code static { initialize(); }} block). + * Verifies that every {@code *Helper} inner class in + * {@link ImplementationBridgeHelpers} has a resolvable accessor — i.e., calling + * {@code getXxxAccessor()} returns a non-null value in a clean JVM. *

- * 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. + * A forked child JVM iterates every {@code *Helper} inner class, calls each + * {@code getXxxAccessor()} getter, and checks the accessor is non-null via reflection. + *

+ * Note: the getter falls back to {@code initializeAllAccessors()} when the accessor + * is not yet set, so this test validates that every accessor is resolvable + * (either via the class's own {@code static { initialize(); }} or the bulk fallback), + * not that each class independently registers its accessor during {@code }. + * The structural contract (no static/final accessor fields in consuming classes) is + * enforced separately by {@link #noStaticOrInstanceAccessorFieldsInConsumingClasses}. */ @Test(groups = { "unit" }) public void allAccessorClassesMustHaveStaticInitializerBlock() throws Exception { From bc54e907fd2ed3e10902d16b89f917ea0aa3404b Mon Sep 17 00:00:00 2001 From: Abhijeet Mohanty Date: Mon, 13 Apr 2026 12:35:46 -0400 Subject: [PATCH 4/4] Refactoring. --- sdk/cosmos/azure-cosmos/CHANGELOG.md | 1 - .../main/java/com/azure/cosmos/models/ModelBridgeInternal.java | 1 - 2 files changed, 2 deletions(-) diff --git a/sdk/cosmos/azure-cosmos/CHANGELOG.md b/sdk/cosmos/azure-cosmos/CHANGELOG.md index 28dca7976f58..0aee14e73f56 100644 --- a/sdk/cosmos/azure-cosmos/CHANGELOG.md +++ b/sdk/cosmos/azure-cosmos/CHANGELOG.md @@ -9,7 +9,6 @@ #### Bugs Fixed * Fixed an issue where change feed with `startFrom` point-in-time returned `400` on merged partitions by enabling the `CHANGE_FEED_WITH_START_TIME_POST_MERGE` SDK capability. * 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/models/ModelBridgeInternal.java b/sdk/cosmos/azure-cosmos/src/main/java/com/azure/cosmos/models/ModelBridgeInternal.java index 9330c34cd7a3..152407a11e5d 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 @@ -12,7 +12,6 @@ import com.azure.cosmos.implementation.CosmosResourceType; import com.azure.cosmos.implementation.Database; import com.azure.cosmos.implementation.DatabaseAccount; -import com.azure.cosmos.implementation.DefaultCosmosItemSerializer; import com.azure.cosmos.implementation.DocumentCollection; import com.azure.cosmos.implementation.HttpConstants; import com.azure.cosmos.implementation.ImplementationBridgeHelpers;