Skip to content

Conversation

@ggivo
Copy link
Collaborator

@ggivo ggivo commented Sep 23, 2025

Problem:
LagAwareStrategy health checks to Redis Enterprise REST API (port 9443) required adding certificates to the default Java truststore for custom certificates, self-signed certificates. This approach is not ideal for application-specific SSL configuration.

Solution:

  • Added SSL configuration support to LagAwareStrategy.Config builder
  • SSL options include truststore, keystore, and verification modes (FULL, CA, INSECURE)

Usage:

SslOptions sslOptions = SslOptions.builder()
    .truststore(new File("truststore.jks"), "password".toCharArray())
    .sslVerifyMode(SslVerifyMode.FULL)
    .build();

LagAwareStrategy.Config config = LagAwareStrategy.Config.builder(endpoint, credentials)
    .sslOptions(sslOptions)
    .build();

Closes #4292

@github-actions
Copy link

github-actions bot commented Sep 23, 2025

Test Results

  275 files  ±0    275 suites  ±0   10m 58s ⏱️ -11s
5 089 tests ±0  5 085 ✅ ±0  4 💤 ±0  0 ❌ ±0 
2 635 runs  ±0  2 635 ✅ ±0  0 💤 ±0  0 ❌ ±0 

Results for commit d79e807. ± Comparison against base commit 213e749.

♻️ This comment has been updated with latest results.

@ggivo ggivo changed the base branch from master to feature/automatic-failover-2 September 23, 2025 07:38
@ggivo ggivo force-pushed the topic/ggivo/active-active-lagware-ssl-config branch from c551436 to 2d4599b Compare September 23, 2025 07:47
@ggivo ggivo requested review from atakavci and Copilot September 23, 2025 09:00
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR adds SSL configuration support to LagAwareStrategy for secure communication with Redis Enterprise REST API, eliminating the need to modify the default Java truststore for custom certificates.

  • Added SslOptions parameter to LagAwareStrategy.Config for custom SSL configuration
  • Enhanced RedisRestAPI to support SSL context configuration and hostname verification modes
  • Refactored REST endpoint utility to a shared class for better code reuse

Reviewed Changes

Copilot reviewed 7 out of 7 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/main/java/redis/clients/jedis/SslOptions.java Added getSslVerifyMode() method and fixed null keystore type handling
src/main/java/redis/clients/jedis/mcf/LagAwareStrategy.java Integrated SSL options into Config and ConfigBuilder classes
src/main/java/redis/clients/jedis/mcf/RedisRestAPI.java Added SSL context configuration for HTTPS connections
src/test/java/redis/clients/jedis/scenario/RestEndpointUtil.java Extracted shared REST endpoint utility for code reuse
src/test/java/redis/clients/jedis/scenario/LagAwareStrategySslIT.java Added comprehensive SSL integration tests
src/test/java/redis/clients/jedis/mcf/RedisRestAPIIntegrationTest.java Updated to use shared RestEndpointUtil and improved error logging
pom.xml Added test includes for integration test discovery

Tip: Customize your code reviews with copilot-instructions.md. Create the file or learn how to get started.

@ggivo
Copy link
Collaborator Author

ggivo commented Sep 23, 2025

run scenario tests

@uglide
Copy link
Contributor

uglide commented Sep 23, 2025

Testcase Errors Failures Skipped Total
redis.clients.jedis.scenario.ClusterTopologyRefreshTest 1 0 0 1
redis.clients.jedis.scenario.LagAwareStrategySslIT 0 1 0 1
redis.clients.jedis.scenario.ActiveActiveFailoverTest 0 1 0 1
redis.clients.jedis.scenario.ConnectionInterruptionTest 0 0 0 4

---- Details for maintainers

@uglide
Copy link
Contributor

uglide commented Sep 23, 2025

Testcase Errors Failures Skipped Total
redis.clients.jedis.scenario.ClusterTopologyRefreshTest 0 0 0 1
redis.clients.jedis.scenario.LagAwareStrategySslIT 0 0 0 10
redis.clients.jedis.scenario.ActiveActiveFailoverTest 0 0 0 1
redis.clients.jedis.scenario.ConnectionInterruptionTest 0 0 0 4

---- Details for maintainers

