protected <T, C extends Connection<T>> T acquire(C connection) { String errorMessage = String.format("(%s) error acquiring %s", toString(), connection); for (int i = 0; i < sshRetries; i++) { try { connection.clear(); logger.debug(">> (%s) acquiring %s", toString(), connection); T returnVal = connection.create(); logger.debug("<< (%s) acquired %s", toString(), returnVal); return returnVal; } catch (Exception from) { try { connection.clear(); } catch (Exception e1) { logger.warn(from, "<< (%s) error closing connection", toString()); } if (i + 1 == sshRetries) { logger.error(from, "<< " + errorMessage + ": out of retries %d", sshRetries); throw propagate(from, errorMessage); } else if (Throwables2.getFirstThrowableOfType(from, IllegalStateException.class) != null) { logger.warn(from, "<< " + errorMessage + ": " + from.getMessage()); disconnect(); backoffForAttempt(i + 1, errorMessage + ": " + from.getMessage()); connect(); continue; } else if (shouldRetry(from)) { logger.warn(from, "<< " + errorMessage + ": " + from.getMessage()); backoffForAttempt(i + 1, errorMessage + ": " + from.getMessage()); continue; } else { logger.error(from, "<< " + errorMessage + ": exception not retryable"); throw propagate(from, errorMessage); } } } assert false : "should not reach here"; return null; }