diff --git a/BTCPayServer.Rating/Providers/CachedRateProvider.cs b/BTCPayServer.Rating/Providers/CachedRateProvider.cs deleted file mode 100644 index 8bcb1e928..000000000 --- a/BTCPayServer.Rating/Providers/CachedRateProvider.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using System.Threading.Tasks; -using BTCPayServer.Rating; -using BTCPayServer.Services.Rates; -using Microsoft.Extensions.Caching.Memory; - -namespace BTCPayServer.Services.Rates -{ - public class CachedRateProvider : IRateProvider, IHasExchangeName - { - private IRateProvider _Inner; - private IMemoryCache _MemoryCache; - - public CachedRateProvider(string exchangeName, IRateProvider inner, IMemoryCache memoryCache) - { - if (inner == null) - throw new ArgumentNullException(nameof(inner)); - if (memoryCache == null) - throw new ArgumentNullException(nameof(memoryCache)); - this._Inner = inner; - this.MemoryCache = memoryCache; - this.ExchangeName = exchangeName; - } - - public IRateProvider Inner - { - get - { - return _Inner; - } - } - - public string ExchangeName { get; } - - public TimeSpan CacheSpan - { - get; - set; - } = TimeSpan.FromMinutes(1.0); - public IMemoryCache MemoryCache { get => _MemoryCache; set => _MemoryCache = value; } - - public Task GetRatesAsync(CancellationToken cancellationToken) - { - return MemoryCache.GetOrCreateAsync("EXCHANGE_RATES_" + ExchangeName, (ICacheEntry entry) => - { - entry.AbsoluteExpiration = DateTimeOffset.UtcNow + CacheSpan; - return _Inner.GetRatesAsync(cancellationToken); - }); - } - } -} diff --git a/BTCPayServer.Rating/Services/RateProviderFactory.cs b/BTCPayServer.Rating/Services/RateProviderFactory.cs index bdabeae2c..53d34ea15 100644 --- a/BTCPayServer.Rating/Services/RateProviderFactory.cs +++ b/BTCPayServer.Rating/Services/RateProviderFactory.cs @@ -49,16 +49,13 @@ namespace BTCPayServer.Services.Rates public ExchangeRates ExchangeRates { get; set; } public ExchangeException Exception { get; internal set; } } - public RateProviderFactory(IOptions cacheOptions, - IHttpClientFactory httpClientFactory) + public RateProviderFactory(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; - _CacheOptions = cacheOptions; // We use 15 min because of limits with free version of bitcoinaverage CacheSpan = TimeSpan.FromMinutes(15.0); InitExchanges(); } - private IOptions _CacheOptions; TimeSpan _CacheSpan; public TimeSpan CacheSpan { @@ -74,12 +71,6 @@ namespace BTCPayServer.Services.Rates } public void InvalidateCache() { - var cache = new MemoryCache(_CacheOptions); - foreach (var provider in Providers.Select(p => p.Value as CachedRateProvider).Where(p => p != null)) - { - provider.CacheSpan = CacheSpan; - provider.MemoryCache = cache; - } if (Providers.TryGetValue(CoinGeckoRateProvider.CoinGeckoName, out var coinAverage) && coinAverage is BackgroundFetcherRateProvider c) { c.RefreshRate = CacheSpan; diff --git a/BTCPayServer.Tests/UnitTest1.cs b/BTCPayServer.Tests/UnitTest1.cs index d7ed7478b..d813fc10c 100644 --- a/BTCPayServer.Tests/UnitTest1.cs +++ b/BTCPayServer.Tests/UnitTest1.cs @@ -2786,12 +2786,7 @@ noninventoryitem: public static RateProviderFactory CreateBTCPayRateFactory() { - return new RateProviderFactory(CreateMemoryCache(), new MockHttpClientFactory()); - } - - private static MemoryCacheOptions CreateMemoryCache() - { - return new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromSeconds(1.0) }; + return new RateProviderFactory(new MockHttpClientFactory()); } class SpyRateProvider : IRateProvider @@ -2895,42 +2890,17 @@ noninventoryitem: public void CheckRatesProvider() { var spy = new SpyRateProvider(); - RateRules.TryParse("X_X = coinaverage(X_X);", out var rateRules); + RateRules.TryParse("X_X = bittrex(X_X);", out var rateRules); var factory = CreateBTCPayRateFactory(); factory.Providers.Clear(); - factory.Providers.Add("coinaverage", new CachedRateProvider("coinaverage", spy, new MemoryCache(CreateMemoryCache()))); - factory.Providers.Add("bittrex", new CachedRateProvider("bittrex", spy, new MemoryCache(CreateMemoryCache()))); factory.CacheSpan = TimeSpan.FromSeconds(1); - var fetcher = new RateFetcher(factory); - - var fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); - spy.AssertHit(); - fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); - spy.AssertNotHit(); - - Thread.Sleep(3000); - fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); - spy.AssertHit(); - fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); - spy.AssertNotHit(); - // Should cache at exchange level so this should hit the cache - var fetchedRate2 = fetcher.FetchRate(CurrencyPair.Parse("LTC_USD"), rateRules, default).GetAwaiter().GetResult(); - spy.AssertNotHit(); - Assert.Null(fetchedRate2.BidAsk); - Assert.Equal(RateRulesErrors.RateUnavailable, fetchedRate2.Errors.First()); - - // Should cache at exchange level this should not hit the cache as it is different exchange - RateRules.TryParse("X_X = bittrex(X_X);", out rateRules); - fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); - spy.AssertHit(); - factory.Providers.Clear(); var fetch = new BackgroundFetcherRateProvider("spy", spy); fetch.DoNotAutoFetchIfExpired = true; factory.Providers.Add("bittrex", fetch); - fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); + var fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); spy.AssertHit(); fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult(); spy.AssertNotHit();