Please wait. This can take some minutes ...
Many resources are needed to download a project. Please understand that we have to compensate our server costs. Thank you in advance.
Project price only 1 $
You can buy this project and download/modify it how often you want.
com.azure.cosmos.implementation.directconnectivity.ReplicatedResourceClient Maven / Gradle / Ivy
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
package com.azure.cosmos.implementation.directconnectivity;
import com.azure.cosmos.ConsistencyLevel;
import com.azure.cosmos.CosmosContainerProactiveInitConfig;
import com.azure.cosmos.SessionRetryOptions;
import com.azure.cosmos.implementation.BackoffRetryUtility;
import com.azure.cosmos.implementation.Configs;
import com.azure.cosmos.implementation.DiagnosticsClientContext;
import com.azure.cosmos.implementation.HttpConstants;
import com.azure.cosmos.implementation.IAuthorizationTokenProvider;
import com.azure.cosmos.implementation.ISessionContainer;
import com.azure.cosmos.implementation.OperationType;
import com.azure.cosmos.implementation.Quadruple;
import com.azure.cosmos.implementation.ReplicatedResourceClientUtils;
import com.azure.cosmos.implementation.ResourceType;
import com.azure.cosmos.implementation.RxDocumentServiceRequest;
import com.azure.cosmos.implementation.faultinjection.IFaultInjectorProvider;
import com.azure.cosmos.implementation.throughputControl.ThroughputControlStore;
import com.azure.cosmos.models.CosmosContainerIdentity;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
import java.time.Duration;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;
/**
* ReplicatedResourceClient uses the ConsistencyReader to make requests to
* backend
*/
public class ReplicatedResourceClient {
private static final int GONE_AND_RETRY_WITH_TIMEOUT_IN_SECONDS = 30;
private static final int STRONG_GONE_AND_RETRY_WITH_RETRY_TIMEOUT_SECONDS = 60;
private static final int MIN_BACKOFF_FOR_FAILING_BACK_TO_OTHER_REGIONS_FOR_READ_REQUESTS_IN_SECONDS = 1;
private final AddressSelector addressSelector;
private final ConsistencyReader consistencyReader;
private final ConsistencyWriter consistencyWriter;
private final TransportClient transportClient;
private final GatewayServiceConfigurationReader serviceConfigReader;
public ReplicatedResourceClient(
DiagnosticsClientContext diagnosticsClientContext,
Configs configs,
AddressSelector addressSelector,
ISessionContainer sessionContainer,
TransportClient transportClient,
GatewayServiceConfigurationReader serviceConfigReader,
IAuthorizationTokenProvider authorizationTokenProvider,
boolean useMultipleWriteLocations,
SessionRetryOptions sessionRetryOptions) {
Protocol protocol = configs.getProtocol();
this.addressSelector = addressSelector;
if (protocol != Protocol.HTTPS && protocol != Protocol.TCP) {
throw new IllegalArgumentException("protocol");
}
this.transportClient = transportClient;
this.serviceConfigReader = serviceConfigReader;
this.consistencyReader = new ConsistencyReader(diagnosticsClientContext,
configs,
this.addressSelector,
sessionContainer,
transportClient,
serviceConfigReader,
authorizationTokenProvider,
sessionRetryOptions);
this.consistencyWriter = new ConsistencyWriter(diagnosticsClientContext,
this.addressSelector,
sessionContainer,
transportClient,
authorizationTokenProvider,
serviceConfigReader,
useMultipleWriteLocations,
sessionRetryOptions);
}
public void enableThroughputControl(ThroughputControlStore throughputControlStore) {
this.transportClient.enableThroughputControl(throughputControlStore);
}
public static boolean isReadingFromMaster(ResourceType resourceType, OperationType operationType) {
return ReplicatedResourceClientUtils.isReadingFromMaster(resourceType, operationType);
}
public static boolean isMasterResource(ResourceType resourceType) {
return ReplicatedResourceClientUtils.isMasterResource(resourceType);
}
public static boolean isGlobalStrongEnabled() {
return true;
}
public Mono invokeAsync(RxDocumentServiceRequest request,
Function> prepareRequestAsyncDelegate) {
BiFunction, RxDocumentServiceRequest, Mono> mainFuncDelegate = (
Quadruple forceRefreshAndTimeout,
RxDocumentServiceRequest documentServiceRequest) -> {
documentServiceRequest.getHeaders().put(HttpConstants.HttpHeaders.CLIENT_RETRY_ATTEMPT_COUNT,
forceRefreshAndTimeout.getValue3().toString());
documentServiceRequest.getHeaders().put(HttpConstants.HttpHeaders.REMAINING_TIME_IN_MS_ON_CLIENT_REQUEST,
Long.toString(forceRefreshAndTimeout.getValue2().toMillis()));
return getStoreResponseMono(request, forceRefreshAndTimeout);
};
Function, Mono> funcDelegate = (
Quadruple forceRefreshAndTimeout) -> {
if (prepareRequestAsyncDelegate != null) {
return prepareRequestAsyncDelegate.apply(request).flatMap(responseReq -> mainFuncDelegate.apply(forceRefreshAndTimeout, responseReq));
} else {
return mainFuncDelegate.apply(forceRefreshAndTimeout, request);
}
};
int retryTimeout = this.serviceConfigReader.getDefaultConsistencyLevel() == ConsistencyLevel.STRONG ?
ReplicatedResourceClient.STRONG_GONE_AND_RETRY_WITH_RETRY_TIMEOUT_SECONDS :
ReplicatedResourceClient.GONE_AND_RETRY_WITH_TIMEOUT_IN_SECONDS;
return BackoffRetryUtility.executeAsync(
funcDelegate,
new GoneAndRetryWithRetryPolicy(request, retryTimeout),
null,
Duration.ofSeconds(
ReplicatedResourceClient.MIN_BACKOFF_FOR_FAILING_BACK_TO_OTHER_REGIONS_FOR_READ_REQUESTS_IN_SECONDS),
request,
addressSelector);
}
private Mono getStoreResponseMono(RxDocumentServiceRequest request, Quadruple forceRefreshAndTimeout) {
return invokeAsync(request, new TimeoutHelper(forceRefreshAndTimeout.getValue2()),
forceRefreshAndTimeout.getValue1(), forceRefreshAndTimeout.getValue0());
}
public void recordOpenConnectionsAndInitCachesCompleted(List cosmosContainerIdentities) {
this.transportClient.recordOpenConnectionsAndInitCachesCompleted(cosmosContainerIdentities);
}
public void recordOpenConnectionsAndInitCachesStarted(List cosmosContainerIdentities) {
this.transportClient.recordOpenConnectionsAndInitCachesStarted(cosmosContainerIdentities);
}
private Mono invokeAsync(RxDocumentServiceRequest request, TimeoutHelper timeout,
boolean isInRetry, boolean forceRefresh) {
if (request.getOperationType().equals(OperationType.ExecuteJavaScript)) {
if (request.isReadOnlyScript()) {
return this.consistencyReader.readAsync(request, timeout, isInRetry, forceRefresh);
} else {
return this.consistencyWriter.writeAsync(request, timeout, forceRefresh);
}
} else if (request.getOperationType().isWriteOperation()) {
return this.consistencyWriter.writeAsync(request, timeout, forceRefresh);
} else if (request.isReadOnlyRequest()) {
return this.consistencyReader.readAsync(request, timeout, isInRetry, forceRefresh);
} else {
throw new IllegalArgumentException(
String.format("Unexpected operation type %s", request.getOperationType()));
}
}
public Flux submitOpenConnectionTasksAndInitCaches(CosmosContainerProactiveInitConfig proactiveContainerInitConfig) {
return this.addressSelector.submitOpenConnectionTasksAndInitCaches(proactiveContainerInitConfig);
}
public void configureFaultInjectorProvider(IFaultInjectorProvider injectorProvider) {
this.transportClient.configureFaultInjectorProvider(injectorProvider);
}
}