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

  1. No action required if this is an expected failback — it confirms the original endpoint is healthy again.
  2. If the log appears frequently, investigate endpoint stability (network jitter, latency spikes) that flaps the circuit breaker.
  3. 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

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


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)