Skip to content

Commit 711fdf6

Browse files
authored
CSHARP-5225: Mongo Serialization Deadlock (#1436)
1 parent 6590a1d commit 711fdf6

File tree

2 files changed

+13
-11
lines changed

2 files changed

+13
-11
lines changed

src/MongoDB.Bson/Serialization/BsonClassMap.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -333,8 +333,7 @@ public static BsonClassMap LookupClassMap(Type classType)
333333
BsonSerializer.ConfigLock.EnterReadLock();
334334
try
335335
{
336-
BsonClassMap classMap;
337-
if (__classMaps.TryGetValue(classType, out classMap))
336+
if (__classMaps.TryGetValue(classType, out var classMap))
338337
{
339338
if (classMap.IsFrozen)
340339
{
@@ -347,19 +346,22 @@ public static BsonClassMap LookupClassMap(Type classType)
347346
BsonSerializer.ConfigLock.ExitReadLock();
348347
}
349348

349+
// automatically create a new classMap for classType and register it (unless another thread does first)
350+
// do the work of speculatively creating a new class map outside of holding any lock
351+
var classMapDefinition = typeof(BsonClassMap<>);
352+
var classMapType = classMapDefinition.MakeGenericType(classType);
353+
var newClassMap = (BsonClassMap)Activator.CreateInstance(classMapType);
354+
newClassMap.AutoMap();
355+
350356
BsonSerializer.ConfigLock.EnterWriteLock();
351357
try
352358
{
353-
BsonClassMap classMap;
354-
if (!__classMaps.TryGetValue(classType, out classMap))
359+
if (!__classMaps.TryGetValue(classType, out var classMap))
355360
{
356-
// automatically create a classMap for classType and register it
357-
var classMapDefinition = typeof(BsonClassMap<>);
358-
var classMapType = classMapDefinition.MakeGenericType(classType);
359-
classMap = (BsonClassMap)Activator.CreateInstance(classMapType);
360-
classMap.AutoMap();
361-
RegisterClassMap(classMap);
361+
RegisterClassMap(newClassMap);
362+
classMap = newClassMap;
362363
}
364+
363365
return classMap.Freeze();
364366
}
365367
finally

src/MongoDB.Bson/Serialization/Serializers/DictionarySerializerBase.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public IBsonSerializer ValueSerializer
115115
get { return _valueSerializer; }
116116
}
117117

118-
// public methods
118+
// public methods
119119
/// <inheritdoc/>
120120
public override bool Equals(object obj)
121121
{

0 commit comments

Comments
 (0)