redis/jedis · warning

String.valueOf(event)

Error message

String.valueOf(event)

What it means

In MultiDbConnectionProvider.addDatabaseInternal, a Resilience4j Retry EventPublisher is wired so retry events are logged: onRetry logs at WARN and onError logs at ERROR, both via String.valueOf(event). This line is the source of the log text, not an exception — it surfaces retry attempts/failures against a database endpoint.

Solutions

  1. Check the endpoint named in 'database:<endpoint>' — retries usually mean that Redis is down or slow; verify connectivity.
  2. Tune RetryConfig (maxAttempts, waitDuration) in MultiDbClient builder to balance failover speed vs. retry volume.
  3. Verify failover is configured (active/passive) so traffic moves to a healthy database after retries fail.
  4. Inspect paired circuit-breaker events in the same logs to see whether the endpoint was opened.
Defensive patterns

Strategy: try-catch

Validate before calling

// before building the client, verify endpoints are reachable
for (HostAndPort ep : endpoints) {
  try (Socket s = new Socket()) {
    s.connect(new InetSocketAddress(ep.getHost(), ep.getPort()), 2000);
  } catch (IOException e) {
    log.warn("Endpoint unreachable, expect retries: " + ep);
  }
}

Try / catch

// these are log events, not exceptions; monitor them instead
retryPublisher.onRetry(e -> metrics.increment("db.retry", tags));
retryPublisher.onError(e -> alerting.fire("db.retry.exhausted", e));

Prevention

When it happens

Trigger: Any command execution against the configured database that Resilience4j retries — each retry emits a RetryEvent.OnRetry log, and exhausted/failed retries emit RetryEvent.OnError logs.

Common situations: Failover scenarios where the active database endpoint is down or timing out and the provider retries before/while switching databases; transient network errors under maxRetryAttempts/-1 multi-db configuration.

Related errors


AI-assisted analysis of redis/jedis@6dac31d4c2 (2026-09-08). Data as JSON: /api/errors/92015b89911b8471. Report an issue: GitHub.

Appendix: source

Thrown at src/main/java/redis/clients/jedis/mcf/MultiDbConnectionProvider.java:332

    }
  }

  /**
   * Internal method to add a database configuration. This method is not thread-safe and should be
   * called within appropriate locks.
   */
  private void addDatabaseInternal(MultiDbConfig multiDbConfig, DatabaseConfig config) {
    if (databaseMap.containsKey(config.getEndpoint())) {
      throw new JedisValidationException(
          "Endpoint " + config.getEndpoint() + " already exists in the provider");
    }

    String databaseId = "database:" + config.getEndpoint();

    Retry retry = RetryRegistry.of(retryConfig).retry(databaseId);

    Retry.EventPublisher retryPublisher = retry.getEventPublisher();
    retryPublisher.onRetry(event -> log.warn(String.valueOf(event)));
    retryPublisher.onError(event -> log.error(String.valueOf(event)));

    CircuitBreaker circuitBreaker = CircuitBreakerRegistry.of(circuitBreakerConfig)
        .circuitBreaker(databaseId);

    CircuitBreaker.EventPublisher circuitBreakerEventPublisher = circuitBreaker.getEventPublisher();
    circuitBreakerEventPublisher.onCallNotPermitted(event -> log.error(String.valueOf(event)));
    circuitBreakerEventPublisher.onError(event -> log.error(String.valueOf(event)));
    circuitBreakerEventPublisher.onFailureRateExceeded(event -> log.error(String.valueOf(event)));
    circuitBreakerEventPublisher.onSlowCallRateExceeded(event -> log.error(String.valueOf(event)));

    TrackingConnectionPool pool = TrackingConnectionPool.builder()
        .hostAndPort(hostPort(config.getEndpoint())).clientConfig(config.getJedisClientConfig())
        .maintenanceNotificationsConfig(config.getMaintenanceNotificationsConfig())
        .poolConfig(config.getConnectionPoolConfig()).cache(cache).build();

    Database database;
    StrategySupplier strategySupplier = config.getHealthCheckStrategySupplier();

View on GitHub (pinned to 6dac31d4c2)