@ggivo ggivo requested a review from uglide September 23, 2025 11:45
Copy link
Contributor

@atakavci atakavci left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@ggivo ggivo merged commit 0d8e184 into feature/automatic-failover-2 Sep 26, 2025
15 of 16 checks passed
ggivo added a commit that referenced this pull request Sep 30, 2025
…#4297)

* [automatic failover] Remove the check for 'GenericObjectPool.getNumWaiters()' in 'TrackingConnectionPool' (#4270)

- remove the check for number of waitiers in TrackingConnectionPool

* [automatic failover] Configure max total connections for EchoStrategy (#4268)

- set maxtotal connections for echoStrategy

* [automatic failover] Replace 'CircuitBreaker' with 'Cluster' for 'CircuitBreakerFailoverBase.clusterFailover' (#4275)

* - replace CircuitBreaker with Cluster for CircuitBreakerFailoverBase.clusterFailover
- improve thread safety with provider initialization

* - formatting

* [automatic failover] Minor optimizations on fast failover (#4277)

* - minor optimizations on fail fast

* -  volatile failfast

* [automatic failover] Implement health check retries (#4273)

* - replace minConsecutiveSuccessCount with numberOfRetries
- add retries into healtCheckImpl
- apply changes to strategy implementations config classes
- fix unit tests

* - fix typo

* - fix failing tests

* - add tests for retry logic

* - formatting

* - format

* - revisit numRetries for healthCheck ,replace with numProbes and implement built in policies
- new types probecontext, ProbePolicy, HealthProbeContext
- add delayer executor pool to healthcheckımpl
-  adjustments on  worker pool of healthCheckImpl for shared use of workers

* - format

* - expand comment with example case

* - drop pooled executor for delays

* - polish

* - fix tests

* - formatting

* - checking failing tests

* - fix test

* - fix flaky tests

* - fix flaky test

* - add tests for builtin probing policies

* - fix flaky test

* [automatic failover] Move failover provider to mcf (#4294)

* - move failover provider to mcf

* - make iterateActiveCluster package private

* [automatic failover]  Add SSL configuration support to LagAwareStrategy  (#4291)

* User-provided ssl config for lag-aware health check

* ssl scenario test for lag-aware healthcheck

* format

* format

* address review comments

  - use getters instead of fields

* [automatic failover] Implement max number of failover attempts (#4293)

* - implement max failover attempt
- add tests

* - fix user receive the intended exception

* -clean+format

* - java doc for exceptions

* format

* - more tests on excaption types in max failover attempts mechanism

* format

* fix failing timing in test

* disable health checks

* rename to switchToHealthyCluster

* format

---------

Co-authored-by: Ivo Gaydazhiev <ivo.gaydazhiev@redis.com>
atakavci added a commit that referenced this pull request Oct 3, 2025
…ure rate) capabililty to circuit breaker (#4295)

* [automatic failover] Remove the check for 'GenericObjectPool.getNumWaiters()' in 'TrackingConnectionPool' (#4270)

- remove the check for number of waitiers in TrackingConnectionPool

* [automatic failover] Configure max total connections for EchoStrategy (#4268)

- set maxtotal connections for echoStrategy

* [automatic failover] Replace 'CircuitBreaker' with 'Cluster' for 'CircuitBreakerFailoverBase.clusterFailover' (#4275)

* - replace CircuitBreaker with Cluster for CircuitBreakerFailoverBase.clusterFailover
- improve thread safety with provider initialization

* - formatting

* [automatic failover] Minor optimizations on fast failover (#4277)

* - minor optimizations on fail fast

* -  volatile failfast

* [automatic failover] Implement health check retries (#4273)

* - replace minConsecutiveSuccessCount with numberOfRetries
- add retries into healtCheckImpl
- apply changes to strategy implementations config classes
- fix unit tests

* - fix typo

* - fix failing tests

* - add tests for retry logic

* - formatting

* - format

* - revisit numRetries for healthCheck ,replace with numProbes and implement built in policies
- new types probecontext, ProbePolicy, HealthProbeContext
- add delayer executor pool to healthcheckımpl
-  adjustments on  worker pool of healthCheckImpl for shared use of workers

* - format

* - expand comment with example case

* - drop pooled executor for delays

* - polish

* - fix tests

* - formatting

* - checking failing tests

* - fix test

* - fix flaky tests

* - fix flaky test

* - add tests for builtin probing policies

* - fix flaky test

* [automatic failover] Move failover provider to mcf (#4294)

* - move failover provider to mcf

* - make iterateActiveCluster package private

* [automatic failover]  Add SSL configuration support to LagAwareStrategy  (#4291)

* User-provided ssl config for lag-aware health check

* ssl scenario test for lag-aware healthcheck

* format

* format

* address review comments

  - use getters instead of fields

* [automatic failover] Implement max number of failover attempts (#4293)

* - implement max failover attempt
- add tests

* - fix user receive the intended exception

* -clean+format

* - java doc for exceptions

* format

* - more tests on excaption types in max failover attempts mechanism

* format

* fix failing timing in test

* disable health checks

* rename to switchToHealthyCluster

* format

* - Add dual-threshold (min failures + failure rate) failover to circuit breaker executor
- Map config to resilience4j via CircuitBreakerThresholdsAdapter
- clean up/simplfy config: drop slow-call and window type
- Add thresholdMinNumOfFailures; update some of the defaults
- Update provider to use thresholds adapter
- Update docs; align examples with new defaults
- Add tests for 0% rate, edge thresholds

* polish

* Update src/main/java/redis/clients/jedis/mcf/CircuitBreakerThresholdsAdapter.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* - fix typo

* - fix min total calls calculation

* format

* - merge issues fixed

* fix javadoc ref

* - move threshold evaluations to failoverbase
- simplfy executer and cbfailoverconnprovider
- adjust config getters
- fix failing tests due to COUNT_BASED -> TIME_BASED
- new tests for thresholds calculations and impact on circuit state transitions

* - avoid facilitating actual CBConfig type in tests

* Update src/test/java/redis/clients/jedis/failover/FailoverIntegrationTest.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Trigger workflows

* - evaluate only in failure recorded and failover immediately
- add more test on threshold calculations
- enable command line arg for overwriting surefire.excludedGroups

* format

* check pom

* - fix error prone test

* [automatic failover] Set and test default values for failover config&components (#4298)

* - set & test default values

* - format

* - fix tests failing due to changing defaults

* - fix flaky test

* - remove unnecessary checks for failover attempt

* - clean and trim adapter class
- add docs and more explanantion

* fix javadoc issue

* - switch to all_succes to fix flaky timing

* - fix issue in CircuitBreakerFailoverConnectionProvider

* introduce ReflectionTestUtil

---------

Co-authored-by: Ivo Gaydazhiev <ivo.gaydazhiev@redis.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
atakavci added a commit that referenced this pull request Oct 6, 2025
…4306)

* [automatic failover] Set and test default values for failover config&components (#4298)

* - set & test default values

* - format

* - fix tests failing due to changing defaults

* [automatic failover] Add dual thresholds (min num of failures + failure rate) capabililty to circuit breaker (#4295)

* [automatic failover] Remove the check for 'GenericObjectPool.getNumWaiters()' in 'TrackingConnectionPool' (#4270)

- remove the check for number of waitiers in TrackingConnectionPool

* [automatic failover] Configure max total connections for EchoStrategy (#4268)

- set maxtotal connections for echoStrategy

* [automatic failover] Replace 'CircuitBreaker' with 'Cluster' for 'CircuitBreakerFailoverBase.clusterFailover' (#4275)

* - replace CircuitBreaker with Cluster for CircuitBreakerFailoverBase.clusterFailover
- improve thread safety with provider initialization

* - formatting

* [automatic failover] Minor optimizations on fast failover (#4277)

* - minor optimizations on fail fast

* -  volatile failfast

* [automatic failover] Implement health check retries (#4273)

* - replace minConsecutiveSuccessCount with numberOfRetries
- add retries into healtCheckImpl
- apply changes to strategy implementations config classes
- fix unit tests

* - fix typo

* - fix failing tests

* - add tests for retry logic

* - formatting

* - format

* - revisit numRetries for healthCheck ,replace with numProbes and implement built in policies
- new types probecontext, ProbePolicy, HealthProbeContext
- add delayer executor pool to healthcheckımpl
-  adjustments on  worker pool of healthCheckImpl for shared use of workers

* - format

* - expand comment with example case

* - drop pooled executor for delays

* - polish

* - fix tests

* - formatting

* - checking failing tests

* - fix test

* - fix flaky tests

* - fix flaky test

* - add tests for builtin probing policies

* - fix flaky test

* [automatic failover] Move failover provider to mcf (#4294)

* - move failover provider to mcf

* - make iterateActiveCluster package private

* [automatic failover]  Add SSL configuration support to LagAwareStrategy  (#4291)

* User-provided ssl config for lag-aware health check

* ssl scenario test for lag-aware healthcheck

* format

* format

* address review comments

  - use getters instead of fields

* [automatic failover] Implement max number of failover attempts (#4293)

* - implement max failover attempt
- add tests

* - fix user receive the intended exception

* -clean+format

* - java doc for exceptions

* format

* - more tests on excaption types in max failover attempts mechanism

* format

* fix failing timing in test

* disable health checks

* rename to switchToHealthyCluster

* format

* - Add dual-threshold (min failures + failure rate) failover to circuit breaker executor
- Map config to resilience4j via CircuitBreakerThresholdsAdapter
- clean up/simplfy config: drop slow-call and window type
- Add thresholdMinNumOfFailures; update some of the defaults
- Update provider to use thresholds adapter
- Update docs; align examples with new defaults
- Add tests for 0% rate, edge thresholds

* polish

* Update src/main/java/redis/clients/jedis/mcf/CircuitBreakerThresholdsAdapter.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* - fix typo

* - fix min total calls calculation

* format

* - merge issues fixed

* fix javadoc ref

* - move threshold evaluations to failoverbase
- simplfy executer and cbfailoverconnprovider
- adjust config getters
- fix failing tests due to COUNT_BASED -> TIME_BASED
- new tests for thresholds calculations and impact on circuit state transitions

* - avoid facilitating actual CBConfig type in tests

* Update src/test/java/redis/clients/jedis/failover/FailoverIntegrationTest.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Trigger workflows

* - evaluate only in failure recorded and failover immediately
- add more test on threshold calculations
- enable command line arg for overwriting surefire.excludedGroups

* format

* check pom

* - fix error prone test

* [automatic failover] Set and test default values for failover config&components (#4298)

* - set & test default values

* - format

* - fix tests failing due to changing defaults

* - fix flaky test

* - remove unnecessary checks for failover attempt

* - clean and trim adapter class
- add docs and more explanantion

* fix javadoc issue

* - switch to all_succes to fix flaky timing

* - fix issue in CircuitBreakerFailoverConnectionProvider

* introduce ReflectionTestUtil

---------

Co-authored-by: Ivo Gaydazhiev <ivo.gaydazhiev@redis.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* [automatic failover] feat: Add MultiDbClient with multi-endpoint failover and circuit breaker support (#4300)

* feat: introduce ResilientRedisClient with multi-endpoint failover support

Add ResilientRedisClient extending UnifiedJedis with automatic failover
capabilities across multiple weighted Redis endpoints. Includes circuit
breaker pattern, health monitoring, and configurable retry logic for
high-availability Redis deployments.

* format

* mark ResilientRedisClientTest as integration one

* fix test
  - make sure endpoint is healthy before activating it

* Rename ResilientClient to align with design

 - ResilientClient -> MultiDbClient (builder, tests, etc)

* Rename setActiveEndpoint to setActiveDatabaseEndpoint

* Rename clusterSwitchListener to databaseSwitchListener

* Rename multiClusterConfig to multiDbConfig

* fix api doc's error

* fix compilation error after rebase

* format

* fix example in javadoc

* Update ActiveActiveFailoverTest scenariou test to use builder's

# Conflicts:
#	src/test/java/redis/clients/jedis/scenario/ActiveActiveFailoverTest.java

* rename setActiveDatabaseEndpoint -. setActiveDatabase

* is healthy throw exception if cluster does not exists

* format

* [automatic failover]Use Endpoint interface instead HostAndPort in multi db (#4302)

[clean up] Use Endpoint interface where possible

* - fix variable name type

* fix typo in variable name

* - fix flaky test

---------

Co-authored-by: Ivo Gaydazhiev <ivo.gaydazhiev@redis.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
ggivo added a commit that referenced this pull request Oct 6, 2025
…ure rate) capabililty to circuit breaker (#4295)

* [automatic failover] Remove the check for 'GenericObjectPool.getNumWaiters()' in 'TrackingConnectionPool' (#4270)

- remove the check for number of waitiers in TrackingConnectionPool

* [automatic failover] Configure max total connections for EchoStrategy (#4268)

- set maxtotal connections for echoStrategy

* [automatic failover] Replace 'CircuitBreaker' with 'Cluster' for 'CircuitBreakerFailoverBase.clusterFailover' (#4275)

* - replace CircuitBreaker with Cluster for CircuitBreakerFailoverBase.clusterFailover
- improve thread safety with provider initialization

* - formatting

* [automatic failover] Minor optimizations on fast failover (#4277)

* - minor optimizations on fail fast

* -  volatile failfast

* [automatic failover] Implement health check retries (#4273)

* - replace minConsecutiveSuccessCount with numberOfRetries
- add retries into healtCheckImpl
- apply changes to strategy implementations config classes
- fix unit tests

* - fix typo

* - fix failing tests

* - add tests for retry logic

* - formatting

* - format

* - revisit numRetries for healthCheck ,replace with numProbes and implement built in policies
- new types probecontext, ProbePolicy, HealthProbeContext
- add delayer executor pool to healthcheckımpl
-  adjustments on  worker pool of healthCheckImpl for shared use of workers

* - format

* - expand comment with example case

* - drop pooled executor for delays

* - polish

* - fix tests

* - formatting

* - checking failing tests

* - fix test

* - fix flaky tests

* - fix flaky test

* - add tests for builtin probing policies

* - fix flaky test

* [automatic failover] Move failover provider to mcf (#4294)

* - move failover provider to mcf

* - make iterateActiveCluster package private

* [automatic failover]  Add SSL configuration support to LagAwareStrategy  (#4291)

* User-provided ssl config for lag-aware health check

* ssl scenario test for lag-aware healthcheck

* format

* format

* address review comments

  - use getters instead of fields

* [automatic failover] Implement max number of failover attempts (#4293)

* - implement max failover attempt
- add tests

* - fix user receive the intended exception

* -clean+format

* - java doc for exceptions

* format

* - more tests on excaption types in max failover attempts mechanism

* format

* fix failing timing in test

* disable health checks

* rename to switchToHealthyCluster

* format

* - Add dual-threshold (min failures + failure rate) failover to circuit breaker executor
- Map config to resilience4j via CircuitBreakerThresholdsAdapter
- clean up/simplfy config: drop slow-call and window type
- Add thresholdMinNumOfFailures; update some of the defaults
- Update provider to use thresholds adapter
- Update docs; align examples with new defaults
- Add tests for 0% rate, edge thresholds

* polish

* Update src/main/java/redis/clients/jedis/mcf/CircuitBreakerThresholdsAdapter.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* - fix typo

* - fix min total calls calculation

* format

* - merge issues fixed

* fix javadoc ref

* - move threshold evaluations to failoverbase
- simplfy executer and cbfailoverconnprovider
- adjust config getters
- fix failing tests due to COUNT_BASED -> TIME_BASED
- new tests for thresholds calculations and impact on circuit state transitions

* - avoid facilitating actual CBConfig type in tests

* Update src/test/java/redis/clients/jedis/failover/FailoverIntegrationTest.java

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* Trigger workflows

* - evaluate only in failure recorded and failover immediately
- add more test on threshold calculations
- enable command line arg for overwriting surefire.excludedGroups

* format

* check pom

* - fix error prone test

* [automatic failover] Set and test default values for failover config&components (#4298)

* - set & test default values

* - format

* - fix tests failing due to changing defaults

* - fix flaky test

* - remove unnecessary checks for failover attempt

* - clean and trim adapter class
- add docs and more explanantion

* fix javadoc issue

* - switch to all_succes to fix flaky timing

* - fix issue in CircuitBreakerFailoverConnectionProvider

* introduce ReflectionTestUtil

---------

Co-authored-by: Ivo Gaydazhiev <ivo.gaydazhiev@redis.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
@ggivo ggivo deleted the topic/ggivo/active-active-lagware-ssl-config branch October 10, 2025 06:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants