in src/main/java/build/buildfarm/common/redis/RedisClient.java [113:157]
public <T> T call(JedisContext<T> withJedis) throws IOException {
throwIfClosed();
try {
try {
return withJedis.run(jedis);
} catch (JedisDataException e) {
if (e.getMessage().startsWith(MISCONF_RESPONSE)) {
throw new JedisMisconfigurationException(e.getMessage());
}
throw e;
}
} catch (JedisMisconfigurationException | JedisNoReachableClusterNodeException e) {
// In regards to a Jedis misconfiguration,
// the backplane is configured not to accept writes currently
// as a result of an error. The error is meant to indicate
// that substantial resources were unavailable.
// we must throw an IOException which indicates as much
// this looks simply to me like a good opportunity to use UNAVAILABLE
// we are technically not at RESOURCE_EXHAUSTED, this is a
// persistent state which can exist long past the error
throw new IOException(Status.UNAVAILABLE.withCause(e).asRuntimeException());
} catch (JedisConnectionException e) {
if ((e.getMessage() != null && e.getMessage().equals("Unexpected end of stream."))
|| e.getCause() instanceof ConnectException) {
throw new IOException(Status.UNAVAILABLE.withCause(e).asRuntimeException());
}
Throwable cause = e;
Status status = Status.UNKNOWN;
while (status.getCode() == Code.UNKNOWN && cause != null) {
String message = cause.getMessage() == null ? "" : cause.getMessage();
if ((cause instanceof SocketException && cause.getMessage().equals("Connection reset"))
|| cause instanceof ConnectException
|| message.equals("Unexpected end of stream.")) {
status = Status.UNAVAILABLE;
} else if (cause instanceof SocketTimeoutException) {
status = Status.DEADLINE_EXCEEDED;
} else if (cause instanceof IOException) {
throw (IOException) cause;
} else {
cause = cause.getCause();
}
}
throw new IOException(status.withCause(cause == null ? e : cause).asRuntimeException());
}
}