Skip to content

Commit 1118704

Browse files
NorekZwassim-k
authored andcommitted
Non-deterministic collection initialization fixed
1 parent 536af98 commit 1118704

File tree

2 files changed

+40
-38
lines changed

2 files changed

+40
-38
lines changed

Orleans.Providers.MongoDB/Orleans.Providers.MongoDB.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
<PackageTags>Orleans OrleansProviders MongoDB</PackageTags>
1616
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
1717
<TargetFrameworks>net8.0</TargetFrameworks>
18-
<Version>8.0.0</Version>
18+
<Version>8.0.1</Version>
1919
</PropertyGroup>
2020

2121
<ItemGroup>

Orleans.Providers.MongoDB/Utils/CollectionBase.cs

Lines changed: 39 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,25 @@ public class CollectionBase<TEntity>
2222

2323
private readonly IMongoDatabase mongoDatabase;
2424
private readonly IMongoClient mongoClient;
25-
private readonly Lazy<IMongoCollection<TEntity>> mongoCollection;
25+
private readonly Action<MongoCollectionSettings> collectionConfigurator;
26+
private IMongoCollection<TEntity> mongoCollection;
27+
private readonly object mongoCollectionInitializerLock = new();
2628
private readonly bool createShardKey;
2729

2830
protected IMongoCollection<TEntity> Collection
2931
{
30-
get { return mongoCollection.Value; }
32+
get
33+
{
34+
if (mongoCollection == null)
35+
{
36+
lock (mongoCollectionInitializerLock)
37+
{
38+
mongoCollection ??= CreateCollection(collectionConfigurator);
39+
}
40+
}
41+
42+
return mongoCollection;
43+
}
3144
}
3245

3346
protected IMongoDatabase Database
@@ -44,9 +57,9 @@ protected CollectionBase(IMongoClient mongoClient, string databaseName,
4457
Action<MongoCollectionSettings> collectionConfigurator, bool createShardKey)
4558
{
4659
this.mongoClient = mongoClient;
60+
this.collectionConfigurator = collectionConfigurator;
4761

4862
mongoDatabase = mongoClient.GetDatabase(databaseName);
49-
mongoCollection = CreateCollection(collectionConfigurator);
5063

5164
this.createShardKey = createShardKey;
5265
}
@@ -65,51 +78,40 @@ protected virtual void SetupCollection(IMongoCollection<TEntity> collection)
6578
{
6679
}
6780

68-
private Lazy<IMongoCollection<TEntity>> CreateCollection(Action<MongoCollectionSettings> collectionConfigurator)
81+
private IMongoCollection<TEntity> CreateCollection(Action<MongoCollectionSettings> collectionConfigurator)
6982
{
70-
return new Lazy<IMongoCollection<TEntity>>(() =>
71-
{
72-
var collectionFilter = new ListCollectionNamesOptions
73-
{
74-
Filter = Builders<BsonDocument>.Filter.Eq("name", CollectionName())
75-
};
83+
var collectionName = CollectionName();
7684

77-
if (!mongoDatabase.ListCollectionNames(collectionFilter).Any())
78-
{
79-
mongoDatabase.CreateCollection(CollectionName());
80-
}
81-
82-
var collectionSettings = CollectionSettings() ?? new MongoCollectionSettings();
85+
var collectionSettings = CollectionSettings() ?? new MongoCollectionSettings();
8386

84-
collectionConfigurator?.Invoke(collectionSettings);
87+
collectionConfigurator?.Invoke(collectionSettings);
8588

86-
var databaseCollection = mongoDatabase.GetCollection<TEntity>(
87-
CollectionName(),
88-
collectionSettings);
89+
var databaseCollection = mongoDatabase.GetCollection<TEntity>(
90+
collectionName,
91+
collectionSettings);
8992

90-
if (this.createShardKey)
93+
if (createShardKey)
94+
{
95+
try
9196
{
92-
try
97+
mongoClient.GetDatabase("admin").RunCommand<BsonDocument>(new BsonDocument
9398
{
94-
Database.RunCommand<BsonDocument>(new BsonDocument
99+
["shardCollection"] = $"{mongoDatabase.DatabaseNamespace.DatabaseName}.{collectionName}",
100+
["key"] = new BsonDocument
95101
{
96-
["key"] = new BsonDocument
97-
{
98-
["_id"] = "hashed"
99-
},
100-
["shardCollection"] = $"{mongoDatabase.DatabaseNamespace.DatabaseName}.{CollectionName()}"
101-
});
102-
}
103-
catch (MongoException)
104-
{
105-
// Shared key probably created already.
106-
}
102+
["_id"] = "hashed"
103+
}
104+
});
105+
}
106+
catch (MongoException)
107+
{
108+
// Shared key probably created already.
107109
}
110+
}
108111

109-
SetupCollection(databaseCollection);
112+
SetupCollection(databaseCollection);
110113

111-
return databaseCollection;
112-
});
114+
return databaseCollection;
113115
}
114116
}
115117
}

0 commit comments

Comments
 (0)