Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
085d7d5
Added ability to accept the AllowOptimisticDirectExecution flag from …
akotalwar Oct 13, 2023
9eda804
Added comment and removed extra spacing
akotalwar Oct 13, 2023
c054c51
Added test coverage
akotalwar Oct 13, 2023
076f345
Added exception handling logic
akotalwar Oct 15, 2023
5f29b91
Resolved comments
akotalwar Oct 20, 2023
2191de4
Added null check for key parameter
akotalwar Oct 23, 2023
61c3893
Removed changes to common test infra
akotalwar Oct 23, 2023
5d24481
Removed all changes from QueryPartitionProviderTestInstance
akotalwar Oct 24, 2023
cc01ca5
Remove changes pt2
akotalwar Oct 24, 2023
a46862f
Removed the dictionary in QueryPartitionProvider and added a bool ins…
akotalwar Oct 24, 2023
6a6e495
Updated GetClientDisableOptimisticDirectExecution()
akotalwar Oct 24, 2023
bdda380
Fixed comments
akotalwar Oct 26, 2023
5f9a2b6
Revert QueryIterator.cs
akotalwar Oct 26, 2023
5e0f682
Undoing changes to settings.json
akotalwar Oct 26, 2023
26dfda8
Undoing changes to QueryIterator.cs
akotalwar Oct 26, 2023
986c3a3
Updated error message
akotalwar Oct 26, 2023
a953803
Made functions static
akotalwar Oct 27, 2023
8d711ff
Cast to bool instead of recasting in GetClientDisableOptimisticDirect…
akotalwar Oct 27, 2023
35d6618
Fix merge conflicts
akotalwar Oct 27, 2023
459a4b9
Merge branch 'master' into users/akotalwar/ODEGatewayConfig
akotalwar Oct 27, 2023
f8cc146
Added ignore flag
akotalwar Dec 7, 2023
0ff09d7
Merge branch 'master' into users/akotalwar/ODEGatewayConfig
akotalwar Dec 7, 2023
ab3f46e
Fixed merge conflicts
akotalwar Dec 7, 2023
a591dff
Updated GetPartitionedQueryExecutionInfoAndPartitionProvider()
akotalwar Dec 7, 2023
4bafe39
Updated return type in OffsetLimitPageSize()
akotalwar Dec 11, 2023
78a1eb7
Merge branch 'master' into users/akotalwar/ODEGatewayConfig
akotalwar Dec 12, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ namespace Microsoft.Azure.Cosmos.Query.Core.ExecutionContext
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using global::Azure;
using Microsoft.Azure.Cosmos;
using Microsoft.Azure.Cosmos.CosmosElements;
using Microsoft.Azure.Cosmos.Pagination;
Expand All @@ -33,7 +32,9 @@ namespace Microsoft.Azure.Cosmos.Query.Core.ExecutionContext
internal static class CosmosQueryExecutionContextFactory
{
private const string InternalPartitionKeyDefinitionProperty = "x-ms-query-partitionkey-definition";
private const string AllowOptimisticDirectExecution = "allowOptimisticDirectExecution";
private const string OptimisticDirectExecution = "OptimisticDirectExecution";
private const string ClientDisableOptimisticDirectExecution = "clientDisableOptimisticDirectExecution";
private const string Passthrough = "Passthrough";
private const string Specialized = "Specialized";
private const int PageSizeFactorForTop = 5;
Expand Down Expand Up @@ -289,9 +290,9 @@ private static async Task<TryCatch<IQueryPipelineStage>> TryCreateFromPartitione
TryCatch<IQueryPipelineStage> tryCreatePipelineStage;

Documents.PartitionKeyRange targetRange = await TryGetTargetRangeOptimisticDirectExecutionAsync(
inputParameters,
partitionedQueryExecutionInfo,
cosmosQueryContext,
inputParameters,
partitionedQueryExecutionInfo,
cosmosQueryContext,
containerQueryProperties,
trace);

Expand Down Expand Up @@ -761,13 +762,20 @@ private static Documents.PartitionKeyDefinition GetPartitionKeyDefinition(InputP
ContainerQueryProperties containerQueryProperties,
ITrace trace)
{
if (!inputParameters.EnableOptimisticDirectExecution)
object queryConfigValue = await cosmosQueryContext.QueryClient.GetQueryEngineConfigurationValueAsync(ClientDisableOptimisticDirectExecution);
bool.TryParse(queryConfigValue.ToString(), out bool clientDisableOptimisticDirectExecution);

// Use the Ode code path only if ClientDisableOptimisticDirectExecution is false and EnableOptimisticDirectExecution is true
if (clientDisableOptimisticDirectExecution || !inputParameters.EnableOptimisticDirectExecution)
{
if (inputParameters.InitialUserContinuationToken != null
&& OptimisticDirectExecutionContinuationToken.IsOptimisticDirectExecutionContinuationToken(inputParameters.InitialUserContinuationToken))
if (inputParameters.InitialUserContinuationToken != null
&& OptimisticDirectExecutionContinuationToken.IsOptimisticDirectExecutionContinuationToken(inputParameters.InitialUserContinuationToken))
{
throw new MalformedContinuationTokenException($"The continuation token supplied requires the Optimistic Direct Execution flag to be enabled in QueryRequestOptions for the query execution to resume. " +
$"{inputParameters.InitialUserContinuationToken}");
string errorMessage = "This query cannot be executed using the provided continuation token. " +
"Please ensure that the EnableOptimisticDirectExecution flag is enabled in the QueryRequestOptions. " +
"If after enabling this flag, you still see this error, contact the database administrator for assistance or retry the query without the continuation token.";

throw new MalformedContinuationTokenException($"{errorMessage} Continuation Token: {inputParameters.InitialUserContinuationToken}");
}

return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,8 @@ public abstract Task<TryCatch<QueryPage>> ExecuteItemQueryAsync(
ITrace trace,
CancellationToken cancellationToken);

public abstract Task<object> GetQueryEngineConfigurationValueAsync(string key);

public abstract Task<PartitionedQueryExecutionInfo> ExecuteQueryPlanRequestAsync(
string resourceUri,
Documents.ResourceType resourceType,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ internal sealed class QueryPartitionProvider : IDisposable
private IntPtr serviceProvider;
private bool disposed;
private string queryengineConfiguration;
public IDictionary<string, object> QueryEngineConfigurationValues;

public QueryPartitionProvider(IDictionary<string, object> queryengineConfiguration)
{
Expand All @@ -59,6 +60,7 @@ public QueryPartitionProvider(IDictionary<string, object> queryengineConfigurati

this.disposed = false;
this.queryengineConfiguration = JsonConvert.SerializeObject(queryengineConfiguration);
this.QueryEngineConfigurationValues = queryengineConfiguration;
this.serviceProvider = IntPtr.Zero;

this.serviceProviderStateLock = new object();
Expand Down Expand Up @@ -91,6 +93,7 @@ public void Update(IDictionary<string, object> queryengineConfiguration)
if (!string.Equals(this.queryengineConfiguration, newConfiguration))
{
this.queryengineConfiguration = newConfiguration;
this.QueryEngineConfigurationValues = queryengineConfiguration;

if (!this.disposed && this.serviceProvider != IntPtr.Zero)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -209,6 +209,22 @@ public override async Task<PartitionedQueryExecutionInfo> ExecuteQueryPlanReques
return partitionedQueryExecutionInfo;
}

public override async Task<object> GetQueryEngineConfigurationValueAsync(string key)
{
if (key == null)
{
throw new ArgumentNullException(nameof(key));
}

QueryPartitionProvider provider = await this.clientContext.DocumentClient.QueryPartitionProvider;
if (provider.QueryEngineConfigurationValues.TryGetValue(key, out object queryConfigProperty))
{
return queryConfigProperty;
}

throw new KeyNotFoundException($"The key '{key}' was not found in the QueryEngineConfiguration dictionary.");
}

public override async Task<List<PartitionKeyRange>> GetTargetPartitionKeyRangeByFeedRangeAsync(
string resourceLink,
string collectionResourceId,
Expand Down
4 changes: 2 additions & 2 deletions Microsoft.Azure.Cosmos/src/Query/v3Query/QueryIterator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -146,9 +146,9 @@ public static QueryIterator Create(
forcePassthrough: forcePassthrough,
enableOptimisticDirectExecution: queryRequestOptions.EnableOptimisticDirectExecution,
testInjections: queryRequestOptions.TestSettings);

return new QueryIterator(
cosmosQueryContext,
cosmosQueryContext,
CosmosQueryExecutionContextFactory.Create(documentContainer, cosmosQueryContext, inputParameters, NoOpTrace.Singleton),
queryRequestOptions.CosmosSerializationFormatOptions,
queryRequestOptions,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public sealed class OptimisticDirectExecutionQueryTests : QueryTestsBase
private const string PartitionKeyField = "key";
private const string NumberField = "numberField";
private const string NullField = "nullField";
private const string ClientDisableOptimisticDirectExecution = "clientDisableOptimisticDirectExecution";

private static class PageSizeOptions
{
Expand Down Expand Up @@ -538,6 +539,19 @@ await this.CreateIngestQueryDeleteAsync(
documents,
(container, documents) => RunFailingTests(container, invalidQueries),
"/" + PartitionKeyField);
}

[TestMethod]
public async Task TestClientDisableOdeFlagInCosmosClient()
{
string authKey = Utils.ConfigurationManager.AppSettings["MasterKey"];
string endpoint = Utils.ConfigurationManager.AppSettings["GatewayEndpoint"];

CosmosClient client = new CosmosClient($"AccountEndpoint={endpoint};AccountKey={authKey}");
AccountProperties properties = await client.ReadAccountAsync();

Assert.IsTrue(properties.QueryEngineConfigurationString.Contains(ClientDisableOptimisticDirectExecution));
Assert.IsFalse(Convert.ToBoolean(properties.QueryEngineConfiguration[ClientDisableOptimisticDirectExecution]));
}

private static async Task RunTests(IEnumerable<DirectExecutionTestCase> testCases, Container container)
Expand Down
Loading