mirror of
https://github.com/btcpayserver/btcpayserver.git
synced 2025-03-03 17:36:59 +01:00
Remove CachedRateProvider
This commit is contained in:
parent
7a0991d6b1
commit
6dffbbd93d
3 changed files with 4 additions and 96 deletions
|
@ -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<ExchangeRates> GetRatesAsync(CancellationToken cancellationToken)
|
|
||||||
{
|
|
||||||
return MemoryCache.GetOrCreateAsync("EXCHANGE_RATES_" + ExchangeName, (ICacheEntry entry) =>
|
|
||||||
{
|
|
||||||
entry.AbsoluteExpiration = DateTimeOffset.UtcNow + CacheSpan;
|
|
||||||
return _Inner.GetRatesAsync(cancellationToken);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -49,16 +49,13 @@ namespace BTCPayServer.Services.Rates
|
||||||
public ExchangeRates ExchangeRates { get; set; }
|
public ExchangeRates ExchangeRates { get; set; }
|
||||||
public ExchangeException Exception { get; internal set; }
|
public ExchangeException Exception { get; internal set; }
|
||||||
}
|
}
|
||||||
public RateProviderFactory(IOptions<MemoryCacheOptions> cacheOptions,
|
public RateProviderFactory(IHttpClientFactory httpClientFactory)
|
||||||
IHttpClientFactory httpClientFactory)
|
|
||||||
{
|
{
|
||||||
_httpClientFactory = httpClientFactory;
|
_httpClientFactory = httpClientFactory;
|
||||||
_CacheOptions = cacheOptions;
|
|
||||||
// We use 15 min because of limits with free version of bitcoinaverage
|
// We use 15 min because of limits with free version of bitcoinaverage
|
||||||
CacheSpan = TimeSpan.FromMinutes(15.0);
|
CacheSpan = TimeSpan.FromMinutes(15.0);
|
||||||
InitExchanges();
|
InitExchanges();
|
||||||
}
|
}
|
||||||
private IOptions<MemoryCacheOptions> _CacheOptions;
|
|
||||||
TimeSpan _CacheSpan;
|
TimeSpan _CacheSpan;
|
||||||
public TimeSpan CacheSpan
|
public TimeSpan CacheSpan
|
||||||
{
|
{
|
||||||
|
@ -74,12 +71,6 @@ namespace BTCPayServer.Services.Rates
|
||||||
}
|
}
|
||||||
public void InvalidateCache()
|
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)
|
if (Providers.TryGetValue(CoinGeckoRateProvider.CoinGeckoName, out var coinAverage) && coinAverage is BackgroundFetcherRateProvider c)
|
||||||
{
|
{
|
||||||
c.RefreshRate = CacheSpan;
|
c.RefreshRate = CacheSpan;
|
||||||
|
|
|
@ -2786,12 +2786,7 @@ noninventoryitem:
|
||||||
|
|
||||||
public static RateProviderFactory CreateBTCPayRateFactory()
|
public static RateProviderFactory CreateBTCPayRateFactory()
|
||||||
{
|
{
|
||||||
return new RateProviderFactory(CreateMemoryCache(), new MockHttpClientFactory());
|
return new RateProviderFactory(new MockHttpClientFactory());
|
||||||
}
|
|
||||||
|
|
||||||
private static MemoryCacheOptions CreateMemoryCache()
|
|
||||||
{
|
|
||||||
return new MemoryCacheOptions() { ExpirationScanFrequency = TimeSpan.FromSeconds(1.0) };
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class SpyRateProvider : IRateProvider
|
class SpyRateProvider : IRateProvider
|
||||||
|
@ -2895,42 +2890,17 @@ noninventoryitem:
|
||||||
public void CheckRatesProvider()
|
public void CheckRatesProvider()
|
||||||
{
|
{
|
||||||
var spy = new SpyRateProvider();
|
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();
|
var factory = CreateBTCPayRateFactory();
|
||||||
factory.Providers.Clear();
|
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);
|
factory.CacheSpan = TimeSpan.FromSeconds(1);
|
||||||
|
|
||||||
var fetcher = new RateFetcher(factory);
|
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();
|
factory.Providers.Clear();
|
||||||
var fetch = new BackgroundFetcherRateProvider("spy", spy);
|
var fetch = new BackgroundFetcherRateProvider("spy", spy);
|
||||||
fetch.DoNotAutoFetchIfExpired = true;
|
fetch.DoNotAutoFetchIfExpired = true;
|
||||||
factory.Providers.Add("bittrex", fetch);
|
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();
|
spy.AssertHit();
|
||||||
fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult();
|
fetchedRate = fetcher.FetchRate(CurrencyPair.Parse("BTC_USD"), rateRules, default).GetAwaiter().GetResult();
|
||||||
spy.AssertNotHit();
|
spy.AssertNotHit();
|
||||||
|
|
Loading…
Add table
Reference in a new issue