Skip to content

Commit

Permalink
Bug fix: CachingConverterResolver concurrency (#282)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
fw2568 authored Mar 16, 2024
1 parent 21be968 commit 27295b3
Showing 1 changed file with 25 additions and 13 deletions.
38 changes: 25 additions & 13 deletions src/YaNco.Core/TypeMapping/CachingConverterResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,40 +20,52 @@ public CachingConverterResolver(IRfcConverterResolver decoratedResolver)
public IEnumerable<IToAbapValueConverter<T>> GetToRfcConverters<T>(RfcType rfcType)
{
var sourceType = typeof(T);
var key = $"{rfcType}_{sourceType}";
var key = $"{rfcType}_{sourceType.AssemblyQualifiedName}";

if (!_toRfcConverters.ContainsKey(key))
if (!_toRfcConverters.TryGetValue(key, out var entry))
{
var converters = _decoratedResolver.GetToRfcConverters<T>(rfcType).ToArray();
_toRfcConverters.Add(key, converters.Length == 0 ? null : converters);

entry = converters.Length == 0 ? null : converters;
try
{
_toRfcConverters.Add(key, entry);
}
catch (Exception)
{
// ignored
}
}

var entry = _toRfcConverters[key];

if (entry != null)
return (IEnumerable<IToAbapValueConverter<T>>)entry;
return new IToAbapValueConverter<T>[0];
return Array.Empty<IToAbapValueConverter<T>>();


}

public IEnumerable<IFromAbapValueConverter<T>> GetFromRfcConverters<T>(RfcType rfcType, Type abapValueType)
{
var targetType = typeof(T);
var key = $"{rfcType}_{targetType}";
var key = $"{rfcType}_{targetType.AssemblyQualifiedName}";

if (!_fromRfcConverters.ContainsKey(key))
if (!_fromRfcConverters.TryGetValue(key, out var entry))
{
var converters = _decoratedResolver.GetFromRfcConverters<T>(rfcType, abapValueType).ToArray();
_fromRfcConverters.Add(key, converters.Length == 0 ? null : converters);
entry = converters.Length == 0 ? null : converters;
try
{
_fromRfcConverters.Add(key, entry);
}
catch (Exception)
{
// ignored
}
}

var entry = _fromRfcConverters[key];

if (entry != null)
return (IEnumerable<IFromAbapValueConverter<T>>)entry;
return new IFromAbapValueConverter<T>[0];
return Array.Empty<IFromAbapValueConverter<T>>();
}

}
}

0 comments on commit 27295b3

Please sign in to comment.