redis/jedis · info
Database/database endpoint
Error message
Database/database endpoint '{}' successfully closed its circuit breaker What it means
This is a warning logged by MultiDbConnectionProvider during a database failover/switch: the target database being activated is the same object as the currently active one, meaning its circuit breaker transitioned from open back to closed (recovered), so the provider re-selects it. No exception is thrown; it informs operators that the original endpoint has been re-promoted after recovery.
Solutions
- No action required if this is an expected failback — it confirms the original endpoint is healthy again.
- If the log appears frequently, investigate endpoint stability (network jitter, latency spikes) that flaps the circuit breaker.
- Tune the circuit breaker / health check policy (num probes, intervals) so borderline endpoints do not oscillate open/closed.
Defensive patterns
Strategy: try-catch
Try / catch
// Informational log, not thrown; optionally observe failback events
try {
runWorkload();
} catch (redis.clients.jedis.exceptions.JedisException e) {
// transient breaker transitions may surface here; retry with backoff
} Prevention
- Treat this log as confirmation of healthy failback; no remediation needed.
- If it flaps, investigate endpoint stability rather than silencing the log.
- Tune breaker thresholds/probe counts to match your endpoint's normal latency variability.
- Keep MultiDbConnectionProvider database list current with actual cluster topology.
When it happens
Trigger: The provider's switch/close path runs with validateTargetConnection succeeding and activeDatabase == database — i.e. the health-checked endpoint that just recovered is the one already selected, so the switch is effectively a circuit-breaker close on the original database.
Common situations: A failover moved traffic away from a primary and the primary later recovered, so failback re-closes its breaker; repeated open/close flapping of a circuit breaker on a flaky endpoint; graceful shutdown/failover tests re-selecting the same database.
Understand the failure class
Background: "Invalid state transition" errors: "status must be X, actually Y", "already rejected/charging/uninstalled", "cannot ... while running" — what they mean when a library rejects your call — this error's family across 31 libraries.
Related errors
- Database/database endpoint successfully updated from
- Error while checking availability
- Database can not be removed due to no healthy database…
- failed to connect. Please check configuration and try again.
- Active database has changed since transaction started
AI-assisted analysis of redis/jedis@6dac31d4c2 (2026-09-08).
Data as JSON: /api/errors/20fdf9666faabd88.
Report an issue: GitHub.
Appendix: source
Thrown at src/main/java/redis/clients/jedis/mcf/MultiDbConnectionProvider.java:720
private boolean setActiveDatabase(Database database, boolean validateConnection) {
// Database database = databaseEntry.getValue();
// Field-level synchronization is used to avoid the edge case in which
// setActiveDatabase() is called at the same time
activeDatabaseChangeLock.lock();
Database oldDatabase;
try {
// Allows an attempt to reset the current database from a FORCED_OPEN to CLOSED state in the
// event that no failover is possible
if (activeDatabase == database && !database.isCBForcedOpen()) return false;
if (validateConnection) validateTargetConnection(database);
String originalDatabaseName = getDatabaseCircuitBreaker().getName();
if (activeDatabase == database)
log.warn("Database/database endpoint '{}' successfully closed its circuit breaker",
originalDatabaseName);
else log.warn("Database/database endpoint successfully updated from '{}' to '{}'",
originalDatabaseName, database.circuitBreaker.getName());
oldDatabase = activeDatabase;
activeDatabase = database;
} finally {
activeDatabaseChangeLock.unlock();
}
boolean switched = oldDatabase != database;
if (switched && this.multiDbConfig.isFastFailover()) {
log.info("Forcing disconnect of all active connections in old database: {}",
oldDatabase.circuitBreaker.getName());
oldDatabase.forceDisconnect();
log.info("Disconnected all active connections in old database: {}",
oldDatabase.circuitBreaker.getName());
}
return switched;View on GitHub (pinned to 6dac31d4c2)