Skip to content

Commit 4c572b1

Browse files
michaelstaibAniruddh25
authored andcommitted
Fixed CosmosSqlMetadataProvider concurrency issue. (#2695)
The CosmosSqlMetdataProvider uses a standard dictionary although the metadata provider is accessed and updated concurrently. This causes the issue in #2694. I have updated the implementation to use a ConcurrentDictionary. Fixes #2694 Co-authored-by: Aniruddh Munde <[email protected]>
1 parent 1f618be commit 4c572b1

File tree

1 file changed

+10
-5
lines changed

1 file changed

+10
-5
lines changed

src/Core/Services/MetadataProviders/CosmosSqlMetadataProvider.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
// Copyright (c) Microsoft Corporation.
22
// Licensed under the MIT License.
33

4+
using System.Collections.Concurrent;
45
using System.Diagnostics.CodeAnalysis;
56
using System.IO.Abstractions;
67
using Azure.DataApiBuilder.Config.DatabasePrimitives;
@@ -26,7 +27,7 @@ public class CosmosSqlMetadataProvider : ISqlMetadataProvider
2627
private CosmosDbNoSQLDataSourceOptions _cosmosDb;
2728
private readonly RuntimeEntities _runtimeConfigEntities;
2829
private readonly bool _isDevelopmentMode;
29-
private Dictionary<string, string> _partitionKeyPaths = new();
30+
private ConcurrentDictionary<string, string> _partitionKeyPaths = new();
3031

3132
/// <summary>
3233
/// This contains each entity into EDM model convention which will be used to traverse DB Policy filter using ODataParser
@@ -536,17 +537,21 @@ public IReadOnlyDictionary<string, DatabaseObject> GetEntityNamesAndDbObjects()
536537
/// <inheritdoc />
537538
public string? GetPartitionKeyPath(string database, string container)
538539
{
540+
ArgumentNullException.ThrowIfNull(database);
541+
ArgumentNullException.ThrowIfNull(container);
542+
539543
_partitionKeyPaths.TryGetValue($"{database}/{container}", out string? partitionKeyPath);
540544
return partitionKeyPath;
541545
}
542546

543547
/// <inheritdoc />
544548
public void SetPartitionKeyPath(string database, string container, string partitionKeyPath)
545549
{
546-
if (!_partitionKeyPaths.TryAdd($"{database}/{container}", partitionKeyPath))
547-
{
548-
_partitionKeyPaths[$"{database}/{container}"] = partitionKeyPath;
549-
}
550+
ArgumentNullException.ThrowIfNull(database);
551+
ArgumentNullException.ThrowIfNull(container);
552+
ArgumentNullException.ThrowIfNull(partitionKeyPath);
553+
554+
_partitionKeyPaths.AddOrUpdate($"{database}/{container}", partitionKeyPath, (key, oldValue) => partitionKeyPath);
550555
}
551556

552557
public bool TryGetEntityNameFromPath(string entityPathName, [NotNullWhen(true)] out string? entityName)

0 commit comments

Comments
 (0)