diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/currency/CurrencyConversionManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/currency/CurrencyConversionManager.java index cc9665b29..365c24651 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/currency/CurrencyConversionManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/currency/CurrencyConversionManager.java @@ -138,24 +138,15 @@ public class CurrencyConversionManager implements Managed { private void updateCoinGeckoCacheIfNecessary() throws IOException { { - final Map coinGeckoValuesFromSharedCache = cacheCluster.withCluster(connection -> { - final Map parsedSharedCacheData = new HashMap<>(); - - connection.sync().hgetall(COIN_GECKO_SHARED_CACHE_DATA_KEY).forEach((currency, conversionRate) -> - parsedSharedCacheData.put(currency, new BigDecimal(conversionRate))); - - return parsedSharedCacheData; - }); + final Map coinGeckoValuesFromSharedCache = getCachedData(COIN_GECKO_SHARED_CACHE_DATA_KEY); if (coinGeckoValuesFromSharedCache != null && !coinGeckoValuesFromSharedCache.isEmpty()) { cachedCoinGeckoValues = coinGeckoValuesFromSharedCache; } } - final boolean shouldUpdateSharedCache = cacheCluster.withCluster(connection -> - "OK".equals(connection.sync().set(COIN_GECKO_SHARED_CACHE_CURRENT_KEY, - "true", - SetArgs.Builder.nx().ex(COIN_GECKO_REFRESH_INTERVAL)))); + final boolean shouldUpdateSharedCache = shouldUpdateSharedCache(COIN_GECKO_SHARED_CACHE_CURRENT_KEY, + COIN_GECKO_REFRESH_INTERVAL); if (shouldUpdateSharedCache || cachedCoinGeckoValues == null) { final Map conversionRatesFromCoinGecko = new HashMap<>(currencies.size()); @@ -167,18 +158,37 @@ public class CurrencyConversionManager implements Managed { cachedCoinGeckoValues = conversionRatesFromCoinGecko; if (shouldUpdateSharedCache) { - cacheCluster.useCluster(connection -> { - final Map sharedCoinGeckoValues = new HashMap<>(); - - cachedCoinGeckoValues.forEach((currency, conversionRate) -> - sharedCoinGeckoValues.put(currency, conversionRate.toString())); - - connection.sync().hset(COIN_GECKO_SHARED_CACHE_DATA_KEY, sharedCoinGeckoValues); - }); + updateCachedData(COIN_GECKO_SHARED_CACHE_DATA_KEY, cachedCoinGeckoValues); } } } + private Map getCachedData(final String cacheKey) { + return cacheCluster.withCluster(connection -> { + final Map parsedSharedCacheData = new HashMap<>(); + + connection.sync().hgetall(cacheKey).forEach((currency, conversionRate) -> + parsedSharedCacheData.put(currency, new BigDecimal(conversionRate))); + + return parsedSharedCacheData; + }); + } + + private boolean shouldUpdateSharedCache(final String cacheKey, final Duration interval) { + return cacheCluster.withCluster(connection -> + "OK".equals(connection.sync().set(cacheKey, "true", SetArgs.Builder.nx().ex(interval)))); + } + + private void updateCachedData(final String cacheKey, final Map data) { + cacheCluster.useCluster(connection -> { + final Map sharedCoinGeckoValues = new HashMap<>(); + + data.forEach((currency, conversionRate) -> sharedCoinGeckoValues.put(currency, conversionRate.toString())); + + connection.sync().hset(cacheKey, sharedCoinGeckoValues); + }); + } + private BigDecimal stripTrailingZerosAfterDecimal(BigDecimal bigDecimal) { BigDecimal n = bigDecimal.stripTrailingZeros(); if (n.scale() < 0) {