Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@
* This configuration enables seamless failover between multiple Redis clusters, databases, or
* endpoints by providing comprehensive settings for retry logic, circuit breaker behavior, health
* checks, and failback mechanisms. It is designed to work with
* {@link redis.clients.jedis.providers.MultiClusterPooledConnectionProvider} to provide high
* availability and disaster recovery capabilities.
* {@link redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider} to provide high availability
* and disaster recovery capabilities.
* </p>
* <p>
* <strong>Key Features:</strong>
Expand Down Expand Up @@ -70,7 +70,7 @@
* The configuration leverages <a href="https://resilience4j.readme.io/docs">Resilience4j</a> for
* circuit breaker and retry implementations, providing battle-tested fault tolerance patterns.
* </p>
* @see redis.clients.jedis.providers.MultiClusterPooledConnectionProvider
* @see redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider
* @see redis.clients.jedis.mcf.HealthCheckStrategy
* @see redis.clients.jedis.mcf.EchoStrategy
* @see redis.clients.jedis.mcf.LagAwareStrategy
Expand Down
1 change: 1 addition & 0 deletions src/main/java/redis/clients/jedis/UnifiedJedis.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
import redis.clients.jedis.json.JsonObjectMapper;
import redis.clients.jedis.mcf.CircuitBreakerCommandExecutor;
import redis.clients.jedis.mcf.MultiClusterPipeline;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.mcf.MultiClusterTransaction;
import redis.clients.jedis.params.*;
import redis.clients.jedis.providers.*;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,7 @@
import redis.clients.jedis.Connection;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.executors.CommandExecutor;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider.Cluster;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider.Cluster;

