diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 4ea6c2e91..674f45aea 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -257,7 +257,7 @@ import org.whispersystems.textsecuregcm.subscriptions.BraintreeManager; import org.whispersystems.textsecuregcm.subscriptions.GooglePlayBillingManager; import org.whispersystems.textsecuregcm.subscriptions.StripeManager; import org.whispersystems.textsecuregcm.util.BufferingInterceptor; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ManagedAwsCrt; import org.whispersystems.textsecuregcm.util.ManagedExecutors; import org.whispersystems.textsecuregcm.util.SystemMapper; @@ -365,12 +365,12 @@ public class WhisperServerService extends Application - CircuitBreakerUtil.getCircuitBreakerRegistry().addConfiguration(name, configuration.toCircuitBreakerConfig())); + ResilienceUtil.getCircuitBreakerRegistry().addConfiguration(name, configuration.toCircuitBreakerConfig())); config.getRetryConfigurations().forEach((name, configuration) -> - CircuitBreakerUtil.getRetryRegistry().addConfiguration(name, configuration.toRetryConfigBuilder().build())); + ResilienceUtil.getRetryRegistry().addConfiguration(name, configuration.toRetryConfigBuilder().build())); - CircuitBreakerUtil.setGeneralRedisRetryConfiguration(config.getGeneralRedisRetryConfiguration()); + ResilienceUtil.setGeneralRedisRetryConfiguration(config.getGeneralRedisRetryConfiguration()); ScheduledExecutorService dynamicConfigurationExecutor = ScheduledExecutorServiceBuilder.of(environment, "dynamicConfiguration") .threads(1).build(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java index 065fbe2d2..5675203d5 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/auth/DisconnectionRequestManager.java @@ -35,7 +35,7 @@ import org.whispersystems.textsecuregcm.redis.FaultTolerantPubSubConnection; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.Device; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.UUIDUtil; /** @@ -188,7 +188,7 @@ public class DisconnectionRequestManager extends RedisPubSubAdapter pubSubClient.withBinaryConnection(connection -> connection.async().publish(DISCONNECTION_REQUEST_CHANNEL, disconnectionRequest.toByteArray())) .toCompletableFuture()) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java index 6beb85516..f1905346e 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClient.java @@ -9,7 +9,6 @@ import com.google.common.annotations.VisibleForTesting; import io.github.resilience4j.circuitbreaker.CircuitBreaker; import io.github.resilience4j.retry.Retry; import io.github.resilience4j.retry.RetryConfig; -import io.micrometer.core.instrument.Tags; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; @@ -30,7 +29,7 @@ import java.util.stream.IntStream; import javax.annotation.Nullable; import org.glassfish.jersey.SslConfigurator; import org.whispersystems.textsecuregcm.util.CertificateUtil; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ExceptionUtils; public class FaultTolerantHttpClient { @@ -211,8 +210,8 @@ public class FaultTolerantHttpClient { if (retryExecutor != null) { final RetryConfig.Builder> retryConfigBuilder = RetryConfig.from(Optional.ofNullable(retryConfigurationName) - .flatMap(name -> CircuitBreakerUtil.getRetryRegistry().getConfiguration(name)) - .orElseGet(() -> CircuitBreakerUtil.getRetryRegistry().getDefaultConfig())); + .flatMap(name -> ResilienceUtil.getRetryRegistry().getConfiguration(name)) + .orElseGet(() -> ResilienceUtil.getRetryRegistry().getDefaultConfig())); retryConfigBuilder.retryOnResult(response -> response.statusCode() >= 500); @@ -220,7 +219,7 @@ public class FaultTolerantHttpClient { retryConfigBuilder.retryOnException(retryOnException); } - retry = CircuitBreakerUtil.getRetryRegistry().retry(name + "-retry", retryConfigBuilder.build()); + retry = ResilienceUtil.getRetryRegistry().retry(name + "-retry", retryConfigBuilder.build()); } else { retry = null; } @@ -228,8 +227,8 @@ public class FaultTolerantHttpClient { final String circuitBreakerName = name + "-breaker"; final CircuitBreaker circuitBreaker = circuitBreakerConfigurationName != null - ? CircuitBreakerUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, circuitBreakerConfigurationName) - : CircuitBreakerUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName); + ? ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, circuitBreakerConfigurationName) + : ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName); return new FaultTolerantHttpClient(httpClients, requestTimeout, retryExecutor, retry, circuitBreaker); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java b/service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java index 7581f5178..43970b94f 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/limits/DynamicRateLimiter.java @@ -20,7 +20,7 @@ import org.whispersystems.textsecuregcm.controllers.RateLimitExceededException; import org.whispersystems.textsecuregcm.metrics.MetricsUtil; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ExceptionUtils; import org.whispersystems.textsecuregcm.util.Util; @@ -135,13 +135,13 @@ public class DynamicRateLimiter implements RateLimiter { @Override public void clear(final String key) { - CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeRunnable(() -> cluster.useCluster(connection -> connection.sync().del(bucketName(name, key)))); } @Override public CompletionStage clearAsync(final String key) { - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeCompletionStage(retryExecutor, () -> cluster.withCluster(connection -> connection.async().del(bucketName(name, key))) .thenRun(Util.NOOP)); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/ProvisioningManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ProvisioningManager.java index 80a0ff4c6..3b87c60ca 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/ProvisioningManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/ProvisioningManager.java @@ -23,7 +23,7 @@ import org.whispersystems.textsecuregcm.redis.FaultTolerantPubSubConnection; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.RedisOperation; import org.whispersystems.textsecuregcm.storage.PubSubProtos; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; public class ProvisioningManager extends RedisPubSubAdapter implements Managed { @@ -80,7 +80,7 @@ public class ProvisioningManager extends RedisPubSubAdapter impl .setContent(ByteString.copyFrom(body)) .build(); - final boolean receiverPresent = CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + final boolean receiverPresent = ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeSupplier(() -> pubSubClient.withBinaryConnection(connection -> connection.sync().publish(address.getBytes(StandardCharsets.UTF_8), pubSubMessage.toByteArray()) > 0)); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java index 8b3145641..3b9fe88e3 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/PushNotificationScheduler.java @@ -35,7 +35,7 @@ import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.AccountsManager; import org.whispersystems.textsecuregcm.storage.Device; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.Pair; import org.whispersystems.textsecuregcm.util.RedisClusterUtil; import org.whispersystems.textsecuregcm.util.Util; @@ -236,7 +236,7 @@ public class PushNotificationScheduler implements Managed { public CompletableFuture scheduleDelayedNotification(final Account account, final Device device, final Duration minDelay) { final long deliveryTime = clock.instant().plus(minDelay).toEpochMilli(); - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeCompletionStage(retryExecutor, () -> pushSchedulingCluster.withCluster(connection -> connection.async().zadd(getDelayedNotificationQueueKey(account, device), deliveryTime, diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java index b422fdc86..70b553e98 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClient.java @@ -17,7 +17,7 @@ import java.util.List; import java.util.function.Consumer; import java.util.function.Function; import org.whispersystems.textsecuregcm.configuration.RedisConfiguration; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; public class FaultTolerantRedisClient { @@ -40,8 +40,8 @@ public class FaultTolerantRedisClient { RedisUriUtil.createRedisUriWithTimeout(redisConfiguration.getUri(), redisConfiguration.getTimeout()), redisConfiguration.getTimeout(), redisConfiguration.getCircuitBreakerConfigurationName() != null - ? CircuitBreakerUtil.getCircuitBreakerRegistry().circuitBreaker(name + "-breaker", redisConfiguration.getCircuitBreakerConfigurationName()) - : CircuitBreakerUtil.getCircuitBreakerRegistry().circuitBreaker(name + "-breaker")); + ? ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(name + "-breaker", redisConfiguration.getCircuitBreakerConfigurationName()) + : ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(name + "-breaker")); } @VisibleForTesting diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java index 1c296550f..60247d27a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/redis/LettuceShardCircuitBreaker.java @@ -27,7 +27,7 @@ import javax.annotation.Nullable; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; /** * Adds a circuit breaker to every Netty {@link Channel} that gets created, so that a single unhealthy shard does not @@ -105,8 +105,8 @@ public class LettuceShardCircuitBreaker implements NettyCustomizer { SHARD_ADDRESS_TAG_NAME, shardAddress); breaker = circuitBreakerConfigurationName != null - ? CircuitBreakerUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, circuitBreakerConfigurationName, tags) - : CircuitBreakerUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, tags); + ? ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, circuitBreakerConfigurationName, tags) + : ResilienceUtil.getCircuitBreakerRegistry().circuitBreaker(circuitBreakerName, tags); } @Override diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index 81d63d8e9..5a5d0d41b 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -85,7 +85,7 @@ import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecoveryClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ExceptionUtils; import org.whispersystems.textsecuregcm.util.Pair; import org.whispersystems.textsecuregcm.util.RegistrationIdValidator; @@ -522,7 +522,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen throw new UncheckedIOException(e); } - CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeCompletionStage(retryExecutor, () -> pubSubRedisClient.withConnection(connection -> connection.async().set(key, deviceInfoJson, SetArgs.Builder.ex(RECENTLY_ADDED_DEVICE_TTL)))) .whenComplete((_, pubSubThrowable) -> { @@ -1427,7 +1427,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen } private void redisDelete(final Account account) { - CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME).executeRunnable(() -> + ResilienceUtil.getGeneralRedisRetry(RETRY_NAME).executeRunnable(() -> redisDeleteTimer.record(() -> cacheCluster.useCluster(connection -> connection.sync().del(getAccountMapKey(account.getPhoneNumberIdentifier().toString()), @@ -1442,7 +1442,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen getAccountEntityKey(account.getUuid()) }; - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME).executeCompletionStage(retryExecutor, + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME).executeCompletionStage(retryExecutor, () -> cacheCluster.withCluster(connection -> connection.async().del(keysToDelete)) .thenRun(Util.NOOP)) .toCompletableFuture() @@ -1601,7 +1601,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen // We validate the request object so this should never happen .orElseThrow(() -> new AssertionError("No creation timestamp or registration ID provided"))); - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeCompletionStage(retryExecutor, () -> pubSubRedisClient.withConnection(connection -> connection.async() .set(key, transferArchiveJson, SetArgs.Builder.ex(RECENTLY_ADDED_TRANSFER_ARCHIVE_TTL))) .toCompletableFuture()) @@ -1662,7 +1662,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen throw new UncheckedIOException(e); } - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeCompletionStage(retryExecutor, () -> pubSubRedisClient.withConnection(connection -> connection.async().set(key, requestJson, SetArgs.Builder.ex(RESTORE_ACCOUNT_REQUEST_TTL))) .toCompletableFuture()) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java index 457394e8a..23f7d8a93 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java @@ -48,7 +48,7 @@ import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.ServiceIdentifier; import org.whispersystems.textsecuregcm.metrics.MetricsUtil; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.Pair; import org.whispersystems.textsecuregcm.util.RedisClusterUtil; import reactor.core.observability.micrometer.Micrometer; @@ -440,7 +440,7 @@ public class MessagesCache { conn -> conn.reactive().hmget(key, "data".getBytes(StandardCharsets.UTF_8), sharedMrmViewKey) .collectList() .publishOn(messageDeliveryScheduler))) - .transformDeferred(RetryOperator.of(CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME))) + .transformDeferred(RetryOperator.of(ResilienceUtil.getGeneralRedisRetry(RETRY_NAME))) .handle((mrmDataAndView, sink) -> { try { assert mrmDataAndView.size() == 2; diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheGetItemsScript.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheGetItemsScript.java index e064af9fb..e25d8e51e 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheGetItemsScript.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheGetItemsScript.java @@ -13,7 +13,7 @@ import java.util.List; import java.util.UUID; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import reactor.core.publisher.Mono; /** @@ -40,7 +40,7 @@ class MessagesCacheGetItemsScript { ); //noinspection unchecked return getItemsScript.executeBinaryReactive(keys, args) - .transformDeferred(RetryOperator.of(CircuitBreakerUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME))) + .transformDeferred(RetryOperator.of(ResilienceUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME))) .map(result -> (List) result) .next(); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertScript.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertScript.java index 733de6f0c..466179797 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertScript.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertScript.java @@ -20,7 +20,7 @@ import org.whispersystems.textsecuregcm.push.NewMessageAvailableEvent; import org.whispersystems.textsecuregcm.push.RedisMessageAvailabilityManager; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; /** * Inserts an envelope into the message queue for a destination device and publishes a "new message available" event. @@ -69,7 +69,7 @@ class MessagesCacheInsertScript { NEW_MESSAGE_EVENT_BYTES // eventPayload )); - return CircuitBreakerUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) .executeCompletionStage(retryExecutor, () -> insertScript.executeBinaryAsync(keys, args)) .thenApply(result -> (boolean) result); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript.java index ef136f864..8b435b00a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript.java @@ -14,7 +14,7 @@ import java.util.concurrent.ScheduledExecutorService; import org.signal.libsignal.protocol.SealedSenderMultiRecipientMessage; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.Util; /** @@ -55,7 +55,7 @@ class MessagesCacheInsertSharedMultiRecipientPayloadAndViewsScript { } }); - return CircuitBreakerUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) .executeCompletionStage(retryExecutor, () -> script.executeBinaryAsync(keys, args)) .thenRun(Util.NOOP); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheRemoveByGuidScript.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheRemoveByGuidScript.java index 1cdbe1bd3..397c11d7a 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheRemoveByGuidScript.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheRemoveByGuidScript.java @@ -14,7 +14,7 @@ import java.util.concurrent.CompletionStage; import java.util.concurrent.ScheduledExecutorService; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; /** * Removes a list of message GUIDs from the queue of a destination device. @@ -44,7 +44,7 @@ class MessagesCacheRemoveByGuidScript { .toList(); //noinspection unchecked - return CircuitBreakerUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) .executeCompletionStage(retryExecutor, () -> removeByGuidScript.executeBinaryAsync(keys, args)) .thenApply(result -> (List) result); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheUnlockQueueScript.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheUnlockQueueScript.java index f2e9a79e1..1be273840 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheUnlockQueueScript.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCacheUnlockQueueScript.java @@ -11,7 +11,7 @@ import org.whispersystems.textsecuregcm.push.MessagesPersistedEvent; import org.whispersystems.textsecuregcm.push.RedisMessageAvailabilityManager; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import java.io.IOException; import java.util.List; import java.util.UUID; @@ -39,7 +39,7 @@ class MessagesCacheUnlockQueueScript { RedisMessageAvailabilityManager.getClientEventChannel(accountIdentifier, deviceId) // eventChannelKey ); - CircuitBreakerUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) + ResilienceUtil.getGeneralRedisRetry(MessagesCache.RETRY_NAME) .executeRunnable(() -> unlockQueueScript.executeBinary(keys, MESSAGES_PERSISTED_EVENT_ARGS)); } } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java index 78809a571..abe852816 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/ProfilesManager.java @@ -22,7 +22,7 @@ import io.micrometer.core.instrument.Metrics; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.SystemMapper; import org.whispersystems.textsecuregcm.util.Util; import reactor.core.publisher.Mono; @@ -190,7 +190,7 @@ public class ProfilesManager { } private CompletableFuture redisDelete(UUID uuid) { - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeCompletionStage(retryExecutor, () -> cacheCluster.withCluster(connection -> connection.async().del(getCacheKey(uuid)))) .toCompletableFuture() diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java index a00ede9e1..c2b8d6b9f 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/devicecheck/AppleDeviceCheckManager.java @@ -34,7 +34,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; import org.whispersystems.textsecuregcm.storage.Account; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; /** * Register Apple DeviceCheck App Attestations and verify the corresponding assertions. @@ -117,7 +117,7 @@ public class AppleDeviceCheckManager { final String redisChallengeKey = challengeKey(ChallengeType.ATTEST, account.getUuid()); - @Nullable final String challenge = CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + @Nullable final String challenge = ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeSupplier(() -> redisClient.withCluster(cluster -> cluster.sync().get(redisChallengeKey))); if (challenge == null) { @@ -176,7 +176,7 @@ public class AppleDeviceCheckManager { throws ChallengeNotFoundException, DeviceCheckVerificationFailedException, DeviceCheckKeyIdNotFoundException, RequestReuseException { final String redisChallengeKey = challengeKey(challengeType, account.getUuid()); - @Nullable final String storedChallenge = CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + @Nullable final String storedChallenge = ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeSupplier(() -> redisClient.withCluster(cluster -> cluster.sync().get(redisChallengeKey))); if (storedChallenge == null) { @@ -221,7 +221,7 @@ public class AppleDeviceCheckManager { final UUID accountIdentifier = account.getUuid(); final String challengeKey = challengeKey(challengeType, accountIdentifier); - return CircuitBreakerUtil.getGeneralRedisRetry(RETRY_NAME) + return ResilienceUtil.getGeneralRedisRetry(RETRY_NAME) .executeSupplier(() -> redisClient.withCluster(cluster -> { final RedisAdvancedClusterCommands commands = cluster.sync(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java index 8a26b3b86..5bd07527b 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/subscriptions/AppleAppStoreManager.java @@ -47,7 +47,7 @@ import org.whispersystems.textsecuregcm.controllers.RateLimitExceededException; import org.whispersystems.textsecuregcm.metrics.MetricsUtil; import org.whispersystems.textsecuregcm.storage.PaymentTime; import org.whispersystems.textsecuregcm.storage.SubscriptionException; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.ExceptionUtils; /** @@ -112,12 +112,12 @@ public class AppleAppStoreManager implements SubscriptionPaymentProcessor { final RetryConfig.Builder> retryConfigBuilder = RetryConfig.from(Optional.ofNullable(retryConfigurationName) - .flatMap(name -> CircuitBreakerUtil.getRetryRegistry().getConfiguration(name)) - .orElseGet(() -> CircuitBreakerUtil.getRetryRegistry().getDefaultConfig())); + .flatMap(name -> ResilienceUtil.getRetryRegistry().getConfiguration(name)) + .orElseGet(() -> ResilienceUtil.getRetryRegistry().getDefaultConfig())); retryConfigBuilder.retryOnException(AppleAppStoreManager::shouldRetry); - this.retry = CircuitBreakerUtil.getRetryRegistry().retry("appstore-retry", retryConfigBuilder.build()); + this.retry = ResilienceUtil.getRetryRegistry().retry("appstore-retry", retryConfigBuilder.build()); } @Override diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java b/service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java similarity index 98% rename from service/src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java rename to service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java index fa08c1c6d..8d9ad013f 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/util/CircuitBreakerUtil.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/util/ResilienceUtil.java @@ -16,7 +16,7 @@ import org.apache.commons.lang3.RandomStringUtils; import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration; import org.whispersystems.textsecuregcm.configuration.RetryConfiguration; -public class CircuitBreakerUtil { +public class ResilienceUtil { private static final CircuitBreakerRegistry CIRCUIT_BREAKER_REGISTRY = CircuitBreakerRegistry.of(new CircuitBreakerConfiguration().toCircuitBreakerConfig()); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClientTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClientTest.java index fa5119aac..738194fb1 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClientTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/http/FaultTolerantHttpClientTest.java @@ -42,7 +42,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration; import org.whispersystems.textsecuregcm.configuration.RetryConfiguration; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; class FaultTolerantHttpClientTest { @@ -212,7 +212,7 @@ class FaultTolerantHttpClientTest { final String circuitBreakerConfigurationName = getClass().getSimpleName() + "#testNetworkFailureCircuitBreaker"; - CircuitBreakerUtil.getCircuitBreakerRegistry() + ResilienceUtil.getCircuitBreakerRegistry() .addConfiguration(circuitBreakerConfigurationName, circuitBreakerConfiguration.toCircuitBreakerConfig()); final FaultTolerantHttpClient client = FaultTolerantHttpClient.newBuilder("testNetworkFailureCircuitBreaker", httpExecutor) diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClusterClientTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClusterClientTest.java index f2cb0756a..0f019851f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClusterClientTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/redis/FaultTolerantRedisClusterClientTest.java @@ -60,7 +60,7 @@ import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Timeout; import org.junit.jupiter.api.extension.RegisterExtension; import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.Pair; import org.whispersystems.textsecuregcm.util.RedisClusterUtil; @@ -89,7 +89,7 @@ class FaultTolerantRedisClusterClientTest { if (circuitBreakerConfiguration != null) { circuitBreakerConfigurationName = FaultTolerantRedisClusterClientTest.class.getSimpleName() + "-" + circuitBreakerConfigurationCount++; - CircuitBreakerUtil.getCircuitBreakerRegistry().addConfiguration(circuitBreakerConfigurationName, circuitBreakerConfiguration.toCircuitBreakerConfig()); + ResilienceUtil.getCircuitBreakerRegistry().addConfiguration(circuitBreakerConfigurationName, circuitBreakerConfiguration.toCircuitBreakerConfig()); } else { circuitBreakerConfigurationName = null; } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/redis/RedisClusterExtension.java b/service/src/test/java/org/whispersystems/textsecuregcm/redis/RedisClusterExtension.java index 1d54d25c6..b16e1b8cb 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/redis/RedisClusterExtension.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/redis/RedisClusterExtension.java @@ -31,7 +31,7 @@ import org.testcontainers.containers.ComposeContainer; import org.testcontainers.containers.wait.strategy.Wait; import org.testcontainers.containers.wait.strategy.WaitStrategy; import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration; -import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil; +import org.whispersystems.textsecuregcm.util.ResilienceUtil; import org.whispersystems.textsecuregcm.util.TestcontainersImages; public class RedisClusterExtension implements BeforeAllCallback, BeforeEachCallback, AfterEachCallback, ExtensionContext.Store.CloseableResource { @@ -105,7 +105,7 @@ public class RedisClusterExtension implements BeforeAllCallback, BeforeEachCallb final CircuitBreakerConfiguration circuitBreakerConfig = new CircuitBreakerConfiguration(); circuitBreakerConfig.setWaitDurationInOpenState(Duration.ofMillis(500)); - CircuitBreakerUtil.getCircuitBreakerRegistry().addConfiguration(CIRCUIT_BREAKER_CONFIGURATION_NAME, circuitBreakerConfig.toCircuitBreakerConfig()); + ResilienceUtil.getCircuitBreakerRegistry().addConfiguration(CIRCUIT_BREAKER_CONFIGURATION_NAME, circuitBreakerConfig.toCircuitBreakerConfig()); final File clusterComposeFile = File.createTempFile("redis-cluster", ".yml"); clusterComposeFile.deleteOnExit();