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
- Check the endpoint named in 'database:<endpoint>' — retries usually mean that Redis is down or slow; verify connectivity.
- Tune RetryConfig (maxAttempts, waitDuration) in MultiDbClient builder to balance failover speed vs. retry volume.
- Verify failover is configured (active/passive) so traffic moves to a healthy database after retries fail.
- 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
- Monitor the 'database:<endpoint>' WARN/ERROR logs as an endpoint-health signal.
- Configure health checks and failover so retries hand off to a healthy database.
- Tune RetryConfig maxAttempts/waitDuration to bound retry storms.
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
- Cluster retry deadline exceeded.
- Database/database endpoint
- Database/database endpoint successfully updated from
- Max attempts must be positive for cluster mode
- Retry deadline exceeded.
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)