/**
* @author Allen Terleto (aterleto)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,7 @@
import java.util.concurrent.locks.ReentrantLock;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider.Cluster;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider.Cluster;
import redis.clients.jedis.util.IOUtils;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@

import redis.clients.jedis.Connection;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider.Cluster;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider.Cluster;

/**
* ConnectionProvider with built-in retry, circuit-breaker, and failover to another cluster/database
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package redis.clients.jedis.mcf;

import redis.clients.jedis.Endpoint;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider.Cluster;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider.Cluster;

public class ClusterSwitchEventArgs {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

import redis.clients.jedis.*;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.util.KeyValue;

/**
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package redis.clients.jedis.providers;
package redis.clients.jedis.mcf;

import io.github.resilience4j.circuitbreaker.CircuitBreaker;
import io.github.resilience4j.circuitbreaker.CircuitBreaker.State;
Expand Down Expand Up @@ -35,18 +35,10 @@
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.exceptions.JedisException;
import redis.clients.jedis.exceptions.JedisValidationException;
import redis.clients.jedis.mcf.HealthStatus;
import redis.clients.jedis.mcf.HealthStatusChangeEvent;
import redis.clients.jedis.mcf.HealthStatusManager;
import redis.clients.jedis.mcf.StatusTracker;
import redis.clients.jedis.mcf.SwitchReason;
import redis.clients.jedis.mcf.TrackingConnectionPool;
import redis.clients.jedis.providers.ConnectionProvider;
import redis.clients.jedis.MultiClusterClientConfig.StrategySupplier;

import redis.clients.jedis.util.Pool;
import redis.clients.jedis.mcf.ClusterSwitchEventArgs;
import redis.clients.jedis.mcf.HealthCheck;
import redis.clients.jedis.mcf.HealthCheckStrategy;

/**
* @author Allen Terleto (aterleto)
Expand Down Expand Up @@ -450,7 +442,7 @@ void periodicFailbackCheck() {
}
}

public Endpoint iterateActiveCluster(SwitchReason reason) {
Endpoint iterateActiveCluster(SwitchReason reason) {
Map.Entry<Endpoint, Cluster> clusterToIterate = findWeightedHealthyClusterToIterate();
if (clusterToIterate == null) {
throw new JedisConnectionException(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import redis.clients.jedis.*;
import redis.clients.jedis.annots.Experimental;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.util.KeyValue;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@
import redis.clients.jedis.MultiClusterClientConfig;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.exceptions.JedisConnectionException;

import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.scenario.RecommendedSettings;

import java.io.IOException;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
import eu.rekawek.toxiproxy.model.Toxic;
import redis.clients.jedis.*;
import redis.clients.jedis.MultiClusterClientConfig.ClusterConfig;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.scenario.ActiveActiveFailoverTest;
import redis.clients.jedis.scenario.MultiThreadedFakeApp;
import redis.clients.jedis.scenario.RecommendedSettings;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.MultiClusterClientConfig;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProviderHelper;

@ExtendWith(MockitoExtension.class)
class FailbackMechanismIntegrationTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
import redis.clients.jedis.MultiClusterClientConfig.ClusterConfig;
import redis.clients.jedis.MultiClusterClientConfig.StrategySupplier;
import redis.clients.jedis.mcf.ProbingPolicy.BuiltIn;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.scenario.RecommendedSettings;

public class HealthCheckIntegrationTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@
import redis.clients.jedis.MultiClusterClientConfig;
import redis.clients.jedis.MultiClusterClientConfig.ClusterConfig;
import redis.clients.jedis.exceptions.JedisValidationException;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.doNothing;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.MultiClusterClientConfig;
import redis.clients.jedis.exceptions.JedisValidationException;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;

/**
* Tests for MultiClusterPooledConnectionProvider initialization edge cases
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package redis.clients.jedis.providers;
package redis.clients.jedis.mcf;

import redis.clients.jedis.Endpoint;
import redis.clients.jedis.mcf.HealthStatus;
import redis.clients.jedis.mcf.HealthStatusChangeEvent;

public class MultiClusterPooledConnectionProviderHelper {

Expand All @@ -14,4 +12,9 @@ public static void onHealthStatusChange(MultiClusterPooledConnectionProvider pro
public static void periodicFailbackCheck(MultiClusterPooledConnectionProvider provider) {
provider.periodicFailbackCheck();
}

public static Endpoint iterateActiveCluster(MultiClusterPooledConnectionProvider provider,
SwitchReason reason) {
return provider.iterateActiveCluster(reason);
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package redis.clients.jedis.providers;
package redis.clients.jedis.mcf;

import io.github.resilience4j.circuitbreaker.CircuitBreaker;

Expand All @@ -14,9 +14,10 @@
import redis.clients.jedis.exceptions.JedisValidationException;
import redis.clients.jedis.mcf.HealthCheckStrategy;
import redis.clients.jedis.mcf.HealthStatus;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.mcf.SwitchReason;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider.Cluster;
import redis.clients.jedis.mcf.ProbingPolicy.BuiltIn;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider.Cluster;

import java.util.Arrays;
import java.util.Collections;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.Mockito.*;
import static redis.clients.jedis.providers.MultiClusterPooledConnectionProviderHelper.onHealthStatusChange;
import static redis.clients.jedis.mcf.MultiClusterPooledConnectionProviderHelper.onHealthStatusChange;

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
Expand All @@ -15,8 +15,6 @@
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.MultiClusterClientConfig;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProviderHelper;

@ExtendWith(MockitoExtension.class)
class PeriodicFailbackTest {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,9 @@
import redis.clients.jedis.exceptions.JedisAccessControlException;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.mcf.ClusterSwitchEventArgs;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProviderHelper;
import redis.clients.jedis.mcf.SwitchReason;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.util.IOUtils;

import static org.hamcrest.MatcherAssert.assertThat;
Expand Down Expand Up @@ -75,7 +76,8 @@ public void pipelineWithSwitch() {
AbstractPipeline pipe = client.pipelined();
pipe.set("pstr", "foobar");
pipe.hset("phash", "foo", "bar");
provider.iterateActiveCluster(SwitchReason.HEALTH_CHECK);
MultiClusterPooledConnectionProviderHelper.iterateActiveCluster(provider,
SwitchReason.HEALTH_CHECK);
pipe.sync();
}

Expand All @@ -94,7 +96,8 @@ public void transactionWithSwitch() {
AbstractTransaction tx = client.multi();
tx.set("tstr", "foobar");
tx.hset("thash", "foo", "bar");
provider.iterateActiveCluster(SwitchReason.HEALTH_CHECK);
MultiClusterPooledConnectionProviderHelper.iterateActiveCluster(provider,
SwitchReason.HEALTH_CHECK);
assertEquals(Arrays.asList("OK", 1L), tx.exec());
}

Expand Down Expand Up @@ -151,8 +154,8 @@ public void commandFailover() {
MultiClusterClientConfig.Builder builder = new MultiClusterClientConfig.Builder(
getClusterConfigs(clientConfig, hostPortWithFailure, workingEndpoint.getHostAndPort()))
.retryMaxAttempts(retryMaxAttempts) // Default
// is
// 3
// is
// 3
.circuitBreakerSlidingWindowMinCalls(slidingWindowMinCalls)
.circuitBreakerSlidingWindowSize(slidingWindowSize);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
import redis.clients.jedis.JedisClientConfig;
import redis.clients.jedis.MultiClusterClientConfig;
import redis.clients.jedis.mcf.HealthStatus;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProviderHelper;

/**
* Tests for MultiClusterPooledConnectionProvider event handling behavior during initialization and
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,9 @@
import org.slf4j.LoggerFactory;
import redis.clients.jedis.*;
import redis.clients.jedis.MultiClusterClientConfig.ClusterConfig;
import redis.clients.jedis.providers.MultiClusterPooledConnectionProvider;
import redis.clients.jedis.exceptions.JedisConnectionException;
import redis.clients.jedis.mcf.ClusterSwitchEventArgs;
import redis.clients.jedis.mcf.MultiClusterPooledConnectionProvider;

import java.io.IOException;
import java.time.Duration;
Expand Down
Loading