Skip to content

Commit 27295b3

Browse files
authored
Bug fix: CachingConverterResolver concurrency (#282)
The CachingConverterResolver sometimes throws on concurrent request. Code was updated to improve stability and to return a result even if cache update failed. Cache was also updated to cache .NET type with full qualified assembly name.
1 parent 21be968 commit 27295b3

File tree

1 file changed

+25
-13
lines changed

1 file changed

+25
-13
lines changed

src/YaNco.Core/TypeMapping/CachingConverterResolver.cs

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,40 +20,52 @@ public CachingConverterResolver(IRfcConverterResolver decoratedResolver)
2020
public IEnumerable<IToAbapValueConverter<T>> GetToRfcConverters<T>(RfcType rfcType)
2121
{
2222
var sourceType = typeof(T);
23-
var key = $"{rfcType}_{sourceType}";
23+
var key = $"{rfcType}_{sourceType.AssemblyQualifiedName}";
2424

25-
if (!_toRfcConverters.ContainsKey(key))
25+
if (!_toRfcConverters.TryGetValue(key, out var entry))
2626
{
2727
var converters = _decoratedResolver.GetToRfcConverters<T>(rfcType).ToArray();
28-
_toRfcConverters.Add(key, converters.Length == 0 ? null : converters);
29-
28+
entry = converters.Length == 0 ? null : converters;
29+
try
30+
{
31+
_toRfcConverters.Add(key, entry);
32+
}
33+
catch (Exception)
34+
{
35+
// ignored
36+
}
3037
}
3138

32-
var entry = _toRfcConverters[key];
33-
3439
if (entry != null)
3540
return (IEnumerable<IToAbapValueConverter<T>>)entry;
36-
return new IToAbapValueConverter<T>[0];
41+
return Array.Empty<IToAbapValueConverter<T>>();
3742

3843

3944
}
4045

4146
public IEnumerable<IFromAbapValueConverter<T>> GetFromRfcConverters<T>(RfcType rfcType, Type abapValueType)
4247
{
4348
var targetType = typeof(T);
44-
var key = $"{rfcType}_{targetType}";
49+
var key = $"{rfcType}_{targetType.AssemblyQualifiedName}";
4550

46-
if (!_fromRfcConverters.ContainsKey(key))
51+
if (!_fromRfcConverters.TryGetValue(key, out var entry))
4752
{
4853
var converters = _decoratedResolver.GetFromRfcConverters<T>(rfcType, abapValueType).ToArray();
49-
_fromRfcConverters.Add(key, converters.Length == 0 ? null : converters);
54+
entry = converters.Length == 0 ? null : converters;
55+
try
56+
{
57+
_fromRfcConverters.Add(key, entry);
58+
}
59+
catch (Exception)
60+
{
61+
// ignored
62+
}
5063
}
5164

52-
var entry = _fromRfcConverters[key];
53-
5465
if (entry != null)
5566
return (IEnumerable<IFromAbapValueConverter<T>>)entry;
56-
return new IFromAbapValueConverter<T>[0];
67+
return Array.Empty<IFromAbapValueConverter<T>>();
5768
}
69+
5870
}
5971
}

0 commit comments

Comments
 (0)