diff --git a/pom.xml b/pom.xml
index f4747425d..33b9d3fb7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -49,7 +49,6 @@
2.9.0
2.13.4
2.3.1
- 2.9.0
1.8.0
1.4.1
6.2.4.RELEASE
@@ -253,11 +252,6 @@
${slf4j.version}
test
-
- redis.clients
- jedis
- ${jedis.version}
-
commons-logging
commons-logging
diff --git a/service/pom.xml b/service/pom.xml
index 9ea5159e7..d4775234d 100644
--- a/service/pom.xml
+++ b/service/pom.xml
@@ -323,11 +323,6 @@
-
- redis.clients
- jedis
-
-
io.lettuce
lettuce-core
diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java b/service/src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java
deleted file mode 100644
index 8ec3b36a5..000000000
--- a/service/src/main/java/org/whispersystems/textsecuregcm/redis/ReplicatedJedisPool.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright 2013-2020 Signal Messenger, LLC
- * SPDX-License-Identifier: AGPL-3.0-only
- */
-
-package org.whispersystems.textsecuregcm.redis;
-
-import io.github.resilience4j.circuitbreaker.CircuitBreaker;
-import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.Supplier;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.whispersystems.textsecuregcm.configuration.CircuitBreakerConfiguration;
-import org.whispersystems.textsecuregcm.util.CircuitBreakerUtil;
-import redis.clients.jedis.Jedis;
-import redis.clients.jedis.JedisPool;
-import redis.clients.jedis.exceptions.JedisException;
-
-public class ReplicatedJedisPool {
-
- private final Logger logger = LoggerFactory.getLogger(ReplicatedJedisPool.class);
- private final AtomicInteger replicaIndex = new AtomicInteger(0);
-
- private final Supplier master;
- private final ArrayList> replicas;
-
- public ReplicatedJedisPool(String name,
- JedisPool master,
- List replicas,
- CircuitBreakerConfiguration circuitBreakerConfiguration)
- {
- if (replicas.size() < 1) throw new IllegalArgumentException("There must be at least one replica");
-
- CircuitBreakerConfig config = circuitBreakerConfiguration.toCircuitBreakerConfig();
- CircuitBreaker masterBreaker = CircuitBreaker.of(String.format("%s-master", name), config);
-
- CircuitBreakerUtil.registerMetrics(masterBreaker, ReplicatedJedisPool.class);
-
- this.master = CircuitBreaker.decorateSupplier(masterBreaker, master::getResource);
- this.replicas = new ArrayList<>(replicas.size());
-
- for (int i=0;i(), new CircuitBreakerConfiguration());
- throw new AssertionError();
- } catch (Exception e) {
- // good
- }
- }
-
- @Test
- void testWriteCheckoutWithSlaves() {
- JedisPool master = mock(JedisPool.class);
- JedisPool slave = mock(JedisPool.class);
- Jedis instance = mock(Jedis.class );
-
- when(master.getResource()).thenReturn(instance);
-
- ReplicatedJedisPool replicatedJedisPool = new ReplicatedJedisPool("testWriteCheckoutWithSlaves", master, Collections.singletonList(slave), new CircuitBreakerConfiguration());
- Jedis writeResource = replicatedJedisPool.getWriteResource();
-
- assertThat(writeResource).isEqualTo(instance);
- verify(master, times(1)).getResource();
- }
-
- @Test
- void testReadCheckouts() {
- JedisPool master = mock(JedisPool.class);
- JedisPool slaveOne = mock(JedisPool.class);
- JedisPool slaveTwo = mock(JedisPool.class);
- Jedis instanceOne = mock(Jedis.class );
- Jedis instanceTwo = mock(Jedis.class );
-
- when(slaveOne.getResource()).thenReturn(instanceOne);
- when(slaveTwo.getResource()).thenReturn(instanceTwo);
-
- ReplicatedJedisPool replicatedJedisPool = new ReplicatedJedisPool("testReadCheckouts", master, Arrays.asList(slaveOne, slaveTwo), new CircuitBreakerConfiguration());
-
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceOne);
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceTwo);
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceOne);
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceTwo);
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceOne);
-
- verifyNoMoreInteractions(master);
- }
-
- @Test
- void testBrokenReadCheckout() {
- JedisPool master = mock(JedisPool.class);
- JedisPool slaveOne = mock(JedisPool.class);
- JedisPool slaveTwo = mock(JedisPool.class);
- Jedis instanceTwo = mock(Jedis.class );
-
- when(slaveOne.getResource()).thenThrow(new JedisException("Connection failed!"));
- when(slaveTwo.getResource()).thenReturn(instanceTwo);
-
- ReplicatedJedisPool replicatedJedisPool = new ReplicatedJedisPool("testBrokenReadCheckout", master, Arrays.asList(slaveOne, slaveTwo), new CircuitBreakerConfiguration());
-
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceTwo);
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceTwo);
- assertThat(replicatedJedisPool.getReadResource()).isEqualTo(instanceTwo);
-
- verifyNoMoreInteractions(master);
- }
-
- @Test
- void testAllBrokenReadCheckout() {
- JedisPool master = mock(JedisPool.class);
- JedisPool slaveOne = mock(JedisPool.class);
- JedisPool slaveTwo = mock(JedisPool.class);
-
- when(slaveOne.getResource()).thenThrow(new JedisException("Connection failed!"));
- when(slaveTwo.getResource()).thenThrow(new JedisException("Also failed!"));
-
- ReplicatedJedisPool replicatedJedisPool = new ReplicatedJedisPool("testAllBrokenReadCheckout", master, Arrays.asList(slaveOne, slaveTwo), new CircuitBreakerConfiguration());
-
- try {
- replicatedJedisPool.getReadResource();
- throw new AssertionError();
- } catch (Exception e) {
- // good
- }
-
- verifyNoMoreInteractions(master);
- }
-
- @Test
- void testCircuitBreakerOpen() {
- CircuitBreakerConfiguration configuration = new CircuitBreakerConfiguration();
- configuration.setFailureRateThreshold(50);
- configuration.setSlidingWindowSize(2);
- configuration.setSlidingWindowMinimumNumberOfCalls(2);
-
- JedisPool master = mock(JedisPool.class);
- JedisPool slaveOne = mock(JedisPool.class);
- JedisPool slaveTwo = mock(JedisPool.class);
-
- when(master.getResource()).thenReturn(null);
- when(slaveOne.getResource()).thenThrow(new JedisException("Connection failed!"));
- when(slaveTwo.getResource()).thenThrow(new JedisException("Also failed!"));
-
- ReplicatedJedisPool replicatedJedisPool = new ReplicatedJedisPool("testCircuitBreakerOpen", master,
- Arrays.asList(slaveOne, slaveTwo), configuration);
- replicatedJedisPool.getWriteResource();
-
- when(master.getResource()).thenThrow(new JedisException("Master broken!"));
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (JedisException exception) {
- // good
- }
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (CallNotPermittedException e) {
- // good
- }
- }
-
- @Test
- void testCircuitBreakerHalfOpen() throws InterruptedException {
- CircuitBreakerConfiguration configuration = new CircuitBreakerConfiguration();
- configuration.setFailureRateThreshold(50);
- configuration.setSlidingWindowSize(2);
- configuration.setSlidingWindowMinimumNumberOfCalls(2);
- configuration.setPermittedNumberOfCallsInHalfOpenState(1);
- configuration.setWaitDurationInOpenStateInSeconds(1);
-
- JedisPool master = mock(JedisPool.class);
- JedisPool slaveOne = mock(JedisPool.class);
- JedisPool slaveTwo = mock(JedisPool.class);
-
- when(master.getResource()).thenThrow(new JedisException("Master broken!"));
- when(slaveOne.getResource()).thenThrow(new JedisException("Connection failed!"));
- when(slaveTwo.getResource()).thenThrow(new JedisException("Also failed!"));
-
- ReplicatedJedisPool replicatedJedisPool = new ReplicatedJedisPool("testCircuitBreakerHalfOpen", master, Arrays.asList(slaveOne, slaveTwo), configuration);
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (JedisException exception) {
- // good
- }
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (JedisException exception) {
- // good
- }
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (CallNotPermittedException e) {
- // good
- }
-
- Thread.sleep(1100);
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (JedisException exception) {
- // good
- }
-
- try {
- replicatedJedisPool.getWriteResource();
- throw new AssertionError();
- } catch (CallNotPermittedException e) {
- // good
- }
- }
-
-}